aboutsummaryrefslogtreecommitdiffstats
path: root/vm_insnhelper.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-10-16 03:21:10 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-10-16 03:21:10 +0000
commit8008992e404a90c469cebca8f42fed59618944a7 (patch)
tree70f691e52ce7e69d0cb3859f2e36bfe7961a2fe5 /vm_insnhelper.c
parentc70a519d8fdbf2b5300a4632ad91f3a56d28547c (diff)
downloadruby-8008992e404a90c469cebca8f42fed59618944a7.tar.gz
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.c16
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;