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

ruby-changes:26156

From: nobu <ko1@a...>
Date: Wed, 5 Dec 2012 22:46:21 +0900 (JST)
Subject: [ruby-changes:26156] nobu:r38213 (trunk): vm.c: save blockprocval

nobu	2012-12-05 22:46:11 +0900 (Wed, 05 Dec 2012)

  New Revision: 38213

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

  Log:
    vm.c: save blockprocval
    
    * vm.c (rb_vm_make_proc): save the proc made from the given block so
      that it will not get collected.  [ruby-core:50545] [Bug #7507]

  Modified files:
    trunk/ChangeLog
    trunk/test/ruby/test_lazy_enumerator.rb
    trunk/vm.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 38212)
+++ ChangeLog	(revision 38213)
@@ -1,3 +1,8 @@
+Wed Dec  5 22:46:02 2012  Nobuyoshi Nakada  <nobu@r...>
+
+	* vm.c (rb_vm_make_proc): save the proc made from the given block so
+	  that it will not get collected.  [ruby-core:50545] [Bug #7507]
+
 Wed Dec  5 22:13:57 2012  Naohisa Goto  <ngotogenome@g...>
 
 	* ext/dl/lib/dl/func.rb (DL::Function#bind): When Fiddle is used,
Index: vm.c
===================================================================
--- vm.c	(revision 38212)
+++ vm.c	(revision 38213)
@@ -477,10 +477,18 @@
 
 static void vm_rewrite_ep_in_errinfo(rb_thread_t *th);
 static VALUE vm_make_proc_from_block(rb_thread_t *th, rb_block_t *block);
+static VALUE vm_make_env_object(rb_thread_t * th, rb_control_frame_t *cfp, VALUE *blockprocptr);
 
 VALUE
 rb_vm_make_env_object(rb_thread_t * th, rb_control_frame_t *cfp)
 {
+    VALUE blockprocval;
+    return vm_make_env_object(th, cfp, &blockprocval);
+}
+
+static VALUE
+vm_make_env_object(rb_thread_t *th, rb_control_frame_t *cfp, VALUE *blockprocptr)
+{
     VALUE envval;
     VALUE *lep = VM_CF_LEP(cfp);
     rb_block_t *blockptr = VM_EP_BLOCK_PTR(lep);
@@ -490,6 +498,7 @@
 	rb_proc_t *p;
 	GetProcPtr(blockprocval, p);
 	lep[0] = VM_ENVVAL_BLOCK_PTR(&p->block);
+	*blockprocptr = blockprocval;
     }
 
     envval = vm_make_env_each(th, cfp, cfp->ep, lep);
@@ -560,7 +569,7 @@
 	rb_bug("rb_vm_make_proc: Proc value is already created.");
     }
 
-    envval = rb_vm_make_env_object(th, cfp);
+    envval = vm_make_env_object(th, cfp, &blockprocval);
 
     if (PROCDEBUG) {
 	check_env_value(envval);
Index: test/ruby/test_lazy_enumerator.rb
===================================================================
--- test/ruby/test_lazy_enumerator.rb	(revision 38212)
+++ test/ruby/test_lazy_enumerator.rb	(revision 38213)
@@ -1,4 +1,5 @@
 require 'test/unit'
+require_relative 'envutil'
 
 class TestLazyEnumerator < Test::Unit::TestCase
   class Step
@@ -356,4 +357,10 @@
     assert_equal nil, lazy.select{}.cycle(4).size
     assert_equal nil, lazy.select{}.cycle.size
   end
+
+  def test_map_zip
+    bug7507 = '[ruby-core:50545]'
+    assert_ruby_status(["-e", "GC.stress = true", "-e", "(1..10).lazy.map{}.zip(){}"], bug7507)
+    assert_ruby_status(["-e", "GC.stress = true", "-e", "(1..10).lazy.map{}.zip().to_a"], bug7507)
+  end
 end

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

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