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

ruby-changes:24634

From: ktsj <ko1@a...>
Date: Sun, 12 Aug 2012 12:04:55 +0900 (JST)
Subject: [ruby-changes:24634] ktsj:r36685 (trunk): * vm.c (invoke_block_from_c): fix unintentional block passing.

ktsj	2012-08-12 12:04:42 +0900 (Sun, 12 Aug 2012)

  New Revision: 36685

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

  Log:
    * vm.c (invoke_block_from_c): fix unintentional block passing.
      [ruby-dev:45071] [Bug #5832]

  Added directories:
    trunk/ext/-test-/bug-5832/
  Added files:
    trunk/ext/-test-/bug-5832/bug.c
    trunk/ext/-test-/bug-5832/extconf.rb
    trunk/test/-ext-/test_bug-5832.rb
  Modified files:
    trunk/ChangeLog
    trunk/vm.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 36684)
+++ ChangeLog	(revision 36685)
@@ -1,3 +1,8 @@
+Sun Aug 12 11:57:20 2012  Kazuki Tsujimoto  <kazuki@c...>
+
+	* vm.c (invoke_block_from_c): fix unintentional block passing.
+	  [ruby-dev:45071] [Bug #5832]
+
 Fri Aug 10 08:41:28 2012  Eric Hodel  <drbrain@s...>
 
 	* gc.c (gc_malloc_allocated_size):  RDoc does not process macros, so
Index: ext/-test-/bug-5832/extconf.rb
===================================================================
--- ext/-test-/bug-5832/extconf.rb	(revision 0)
+++ ext/-test-/bug-5832/extconf.rb	(revision 36685)
@@ -0,0 +1 @@
+create_makefile("-test-/bug-5832/bug")
Index: ext/-test-/bug-5832/bug.c
===================================================================
--- ext/-test-/bug-5832/bug.c	(revision 0)
+++ ext/-test-/bug-5832/bug.c	(revision 36685)
@@ -0,0 +1,14 @@
+#include <ruby.h>
+
+static VALUE
+bug_funcall_callback(VALUE self, VALUE obj)
+{
+    return rb_funcall(obj, rb_intern("callback"), 0);
+}
+
+void
+Init_bug(void)
+{
+    VALUE mBug = rb_define_module("Bug");
+    rb_define_module_function(mBug, "funcall_callback", bug_funcall_callback, 1);
+}
Index: vm.c
===================================================================
--- vm.c	(revision 36684)
+++ vm.c	(revision 36685)
@@ -604,7 +604,6 @@
 		      cfp->sp + arg_size, iseq->local_size - arg_size,
 		      th->passed_me);
 	th->passed_me = 0;
-	th->passed_block = blockptr;
 
 	if (cref) {
 	    th->cfp->ep[-1] = (VALUE)cref;
Index: test/-ext-/test_bug-5832.rb
===================================================================
--- test/-ext-/test_bug-5832.rb	(revision 0)
+++ test/-ext-/test_bug-5832.rb	(revision 36685)
@@ -0,0 +1,21 @@
+require '-test-/bug-5832/bug'
+
+class Test_BUG_5832 < Test::Unit::TestCase
+  def test_block_passing
+    bug5832 = '[ruby-dev:45071]'
+
+    c = Class.new do
+      define_method(:call_invoke_block_from_c) do
+        Bug.funcall_callback(self)
+      end
+
+      def callback
+        yield if block_given?
+      end
+    end
+
+    assert_nothing_raised(RuntimeError, bug5832) do
+      c.new.call_invoke_block_from_c { raise 'unreachable' }
+    end
+  end
+end

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

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