Commit graph

301 commits

Author SHA1 Message Date
charliesome
1546fb6c00 * insns.def: unify ic_constant_serial and ic_class_serial into one field
ic_serial. This is possible because these fields are only ever used
  exclusively with each other.

* insns.def: ditto
* vm_core.h: ditto
* vm_insnhelper.c: ditto

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43596 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-11-09 03:46:48 +00:00
charliesome
8b0771b014 * class.c: unify names of vm state version counters to 'serial'.
This includes renaming 'vm_state_version_t' to 'rb_serial_t',
  'method_state' to 'method_serial', 'seq' to 'class_serial',
  'vmstat' to 'constant_serial', etc.

* insns.def: ditto
* internal.h: ditto
* vm.c: ditto
* vm_core.h: ditto
* vm_insnhelper.c: ditto
* vm_insnhelper.h: ditto
* vm_method.c: ditto

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43595 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-11-09 03:34:49 +00:00
charliesome
7fafa8f376 * insns.def, vm.c, vm_insnhelper.c, vm_insnhelper.h, vm_method.c: split
ruby_vm_global_state_version into two separate counters - one for the
  global method state and one for the global constant state. This means
  changes to constants do not affect method caches, and changes to
  methods do not affect constant caches. In particular, this means
  inclusions of modules containing constants no longer globally
  invalidate the method cache.

* class.c, eval.c, include/ruby/intern.h, insns.def, vm.c, vm_method.c:
  rename rb_clear_cache_by_class to rb_clear_method_cache_by_class

* class.c, include/ruby/intern.h, variable.c, vm_method.c: add
  rb_clear_constant_cache

* compile.c, vm_core.h, vm_insnhelper.c: rename vmstat field in
  rb_call_info_struct to method_state

* vm_method.c: rename vmstat field in struct cache_entry to method_state

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43455 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-10-29 00:52:38 +00:00
shugo
f8e0e1647e * vm_insnhelper.c (vm_call_method): set ci->me to 0 when the
original method of a refined method is undef to avoid SEGV.

* vm_method.c (rb_method_entry_without_refinements): return 0 when
  the original method of a refined method is undef to avoid SEGV.

* test/ruby/test_refinement.rb: related test.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43334 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-10-17 08:44:26 +00:00
ko1
40b1aa9adf * proc.c: catch up last commit.
Type of return value of rb_iseq_first_lineno() is now VALUE.
* vm_insnhelper.c (argument_error): ditto.
* vm_method.c (rb_method_entry_make): ditto.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43163 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-10-07 05:31:47 +00:00
ko1
12f368d6a4 * iseq.c, internal.h: change to public (but internal) functions
* VALUE rb_iseq_path(VALUE iseqval);
* VALUE rb_iseq_absolute_path(VALUE iseqval);
* VALUE rb_iseq_label(VALUE iseqval);
* VALUE rb_iseq_base_label(VALUE iseqval);
* VALUE rb_iseq_first_lineno(VALUE iseqval);
  And new (temporary) function:
* VALUE rb_iseq_klass(VALUE iseqval);
* iseq.c. vm_core.h (int rb_iseq_first_lineno): remove
  function `int rb_iseq_first_lineno(const rb_iseq_t *iseq)'.
  Use `VALUE rb_iseq_first_lineno(VALUE iseqval)' instead.
