From: SASADA Koichi Date: 2010-12-18T18:21:23+09:00 Subject: [ruby-dev:42790] Re: [ruby-changes:18222] Ruby:r30243 (trunk): * compile.c (setup_args), vm.c (invoke_block_from_c),  ささだです.  これはさっきの最適化のために入れた変更だと思うんですが,trivial な最適 化のために恒常的なチェックを加える(遅くする)のは反対です. (2010/12/18 16:02), nobu wrote: > nobu 2010-12-18 16:02:35 +0900 (Sat, 18 Dec 2010) > > New Revision: 30243 > > http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=30243 > > Log: > * compile.c (setup_args), vm.c (invoke_block_from_c), > vm_insnhelper.c (caller_setup_args): fix of r30241. lambda block > shoud check argument number. > > Modified files: > trunk/ChangeLog > trunk/compile.c > trunk/test/ruby/test_lambda.rb > trunk/vm.c > trunk/vm_core.h > trunk/vm_insnhelper.c > > Index: ChangeLog > =================================================================== > --- ChangeLog (revision 30242) > +++ ChangeLog (revision 30243) > @@ -1,3 +1,9 @@ > +Sat Dec 18 16:02:27 2010 Nobuyoshi Nakada > + > + * compile.c (setup_args), vm.c (invoke_block_from_c), > + vm_insnhelper.c (caller_setup_args): fix of r30241. lambda block > + shoud check argument number. > + > Sat Dec 18 14:42:29 2010 Tanaka Akira > > * load.c: parenthesize macro arguments. > Index: vm_core.h > =================================================================== > --- vm_core.h (revision 30242) > +++ vm_core.h (revision 30243) > @@ -550,6 +550,7 @@ > #define VM_CALL_TAILRECURSION_BIT (0x01 << 6) > #define VM_CALL_SUPER_BIT (0x01 << 7) > #define VM_CALL_OPT_SEND_BIT (0x01 << 8) > +#define VM_CALL_BLOCK_LAMBDA_BIT (0x01 << 9) > > enum vm_special_object_type { > VM_SPECIAL_OBJECT_VMCORE = 1, > Index: compile.c > =================================================================== > --- compile.c (revision 30242) > +++ compile.c (revision 30243) > @@ -2899,6 +2899,7 @@ > if (block && nd_type(argn->nd_body) == NODE_LAMBDA) { > NODE *lambda = argn->nd_body; > *block = NEW_CHILD_ISEQVAL(lambda->nd_body, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, nd_line(lambda)); > + *flag |= VM_CALL_BLOCK_LAMBDA_BIT; > } > else { > COMPILE(arg_block, "block", argn->nd_body); > Index: vm.c > =================================================================== > --- vm.c (revision 30242) > +++ vm.c (revision 30243) > @@ -531,7 +531,10 @@ > const rb_control_frame_t *cfp; > rb_control_frame_t *ncfp; > int i, opt_pc, arg_size = iseq->arg_size; > - int type = block_proc_is_lambda(block->proc) ? > + int type = > + block->proc == Qtrue ? VM_FRAME_MAGIC_LAMBDA : > + block->proc == Qfalse ? VM_FRAME_MAGIC_BLOCK : > + block_proc_is_lambda(block->proc) ? > VM_FRAME_MAGIC_LAMBDA : VM_FRAME_MAGIC_BLOCK; > > rb_vm_set_finish_env(th); > Index: vm_insnhelper.c > =================================================================== > --- vm_insnhelper.c (revision 30242) > +++ vm_insnhelper.c (revision 30243) > @@ -265,7 +265,7 @@ > else if (blockiseq) { > blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(cfp); > blockptr->iseq = blockiseq; > - blockptr->proc = 0; > + blockptr->proc = (flag & VM_CALL_BLOCK_LAMBDA_BIT) ? Qtrue : Qfalse; > *block = blockptr; > } > } > Index: test/ruby/test_lambda.rb > =================================================================== > --- test/ruby/test_lambda.rb (revision 30242) > +++ test/ruby/test_lambda.rb (revision 30243) > @@ -29,6 +29,7 @@ > a = 0 > 2.times(&->(_){ a += 1 }) > assert_equal(a, 2) > + assert_raise(ArgumentError) {1.times(&->(){ a += 1 })} > end > > def test_call_rest_args > > -- > ML: ruby-changes@quickml.atdot.net > Info: http://www.atdot.net/~ko1/quickml/ -- // SASADA Koichi at atdot dot net