ext/byebug/byebug.c in byebug-7.0.0 vs ext/byebug/byebug.c in byebug-8.0.0
- old
+ new
@@ -226,10 +226,18 @@
dc->stop_reason = CTX_STOP_BREAKPOINT;
return call_at(ctx, dc, rb_intern("at_return"), 1, return_value);
}
+static VALUE
+call_at_end(VALUE ctx, debug_context_t * dc)
+{
+ dc->stop_reason = CTX_STOP_BREAKPOINT;
+
+ return call_at(ctx, dc, rb_intern("at_end"), 0, Qnil);
+}
+
static void
call_at_line_check(VALUE ctx, debug_context_t * dc, VALUE breakpoint)
{
dc->stop_reason = CTX_STOP_STEP;
@@ -324,27 +332,38 @@
}
static void
return_event(VALUE trace_point, void *data)
{
- VALUE return_value;
-
EVENT_SETUP;
RETURN_EVENT_SETUP;
if ((dc->steps_out == 0) && (CTX_FL_TEST(dc, CTX_FL_STOP_ON_RET)))
{
reset_stepping_stop_points(dc);
- if (rb_tracearg_event_flag(trace_arg) &
- (RUBY_EVENT_RETURN | RUBY_EVENT_B_RETURN))
- return_value = rb_tracearg_return_value(trace_arg);
- else
- return_value = Qnil;
+ call_at_return(context, dc, rb_tracearg_return_value(trace_arg));
+ }
- call_at_return(context, dc, return_value);
+ RETURN_EVENT_TEARDOWN;
+
+ EVENT_TEARDOWN;
+}
+
+static void
+end_event(VALUE trace_point, void *data)
+{
+ EVENT_SETUP;
+
+ RETURN_EVENT_SETUP;
+
+ if ((dc->steps_out == 0) && (CTX_FL_TEST(dc, CTX_FL_STOP_ON_RET)))
+ {
+ reset_stepping_stop_points(dc);
+
+ call_at_end(context, dc);
}
RETURN_EVENT_TEARDOWN;
EVENT_TEARDOWN;
@@ -437,25 +456,28 @@
if (NIL_P(traces))
{
int line_msk = RUBY_EVENT_LINE;
int call_msk = RUBY_EVENT_CALL;
- int ret_msk = RUBY_EVENT_RETURN | RUBY_EVENT_B_RETURN | RUBY_EVENT_END;
+ int ret_msk = RUBY_EVENT_RETURN | RUBY_EVENT_B_RETURN;
+ int end_msk = RUBY_EVENT_END;
int raw_call_msk = RUBY_EVENT_C_CALL | RUBY_EVENT_B_CALL | RUBY_EVENT_CLASS;
int raw_ret_msk = RUBY_EVENT_C_RETURN;
int raise_msk = RUBY_EVENT_RAISE;
VALUE tpLine = rb_tracepoint_new(Qnil, line_msk, line_event, 0);
VALUE tpCall = rb_tracepoint_new(Qnil, call_msk, call_event, 0);
VALUE tpReturn = rb_tracepoint_new(Qnil, ret_msk, return_event, 0);
+ VALUE tpEnd = rb_tracepoint_new(Qnil, end_msk, end_event, 0);
VALUE tpCCall = rb_tracepoint_new(Qnil, raw_call_msk, raw_call_event, 0);
VALUE tpCReturn = rb_tracepoint_new(Qnil, raw_ret_msk, raw_return_event, 0);
VALUE tpRaise = rb_tracepoint_new(Qnil, raise_msk, raise_event, 0);
traces = rb_ary_new();
rb_ary_push(traces, tpLine);
rb_ary_push(traces, tpCall);
rb_ary_push(traces, tpReturn);
+ rb_ary_push(traces, tpEnd);
rb_ary_push(traces, tpCCall);
rb_ary_push(traces, tpCReturn);
rb_ary_push(traces, tpRaise);
tracepoints = traces;