* proc.c. vm_insnhelper.c, vm_method.c: catch up this change.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43162 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-10-07 05:12:08 +00:00
ktsj
94f5787130 * vm_insnhelper.c (vm_callee_setup_arg_complex, vm_yield_setup_block_args):
clear keyword arguments to prevent GC bug which occurs
  while marking VM stack.
  [ruby-dev:47729] [Bug #8964]

* test/ruby/test_keyword.rb: tests for the above.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43081 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-09-29 09:50:24 +00:00
ko1
dc626dbab3 * include/ruby/ruby.h: rename RARRAY_RAWPTR() to RARRAY_CONST_PTR().
RARRAY_RAWPTR(ary) returns (const VALUE *) type pointer and
  usecase of this macro is not acquire raw pointer, but acquire
  read-only pointer. So we rename to better name.
  RSTRUCT_RAWPTR() is also renamed to RSTRUCT_CONST_PTR()
  (I expect that nobody use it).
* array.c, compile.c, cont.c, enumerator.c, gc.c, proc.c, random.c,
  string.c, struct.c, thread.c, vm_eval.c, vm_insnhelper.c:
  catch up this change.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43043 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-09-25 08:24:34 +00:00
ktsj
0b39c8a08d * vm_insnhelper.c (vm_make_proc_with_iseq): fix bug message.
This is follow up to changes in r42637.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43014 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-09-22 11:57:50 +00:00
nobu
f3c33344a4 vm_insnhelper.c: debugging
* vm_insnhelper.c (vm_method_cfunc_entry): check method type if
  debugging.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42894 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-09-09 05:17:19 +00:00
nobu
c2b4d38165 eval.c, vm_insnhelper.c: adjust style
* eval.c (rb_refinement_module_get_refined_class): adjust style.

* vm_insnhelper.c (vm_profile_show_result): ditto.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42893 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-09-09 05:17:17 +00:00
charliesome
66915c5077 * vm_eval.c (vm_call0): fix prototype, the id parameter should be of
type ID, not VALUE

* vm_insnhelper.c (check_match): the rb_funcall family of functions
  does not care about refinements. We need to use
  rb_method_entry_with_refinements instead to call === with
  refinements. Thanks to Jon Conley for reporting this bug.
  [ruby-core:57051] [Bug #8872]

* test/ruby/test_refinement.rb: add test

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42869 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-09-07 06:44:31 +00:00
charliesome
ed0e42c30b * vm_insnhelper.c (vm_getivar): use class sequence to check class
identity, instead of pointer + vm state

* vm_insnhelper.c (vm_setivar): ditto

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42841 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-09-05 01:44:36 +00:00
charliesome
1abfdb4585 * vm_insnhelper.c (vm_search_method): no need to check klass == ci->klass
in method cache guard - class sequence number has the same uniqueness
  guarantees

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42836 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-09-04 16:53:20 +00:00
charliesome
2f522b9cc6 * class.c, compile.c, eval.c, gc.h, insns.def, internal.h, method.h,
variable.c, vm.c, vm_core.c, vm_insnhelper.c, vm_insnhelper.h,
  vm_method.c: Implement class hierarchy method cache invalidation.

  [ruby-core:55053] [Feature #8426] [GH-387]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42822 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-09-04 05:25:06 +00:00
ko1
41234c5ca3 * vm_insnhelper.c (vm_search_super_method): use ci->argc instead of
ci->orig_argc. ci->argc can be changed by splat arguments.
  [ruby-list:49575]
  This fix should be applied to Ruby 2.0.0 seriese.
* test/ruby/test_super.rb: add a test for above.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42782 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-09-02 18:21:13 +00:00
nobu
74b85189b8 vm_insnhelper.c: fix zsuper in prepended
* vm_insnhelper.c (vm_call_method): a method entry refers the based
  class/module, so should search superclass from the origin i-class
  where the entry belongs to, to get rid of infinite loop when zsuper
  in a prepended class/module.  [ruby-core:54105] [Bug #8238]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42724 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-08-29 08:03:23 +00:00
nobu
f25daa2541 array.c: optimized equality
* array.c (rb_ary_index, rb_ary_rindex): use optimized equality to
  improve performance.  [Feature #8820]
* vm_insnhelper.c (rb_equal_opt): optimized equality function.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42704 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-08-27 07:46:08 +00:00
nobu
f01cef2050 vm_insnhelper.c: reduce duplication
* vm_insnhelper.c (vm_search_method): reduce duplicated code for the
  case cache does not hit.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42703 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-08-27 07:11:49 +00:00
nobu
b3392daaad vm_insnhelper.h: RBASIC_CLASS
* vm_insnhelper.c (opt_eq_func): use RBASIC_CLASS() instead of HEAP_CLASS_OF().
* insns.def (opt_plus, opt_minus, opt_mult, opt_div, opt_mod, opt_lt),
  (opt_gt, opt_ltlt, opt_aref, opt_aset, opt_length, opt_size),
  (opt_empty_p, opt_succ): ditto.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42702 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-08-27 07:11:10 +00:00
ko1
30b1947df2 * insns.def: fix regexp's once option behavior.
fix [ruby-trunk - Bug #6701]
* insns.def: remove `onceinlinecache' and introduce `once' instruction.
  `once' doesn't use `setinlinecache' insn any more.
* vm_core.h: `union iseq_inline_storage_entry' to store once data.
* compile.c: catch up above changes.
* iseq.c: ditto.
* vm.c, vm_insnhelper.c: ditto. fix `m_core_set_postexe()' which
  is depend on `onceinlinecache' insn.
* test/ruby/test_regexp.rb: add tests.
* iseq.c: ISEQ_MINOR_VERSION to 1 (should increment major?)



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42637 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-08-20 17:41:13 +00:00
ktsj
214cbdc943 * vm_insnhelper.c (vm_invoke_block): returning from lambda proc
now always exits from the Proc. [ruby-core:56193] [Feature #8693]

* NEWS, test/ruby/test_lambda.rb: ditto. Patch by nobu.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42455 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-08-09 01:49:38 +00:00
ko1
b7bc4706fa * vm_insnhelper.c (vm_push_frame): change type of stack_max to size_t.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42401 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-08-06 08:59:24 +00:00
ko1
22468a4f92 * vm_insnhelper.c (vm_push_frame): fix stack overflow check codes.
Stack overflow check should be done *after* pushing a stack frame.
  However, some stack overflow checking codes checked *before*
  pushing a stack frame with iseq->stack_max.
  To solve this problem, add a new parameter `stack_max' to specify
  a possible consuming stack size.
* vm_core.h (CHECK_VM_STACK_OVERFLOW0): add to share the stack overflow
  checking code.
* insns.def: catch up this change.
* vm.c, vm_eval.c: ditto.
* test/ruby/test_exception.rb: add a stack overflow test.
  This code is reported by nobu.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42398 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-08-06 08:33:05 +00:00
ko1
d9a556548e * vm_insnhelper.c (vm_expandarray): use RARRAY_RAWPTR() instead of
RARRAY_PTR() because there is no new reference.
* vm_insnhelper.c (vm_caller_setup_args): ditto.
* vm_insnhelper.c (vm_yield_setup_block_args): ditto.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42152 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-07-24 09:57:49 +00:00
charliesome
65dc35a582 * vm_insnhelper.c (vm_call_method): ensure methods of type
VM_METHOD_TYPE_ATTR_SET are called with 1 argument

* test/ruby/test_module.rb (class TestModule): add test

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41389 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-06-18 14:01:32 +00:00
ktsj
62bd8db198 * include/ruby/ruby.h, vm_eval.c (rb_funcall_with_block):
new function to invoke a method with a block passed
  as an argument.

* string.c (sym_call): use the above function to avoid
  a block sharing. [ruby-dev:47438] [Bug #8531]

* vm_insnhelper.c (vm_yield_with_cfunc): don't set block
  in the frame.

* test/ruby/test_symbol.rb (TestSymbol#test_block_given_to_proc):
  run related tests.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41360 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-06-17 12:47:26 +00:00
shugo
1f828497d1 * safe.c (rb_set_safe_level, safe_setter): raise an ArgumentError
when $SAFE is set to 4.  $SAFE=4 is now obsolete.
  [ruby-core:55222] [Feature #8468]

* object.c (rb_obj_untrusted, rb_obj_untrust, rb_obj_trust):
  Kernel#untrusted?, untrust, and trust are now deprecated.
  Their behavior is same as tainted?, taint, and untaint,
  respectively.

* include/ruby/ruby.h (OBJ_UNTRUSTED, OBJ_UNTRUST): OBJ_UNTRUSTED()
  and OBJ_UNTRUST() are aliases of OBJ_TAINTED() and OBJ_TAINT(),
  respectively.

* array.c, class.c, debug.c, dir.c, encoding.c, error.c, eval.c,
  ext/curses/curses.c, ext/dbm/dbm.c, ext/dl/cfunc.c,
  ext/dl/cptr.c, ext/dl/dl.c, ext/etc/etc.c, ext/fiddle/fiddle.c,
  ext/fiddle/pointer.c, ext/gdbm/gdbm.c, ext/readline/readline.c,
  ext/sdbm/init.c, ext/socket/ancdata.c, ext/socket/basicsocket.c,
  ext/socket/socket.c, ext/socket/udpsocket.c,
  ext/stringio/stringio.c, ext/syslog/syslog.c, ext/tk/tcltklib.c,
  ext/win32ole/win32ole.c, file.c, gc.c, hash.c, io.c, iseq.c,
  load.c, marshal.c, object.c, proc.c, process.c, random.c, re.c,
  safe.c, string.c, thread.c, transcode.c, variable.c,
  vm_insnhelper.c, vm_method.c, vm_trace.c: remove code for
  $SAFE=4.

* test/dl/test_dl2.rb, test/erb/test_erb.rb,
  test/readline/test_readline.rb,
  test/readline/test_readline_history.rb, test/ruby/test_alias.rb,
  test/ruby/test_array.rb, test/ruby/test_dir.rb,
  test/ruby/test_encoding.rb, test/ruby/test_env.rb,
  test/ruby/test_eval.rb, test/ruby/test_exception.rb,
  test/ruby/test_file_exhaustive.rb, test/ruby/test_hash.rb,
  test/ruby/test_io.rb, test/ruby/test_method.rb,
  test/ruby/test_module.rb, test/ruby/test_object.rb,
  test/ruby/test_pack.rb, test/ruby/test_rand.rb,
  test/ruby/test_regexp.rb, test/ruby/test_settracefunc.rb,
  test/ruby/test_struct.rb, test/ruby/test_thread.rb,
  test/ruby/test_time.rb: remove tests for $SAFE=4.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41259 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-06-12 14:20:51 +00:00
naruse
dd87e46310 Add more comment about r41041
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41057 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-06-04 03:47:02 +00:00
nobu
c120db4547 * vm_insnhelper.c (vm_yield_setup_block_args): add comment for r41041.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41045 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-06-03 08:16:27 +00:00
naruse
284d746392 * vm_insnhelper.c (vm_yield_setup_block_args): partially revert r41019.
The code is not useless.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41041 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-06-02 18:44:33 +00:00
nobu
06c7ede259 vm_insnhelper.c: extract keyword arguments after splat
* vm_insnhelper.c (vm_yield_setup_block_args): split single parameter
  if any keyword arguments exist, and then extract keyword arguments.
  [ruby-core:55203] [Bug #8463]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41020 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-06-01 08:21:39 +00:00
nobu
767c502252 vm_insnhelper.c: add comments
* vm_insnhelper.c (vm_yield_setup_block_args): break a long line and
  add comments.  remove useless code.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41019 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-06-01 08:21:37 +00:00
mame
6f9f8d2ef7 * vm_insnhelper.c (vm_callee_setup_keyword_arg,
vm_callee_setup_arg_complex): consider a hash argument for keyword
  only when the number of arguments is more than the expected
  mandatory parameters.  [ruby-core:53199] [ruby-trunk - Bug #8040]

* test/ruby/test_keyword.rb: update a test for above.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40992 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-05-30 10:50:41 +00:00
nobu
75b9218f25 vm_insnhelper.c: suppress warning
* vm_insnhelper.c (vm_callee_setup_keyword_arg): suppress
  -Wsign-compare warning.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40955 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-05-27 08:33:44 +00:00
ko1
c4c821a7d7 * hash.c (rb_hash_tbl_raw), internal.h: added.
Returns st_table without shading hash.
* array.c: use rb_hash_tbl_raw() for read-only purpose.
* compile.c (iseq_compile_each): ditto.
* gc.c (count_objects): ditto.
* insns.def: ditto.
* process.c: ditto.
* thread.c (clear_coverage): ditto.
* vm_insnhelper.c: ditto.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40937 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-05-26 16:19:04 +00:00
ko1
4f401816ff * gc.c: support RGENGC. [ruby-trunk - Feature #8339]
See this ticet about RGENGC.
* gc.c: Add several flags:
* RGENGC_DEBUG: if >0, then prints debug information.
* RGENGC_CHECK_MODE: if >0, add assertions.
* RGENGC_PROFILE: if >0, add profiling features.
  check GC.stat and GC::Profiler.
* include/ruby/ruby.h: disable RGENGC by default (USE_RGENGC == 0).
* array.c: add write barriers for T_ARRAY and generate sunny objects.
* include/ruby/ruby.h (RARRAY_PTR_USE): added. Use this macro if
  you want to access raw pointers. If you modify the contents which
  pointer pointed, then you need to care write barrier.
* bignum.c, marshal.c, random.c: generate T_BIGNUM sunny objects.
* complex.c, include/ruby/ruby.h: add write barriers for T_COMPLEX
  and generate sunny objects.
* rational.c (nurat_s_new_internal), include/ruby/ruby.h: add write
  barriers for T_RATIONAL and generate sunny objects.
* internal.h: add write barriers for RBasic::klass.
* numeric.c (rb_float_new_in_heap): generate sunny T_FLOAT objects.
* object.c (rb_class_allocate_instance), range.c:
  generate sunny T_OBJECT objects.
* string.c: add write barriers for T_STRING and generate sunny objects.
* variable.c: add write barriers for ivars.
* vm_insnhelper.c (vm_setivar): ditto.
* include/ruby/ruby.h, debug.c: use two flags
  FL_WB_PROTECTED and FL_OLDGEN.
* node.h (NODE_FL_CREF_PUSHED_BY_EVAL, NODE_FL_CREF_OMOD_SHARED):
  move flag bits.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40703 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-05-13 18:07:47 +00:00
nobu
babae04960 insns.def: refactor by wanabe
* insns.def (defined): use vm_search_superclass() like as normal super
  call.  based on a patch <https://gist.github.com/wanabe/5520026> by
  wanabe.
* vm_insnhelper.c (vm_search_superclass): return error but not raise
  exceptions.
* vm_insnhelper.c (vm_search_super_method): check the result of
  vm_search_superclass and raise execptions on error.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40584 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-05-05 09:57:02 +00:00
nobu
2674f9a815 vm_insnhelper.c: non-symbol key
* vm_insnhelper.c (vm_callee_setup_keyword_arg): non-symbol key is not
  a keyword argument, keep it as an positional argument.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40260 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-04-12 06:21:35 +00:00
nobu
79f7dfabb6 vm_insnhelper.c: check required kwarg with resthash
* vm_insnhelper.c (vm_callee_setup_keyword_arg): should check required
  keyword arguments even if rest hash is defined.  [ruby-core:53608]
  [Bug #8139]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39869 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-03-21 19:51:19 +00:00
nobu
34a95669da required keyword arguments
* compile.c (iseq_set_arguments, iseq_compile_each): support required
  keyword arguments.   [ruby-core:51454] [Feature #7701]
* iseq.c (rb_iseq_parameters): ditto.
* parse.y (f_kw, f_block_kw): ditto.  this syntax is still
  experimental, the notation may change.
* vm_core.h (rb_iseq_struct): ditto.
* vm_insnhelper.c (vm_callee_setup_keyword_arg): ditto.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39735 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-03-12 13:20:50 +00:00
nobu
ac94eb1a91 vm_insnhelper.c: compare with me in method top cfp
* vm_insnhelper.c (vm_call_method): block level control frame does not
  have method entry, so obtain the method entry from method top-level
  control frame to be compared with refined method entry.
  [ruby-core:52750] [Bug #7925]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39451 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-02-24 04:36:00 +00:00
marcandre
6851ad4756 * vm_insnhelper.c: attr_writer should return its argument [Bug #7773]
* test/ruby/test_basicinstructions.rb: Test for above

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39121 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-02-06 17:31:22 +00:00
shugo
4707fdea01 * vm_insnhelper.c (vm_search_super_method): raise a TypeError
instead of a NotImplementError if self is not an instance of the
  current class.  [ruby-dev:39772] [Bug #2402]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38761 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-01-10 07:51:35 +00:00
nobu
8f1be27017 vm_insnhelper.c: keyrest should not overwrite rest arg
* vm_insnhelper.c (vm_callee_setup_arg_complex, vm_yield_setup_block_args):
  set keyrest hash after making rest array, so that the last element
  will not be overwritten.  [ruby-core:51278] [Bug #7665]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38719 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-01-07 03:09:28 +00:00
ktsj
371c07f2a2 * vm_insnhelper.c: set keyword hash on Proc/block calls.
[ruby-core:51172] [Bug #7630]

* test/ruby/test_keyword.rb: add tests for above.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38657 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-30 02:06:28 +00:00
nobu
e878df745c use RB_TYPE_P
* enumerator.c (enumerator_initialize), eval.c (rb_using_refinement),
  (add_activated_refinement), numeric.c (num_interval_step_size),
  parse.y (arg, match_op_gen, cond0), range.c (range_bsearch),
  vm_insnhelper.c (vm_get_iclass): use RB_TYPE_P() to optimize.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38653 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-29 12:22:01 +00:00
nobu
0ea1e43174 vm_insnhelper.c: no splat single opt arg
* vm_insnhelper.c (vm_yield_setup_block_args): pass single argument to
  single optional parameter unchanged without splatting.  [Bug #7621]
  [ruby-dev:46801]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38639 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-28 02:50:57 +00:00
ko1
270fbd9c05 * vm_core.h, eval_intern.h (CHECK_STACK_OVERFLOW): move
CHECK_STACK_OVERFLOW() to vm_core.h and rename to
  CHECK_VM_STACK_OVERFLOW().
  This change is only move and rename.
* tool/instruction.rb: catch up above changes.
* vm.c, vm_insnhelper.c: ditto.
* vm_insnhelper.c (vm_stackoverflow): add a function to unify
  raising vm stackoverflow exception.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38594 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-25 09:57:07 +00:00
ko1
256c5f2577 * method.h: remove `VM_METHOD_TYPE_CFUNC_FRAMELESS' method type.
This method type is for optimized CFUNC such as Fixnum#+ and so on.
  This feature is half-baked and no way to use them.
  [Background]
  Now, VM has opt_plus instructions to optimize `+' methods for
  some Classes (such as Fixnum, Float (flonum)). We call this
  type of instructions as `specialized instructions'.
  This simple technique improve simple program dramatically.
  However, we can make specialized instructions for only several
  types (classes) and selectors (method names) because a large
  instruction will be slow. In other words, this technique has no
  extensibility.
  To overcome this problem, VM_METHOD_TYPE_CFUNC_FRAMELESS was
  introduced (r37198). This type is a variant of CFUNC, but called
  their functiions directly without building a method frame.
  Any CFUNC method can be defined as frameless methods if a method
  is not needed to make method frame. Frameless methods are faster
  as specialized instructions (a bit slower, but no need to care).
  No problem described at
  http://charlie.bz/blog/why-do-singleton-methods-make-ruby-slow
  because this technique doesn't see class, but see method body
  itself. Alias is also no problem.
  [Problem]
  However, we can't set frameless method type for polymorphic methods
  such as Array#[]. Necessity for method frame depends on which
  parameter type. For example, Fixnum#+ needs method frame if
  coerce is needed. Current VM_METHOD_TYPE_CFUNC_FRAMELESS is not
  flexible and need more tuning to introduce it.
  Expected behavior of frameless method type may be:
  result = optimized_cfunc(params); /* call optimized cfunc */
  if (result == Qundef) { result = normal_cfunc(); }
  This is why I say this feature is half-baked.
  We need to learn primitive method in Smalltalk more.
  (I heard this name at RubyConf Taiwan this month. Thanks!)
  [Conclusion]
  Nobody may use this feature and there is no compatibility issue.
  This feature goes to next minor (2.1?).
* proc.c (rb_method_entry_arity): ditto.
* vm_eval.c, vm_insnhelper.c, vm_method.c: ditto.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38431 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-17 22:04:12 +00:00