From e6ad53beaa8f61c784d7e6c9cace5bd6ecc4d5c8 Mon Sep 17 00:00:00 2001 From: ko1 Date: Wed, 23 May 2018 06:56:08 +0000 Subject: remove VM_ENV_DATA_INDEX_ENV_PROC. * vm_core.h (VM_ENV_DATA_INDEX_ENV_PROC): ep[VM_ENV_DATA_INDEX_ENV_PROC] is allocated to mark a Proc which is created from iseq block. However, `lep[0]` keeps Proc object itself as a block handler (Proc). So we don't need to keep it. * vm_core.h (VM_ENV_PROCVAL): ditto. * vm.c (vm_make_env_each): do not need to keep blockprocval as special value. * vm.c (vm_block_handler_escape): simply return Proc value. * proc.c (proc_new): we don't need to check Env because a Proc type block handler is a Proc object itself. [Bug #14782] * test/ruby/test_proc.rb: add a test for [Bug #14782] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63494 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- proc.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) (limited to 'proc.c') diff --git a/proc.c b/proc.c index b81d14ed46..420dc60256 100644 --- a/proc.c +++ b/proc.c @@ -706,13 +706,6 @@ proc_new(VALUE klass, int8_t is_lambda) cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp); if ((block_handler = rb_vm_frame_block_handler(cfp)) != VM_BLOCK_HANDLER_NONE) { - const VALUE *lep = rb_vm_ep_local_ep(cfp->ep); - - if (VM_ENV_ESCAPED_P(lep)) { - procval = VM_ENV_PROCVAL(lep); - goto return_existing_proc; - } - if (is_lambda) { rb_warn(proc_without_block); } @@ -730,13 +723,12 @@ proc_new(VALUE klass, int8_t is_lambda) case block_handler_type_proc: procval = VM_BH_TO_PROC(block_handler); - return_existing_proc: if (RBASIC_CLASS(procval) == klass) { return procval; } else { VALUE newprocval = rb_proc_dup(procval); - RBASIC_SET_CLASS(newprocval, klass); + RBASIC_SET_CLASS(newprocval, klass); return newprocval; } break; -- cgit v1.2.3