Project

General

Profile

Bug #13369 » diff.patch

ayemos (Yuichiro Someya), 03/29/2017 09:48 AM

View differences:

vm.c
#endif
static void
hook_before_rewind(rb_thread_t *th, rb_control_frame_t *cfp, int will_finish_vm_exec)
hook_before_rewind(rb_thread_t *th, rb_control_frame_t *cfp, int will_finish_vm_exec, VALUE result)
{
switch (VM_FRAME_TYPE(th->cfp)) {
case VM_FRAME_MAGIC_METHOD:
RUBY_DTRACE_METHOD_RETURN_HOOK(th, 0, 0);
EXEC_EVENT_HOOK_AND_POP_FRAME(th, RUBY_EVENT_RETURN, th->cfp->self, 0, 0, 0, Qnil);
EXEC_EVENT_HOOK_AND_POP_FRAME(th, RUBY_EVENT_RETURN, th->cfp->self, 0, 0, 0, result);
break;
case VM_FRAME_MAGIC_BLOCK:
case VM_FRAME_MAGIC_LAMBDA:
......
if (!catch_iseq) {
th->errinfo = Qnil;
result = THROW_DATA_VAL(err);
hook_before_rewind(th, th->cfp, TRUE);
hook_before_rewind(th, th->cfp, TRUE, result);
rb_vm_pop_frame(th);
goto finish_vme;
}
......
}
else {
/* skip frame */
hook_before_rewind(th, th->cfp, FALSE);
result = THROW_DATA_VAL(err);
hook_before_rewind(th, th->cfp, FALSE, result);
if (VM_FRAME_FINISHED_P(th->cfp)) {
rb_vm_pop_frame(th);
(2-2/2)