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

ruby-changes:5934

From: ko1 <ko1@a...>
Date: Fri, 20 Jun 2008 00:43:42 +0900 (JST)
Subject: [ruby-changes:5934] Ruby:r17442 (trunk): * proc.c (proc_new): fix to return Proc object if block is already

ko1	2008-06-20 00:43:25 +0900 (Fri, 20 Jun 2008)

  New Revision: 17442

  Modified files:
    trunk/ChangeLog
    trunk/bootstraptest/test_proc.rb
    trunk/proc.c

  Log:
    * proc.c (proc_new): fix to return Proc object if block is already
      in heap.  [ruby-core:15711]
    * bootstraptest/test_proc.rb: add a test.
    


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=17442&r2=17441&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/bootstraptest/test_proc.rb?r1=17442&r2=17441&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/proc.c?r1=17442&r2=17441&diff_format=u

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 17441)
+++ ChangeLog	(revision 17442)
@@ -1,3 +1,10 @@
+Fri Jun 20 00:40:08 2008  Koichi Sasada  <ko1@a...>
+
+	* proc.c (proc_new): fix to return Proc object if block is already
+	  in heap.  [ruby-core:15711]
+
+	* bootstraptest/test_proc.rb: add a test.
+
 Fri Jun 20 00:18:04 2008  Koichi Sasada  <ko1@a...>
 
 	* thread_win32.c (native_sleep): fix to decrement sleeper count.
Index: bootstraptest/test_proc.rb
===================================================================
--- bootstraptest/test_proc.rb	(revision 17441)
+++ bootstraptest/test_proc.rb	(revision 17442)
@@ -378,3 +378,20 @@
   m()
 }
 
+assert_equal 'ok', %q{
+  class Foo
+    def call_it
+      p = Proc.new
+      p.call
+    end
+  end
+
+  def give_it
+    proc { :ok }
+  end
+
+  f = Foo.new
+  a_proc = give_it
+  p :call_it
+  f.call_it(&give_it())
+}, '[ruby-core:15711]'
Index: proc.c
===================================================================
--- proc.c	(revision 17441)
+++ proc.c	(revision 17442)
@@ -358,6 +358,10 @@
 
 	    block = GC_GUARDED_PTR_REF(cfp->lfp[0]);
 
+	    if (block->proc) {
+		return block->proc;
+	    }
+
 	    /* TODO: check more (cfp limit, called via cfunc, etc) */
 	    while (cfp->dfp != block->dfp) {
 		cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp);

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

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