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

ruby-changes:17330

From: nobu <ko1@a...>
Date: Fri, 24 Sep 2010 23:45:28 +0900 (JST)
Subject: [ruby-changes:17330] Ruby:r29335 (trunk): * string.c (sym_call), vm.c (invoke_block_from_c),

nobu	2010-09-24 23:45:19 +0900 (Fri, 24 Sep 2010)

  New Revision: 29335

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=29335

  Log:
    * string.c (sym_call), vm.c (invoke_block_from_c),
      vm_insnhelper.c (vm_yield_with_cfunc): pass given block.
      [ruby-core:32075]
    
    * vm_eval.c (rb_funcall_passing_block): new function to call
      method with passing given block.

  Modified files:
    trunk/ChangeLog
    trunk/string.c
    trunk/test/ruby/test_proc.rb
    trunk/vm.c
    trunk/vm_eval.c
    trunk/vm_insnhelper.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 29334)
+++ ChangeLog	(revision 29335)
@@ -1,3 +1,12 @@
+Fri Sep 24 23:44:59 2010  Nobuyoshi Nakada  <nobu@r...>
+
+	* string.c (sym_call), vm.c (invoke_block_from_c),
+	  vm_insnhelper.c (vm_yield_with_cfunc): pass given block.
+	  [ruby-core:32075]
+
+	* vm_eval.c (rb_funcall_passing_block): new function to call
+	  method with passing given block.
+
 Fri Sep 24 15:50:43 2010  NARUSE, Yui  <naruse@r...>
 
 	* string.c (rb_str_to_i): fix rdoc: String#to_i raises an
Index: string.c
===================================================================
--- string.c	(revision 29334)
+++ string.c	(revision 29335)
@@ -7228,6 +7228,8 @@
     return sym;
 }
 
+VALUE rb_funcall_passing_block(VALUE recv, ID mid, int argc, const VALUE *argv);
+
 static VALUE
 sym_call(VALUE args, VALUE sym, int argc, VALUE *argv)
 {
@@ -7237,7 +7239,7 @@
 	rb_raise(rb_eArgError, "no receiver given");
     }
     obj = argv[0];
-    return rb_funcall3(obj, (ID)sym, argc - 1, argv + 1);
+    return rb_funcall_passing_block(obj, (ID)sym, argc - 1, argv + 1);
 }
 
 /*
Index: vm_eval.c
===================================================================
--- vm_eval.c	(revision 29334)
+++ vm_eval.c	(revision 29335)
@@ -665,6 +665,14 @@
     return rb_call(recv, mid, argc, argv, CALL_PUBLIC);
 }
 
+VALUE
+rb_funcall_passing_block(VALUE recv, ID mid, int argc, const VALUE *argv)
+{
+    PASS_PASSED_BLOCK_TH(GET_THREAD());
+
+    return rb_call(recv, mid, argc, argv, CALL_PUBLIC);
+}
+
 static VALUE
 send_internal(int argc, const VALUE *argv, VALUE recv, call_type scope)
 {
Index: vm.c
===================================================================
--- vm.c	(revision 29334)
+++ vm.c	(revision 29335)
@@ -549,6 +549,7 @@
 			     iseq->local_size - arg_size);
 	ncfp->me = th->passed_me;
 	th->passed_me = 0;
+	th->passed_block = blockptr;
 
 	if (cref) {
 	    th->cfp->dfp[-1] = (VALUE)cref;
Index: vm_insnhelper.c
===================================================================
--- vm_insnhelper.c	(revision 29334)
+++ vm_insnhelper.c	(revision 29335)
@@ -722,6 +722,9 @@
 		  self, (VALUE)block->dfp,
 		  0, th->cfp->sp, block->lfp, 1);
 
+    if (blockargptr) {
+	th->cfp->lfp[0] = GC_GUARDED_PTR((VALUE)blockargptr);
+    }
     val = (*ifunc->nd_cfnc) (arg, ifunc->nd_tval, argc, argv, blockarg);
 
     th->cfp++;
Index: test/ruby/test_proc.rb
===================================================================
--- test/ruby/test_proc.rb	(revision 29334)
+++ test/ruby/test_proc.rb	(revision 29335)
@@ -800,4 +800,22 @@
   ensure
     set_trace_func(nil)
   end
+
+  def test_block_propagation
+    bug3792 = '[ruby-core:32075]'
+    c = Class.new do
+      def foo
+        yield
+      end
+    end
+
+    o = c.new
+    f = :foo.to_proc
+    assert_nothing_raised(LocalJumpError, bug3792) {
+      assert_equal('bar', f.(o) {'bar'}, bug3792)
+    }
+    assert_nothing_raised(LocalJumpError, bug3792) {
+      assert_equal('zot', o.method(:foo).to_proc.() {'zot'}, bug3792)
+    }
+  end
 end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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