diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-10-16 03:21:10 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-10-16 03:21:10 +0000 |
commit | 6291c6ad77a0587d3d7d5461d969f1bc9bbe866d (patch) | |
tree | 70f691e52ce7e69d0cb3859f2e36bfe7961a2fe5 /vm_insnhelper.c | |
parent | 2fda4a5568e703192cb5eb719b99c067ab5c6db7 (diff) |
vm_args.c: symbol proc
* vm_args.c (vm_caller_setup_arg_block): store symbols instead of
ifuncs.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52138 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_insnhelper.c')
-rw-r--r-- | vm_insnhelper.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/vm_insnhelper.c b/vm_insnhelper.c index 850ef8bd30..7fbdb0ebd0 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -2283,11 +2283,13 @@ vm_yield_with_cfunc(rb_thread_t *th, const rb_block_t *block, VALUE self, const rb_block_t *blockargptr) { const struct vm_ifunc *ifunc = (struct vm_ifunc *)block->iseq; - VALUE val, arg, blockarg; + VALUE val, arg, blockarg, data; + rb_block_call_func *func; const rb_callable_method_entry_t *me = th->passed_bmethod_me; th->passed_bmethod_me = NULL; - if (!RUBY_VM_IFUNC_P(block->proc) && block_proc_is_lambda(block->proc)) { + if (!RUBY_VM_IFUNC_P(block->proc) && !SYMBOL_P(block->proc) && + block_proc_is_lambda(block->proc)) { arg = rb_ary_new4(argc, argv); } else if (argc == 0) { @@ -2313,7 +2315,15 @@ vm_yield_with_cfunc(rb_thread_t *th, const rb_block_t *block, VALUE self, self, VM_ENVVAL_PREV_EP_PTR(block->ep), (VALUE)me, 0, th->cfp->sp, 1, 0); - val = (*ifunc->func) (arg, ifunc->data, argc, argv, blockarg); + if (SYMBOL_P(ifunc)) { + func = rb_sym_proc_call; + data = SYM2ID((VALUE)ifunc); + } + else { + func = ifunc->func; + data = (VALUE)ifunc->data; + } + val = (*func)(arg, data, argc, argv, blockarg); th->cfp++; return val; |