diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-08-20 11:36:34 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-08-20 11:36:34 +0000 |
commit | ceece4650a1de6189f2705cbf8120f6679a1af8f (patch) | |
tree | a229595768c98c125e260ab1faabda9370807712 /vm_insnhelper.c | |
parent | de83cb9b20f2fa6ee6bace04ff29462cedd02a6d (diff) |
vm_insnhelper.c: iclass as klass in cfp
* vm_insnhelper.c (vm_call_method): follow iclasses as klass in cfp
but not included modules. [ruby-core:47241] [Bug #6891]
* vm_insnhelper.c (vm_call_bmethod): pass defined_class to follow
proper ancestors. [ruby-core:47241] [Bug #6891]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36736 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_insnhelper.c')
-rw-r--r-- | vm_insnhelper.c | 8 |
1 files changed, 2 insertions, 6 deletions
diff --git a/vm_insnhelper.c b/vm_insnhelper.c index bb39b848cf..b774f1206f 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -466,7 +466,7 @@ vm_call_bmethod(rb_thread_t *th, VALUE recv, int argc, const VALUE *argv, /* control block frame */ th->passed_me = me; GetProcPtr(me->def->body.proc, proc); - val = rb_vm_invoke_proc(th, proc, recv, argc, argv, blockptr); + val = vm_invoke_proc(th, proc, recv, defined_class, argc, argv, blockptr); EXEC_EVENT_HOOK(th, RUBY_EVENT_RETURN, recv, me->called_id, me->klass); @@ -655,7 +655,7 @@ vm_call_method(rb_thread_t *th, rb_control_frame_t *cfp, MEMCPY(argv, cfp->sp - num, VALUE, num); cfp->sp -= num + 1; - val = rb_vm_invoke_proc(th, proc, proc->block.self, argc, argv, blockptr); + val = rb_vm_invoke_proc(th, proc, argc, argv, blockptr); break; } default: @@ -683,10 +683,6 @@ vm_call_method(rb_thread_t *th, rb_control_frame_t *cfp, val = vm_method_missing(th, id, recv, num, blockptr, stat); } else if (!(flag & VM_CALL_OPT_SEND_BIT) && (me->flag & NOEX_MASK) & NOEX_PROTECTED) { - if (RB_TYPE_P(defined_class, T_ICLASS)) { - defined_class = RBASIC(defined_class)->klass; - } - if (!rb_obj_is_kind_of(cfp->self, defined_class)) { val = vm_method_missing(th, id, recv, num, blockptr, NOEX_PROTECTED); } |