46 lines
1.2 KiB
Diff
46 lines
1.2 KiB
Diff
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);
|