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 »