From 5dc676a5cf6b7201f78e4622c0aad4982f4e3db0 Mon Sep 17 00:00:00 2001 From: ko1 Date: Wed, 16 Dec 2015 06:38:52 +0000 Subject: * vm.c: fix mark miss for proc given as passed block. [Bug #11750] * vm.c (vm_make_proc_from_block): should return a Proc object if block is given. Previous implementation returns a Proc object only when corresponding Proc object is not available. * vm.c (vm_make_env_each): ditto. * test/ruby/test_proc.rb: add a test for this bug. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53144 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- vm.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'vm.c') diff --git a/vm.c b/vm.c index 5e8d555556..087cba7250 100644 --- a/vm.c +++ b/vm.c @@ -559,16 +559,17 @@ check_env_value(VALUE envval) return Qnil; /* unreachable */ } -/* return Qfalse if proc was already created */ -static VALUE -vm_make_proc_from_block(rb_thread_t *th, rb_block_t *block) +/* return FALSE if proc was already created */ +static int +vm_make_proc_from_block(rb_thread_t *th, rb_block_t *block, VALUE *procptr) { if (!block->proc) { - block->proc = rb_vm_make_proc(th, block, rb_cProc); - return block->proc; + *procptr = block->proc = rb_vm_make_proc(th, block, rb_cProc); + return TRUE; } else { - return Qfalse; + *procptr = block->proc; + return FALSE; } } @@ -603,7 +604,7 @@ vm_make_env_each(rb_thread_t *const th, rb_control_frame_t *const cfp) else { rb_block_t *block = VM_EP_BLOCK_PTR(ep); - if (block && (blockprocval = vm_make_proc_from_block(th, block)) != Qfalse) { + if (block && (vm_make_proc_from_block(th, block, &blockprocval)) != Qfalse) { rb_proc_t *p; GetProcPtr(blockprocval, p); *ep = VM_ENVVAL_BLOCK_PTR(&p->block); -- cgit v1.2.3