aboutsummaryrefslogtreecommitdiffstats
path: root/vm_insnhelper.c
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2023-08-01 17:25:20 +0900
committerKoichi Sasada <ko1@atdot.net>2023-08-01 22:46:17 +0900
commitd68c01fd314ebd6dc1d89c95a2734fad4f0953b0 (patch)
treeb8d8794f59990f635eaf984119519f0a9cd51bd1 /vm_insnhelper.c
parentf11ac06337fc56104172c3241393fd95d3a6c60d (diff)
downloadruby-d68c01fd314ebd6dc1d89c95a2734fad4f0953b0.tar.gz
support `rescue` event for TracePoint
fix [Feature #19572]
Diffstat (limited to 'vm_insnhelper.c')
-rw-r--r--vm_insnhelper.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 6291e13fec..b226e1397e 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -6483,6 +6483,14 @@ rb_vm_opt_cfunc_p(CALL_CACHE cc, int insn)
} \
} while (0)
+static VALUE
+rescue_errinfo(rb_execution_context_t *ec, rb_control_frame_t *cfp)
+{
+ VM_ASSERT(VM_FRAME_RUBYFRAME_P(cfp));
+ VM_ASSERT(ISEQ_BODY(cfp->iseq)->type == ISEQ_TYPE_RESCUE);
+ return cfp->ep[VM_ENV_INDEX_LAST_LVAR];
+}
+
static void
vm_trace(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp)
{
@@ -6559,6 +6567,7 @@ vm_trace(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp)
vm_trace_hook(ec, reg_cfp, pc, RUBY_EVENT_CALL, RUBY_EVENT_CALL, global_hooks, bmethod_local_hooks_ptr, Qundef);
}
VM_TRACE_HOOK(RUBY_EVENT_CLASS | RUBY_EVENT_CALL | RUBY_EVENT_B_CALL, Qundef);
+ VM_TRACE_HOOK(RUBY_EVENT_RESCUE, rescue_errinfo(ec, reg_cfp));
VM_TRACE_HOOK(RUBY_EVENT_LINE, Qundef);
VM_TRACE_HOOK(RUBY_EVENT_COVERAGE_LINE, Qundef);
VM_TRACE_HOOK(RUBY_EVENT_COVERAGE_BRANCH, Qundef);