[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]