pvalena / rpms / ruby

Forked from rpms/ruby 6 years ago
Clone
Blob Blame History Raw
Mon Jan  7 15:50:25 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* 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]
 
diff --git a/vm.c b/vm.c
index 4dd242f..70e8d3b 100644
--- a/vm.c
+++ b/vm.c
@@ -468,10 +468,18 @@
 }
 
 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 *lfp;
     rb_block_t *blockptr;
@@ -489,6 +497,7 @@
 	rb_proc_t *p;
 	GetProcPtr(blockprocval, p);
 	lfp[0] = GC_GUARDED_PTR(&p->block);
+	*blockprocptr = blockprocval;
     }
 
     envval = vm_make_env_each(th, cfp, cfp->dfp, cfp->lfp);
@@ -559,7 +568,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);