ruby-changes:18222
From: nobu <ko1@a...>
Date: Sat, 18 Dec 2010 16:02:43 +0900 (JST)
Subject: [ruby-changes:18222] Ruby:r30243 (trunk): * compile.c (setup_args), vm.c (invoke_block_from_c),
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 <nobu@r...> + + * 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 <akr@f...> * 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@q... Info: http://www.atdot.net/~ko1/quickml/