Bug #13369 » diff.patch
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);
|
- « Previous
- 1
- 2
- Next »