ruby-changes:71543
From: Jeremy <ko1@a...>
Date: Wed, 30 Mar 2022 10:14:56 +0900 (JST)
Subject: [ruby-changes:71543] 3c6a0033e3 (master): Avoid trace events in implementation of TracePoint#enable
https://git.ruby-lang.org/ruby.git/commit/?id=3c6a0033e3 From 3c6a0033e3dc7da2898232a2efc7367ae6fc536a Mon Sep 17 00:00:00 2001 From: Jeremy Evans <code@j...> Date: Mon, 27 Dec 2021 14:08:59 -0800 Subject: Avoid trace events in implementation of TracePoint#enable This is more backwards compatible, and should fix issues with power_assert. Unfortunately, it requires using a sentinel value as the default value of target_thread, instead of the more natural expression used in the original approach. --- test/ruby/test_settracefunc.rb | 2 +- trace_point.rb | 4 ++-- vm_trace.c | 13 +++++++++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/test/ruby/test_settracefunc.rb b/test/ruby/test_settracefunc.rb index 1b595ef1d7..dcf821f563 100644 --- a/test/ruby/test_settracefunc.rb +++ b/test/ruby/test_settracefunc.rb @@ -2290,7 +2290,7 @@ CODE https://github.com/ruby/ruby/blob/trunk/test/ruby/test_settracefunc.rb#L2290 events << :___ end end - assert_equal [:tp1, :tp1, :tp1, :tp1, :tp1, :tp2, :tp1, :___], events + assert_equal [:tp1, :tp1, :tp1, :tp1, :tp2, :tp1, :___], events # success with two tracepoints (targeting/global) events = [] diff --git a/trace_point.rb b/trace_point.rb index 866c807821..2fa2de32db 100644 --- a/trace_point.rb +++ b/trace_point.rb @@ -153,7 +153,7 @@ class TracePoint https://github.com/ruby/ruby/blob/trunk/trace_point.rb#L153 # call-seq: # trace.enable(target: nil, target_line: nil, target_thread: nil) -> true or false - # trace.enable(target: nil, target_line: nil, target_thread: Thread.current) { block } -> obj + # trace.enable(target: nil, target_line: nil, target_thread: :default) { block } -> obj # # Activates the trace. # @@ -209,7 +209,7 @@ class TracePoint https://github.com/ruby/ruby/blob/trunk/trace_point.rb#L209 # trace.enable { p tp.lineno } # #=> RuntimeError: access from outside # - def enable(target: nil, target_line: nil, target_thread: (Thread.current if target.nil? && target_line.nil? && defined?(yield))) + def enable(target: nil, target_line: nil, target_thread: :default) Primitive.tracepoint_enable_m(target, target_line, target_thread) end diff --git a/vm_trace.c b/vm_trace.c index b9ba6de73e..a9074c338e 100644 --- a/vm_trace.c +++ b/vm_trace.c @@ -34,6 +34,8 @@ https://github.com/ruby/ruby/blob/trunk/vm_trace.c#L34 #include "builtin.h" +static VALUE sym_default; + /* (1) trace mechanisms */ typedef struct rb_event_hook_struct { @@ -1334,6 +1336,15 @@ tracepoint_enable_m(rb_execution_context_t *ec, VALUE tpval, VALUE target, VALUE https://github.com/ruby/ruby/blob/trunk/vm_trace.c#L1336 rb_tp_t *tp = tpptr(tpval); int previous_tracing = tp->tracing; + if (target_thread == sym_default) { + if (rb_block_given_p() && NIL_P(target) && NIL_P(target_line)) { + target_thread = rb_thread_current(); + } + else { + target_thread = Qnil; + } + } + /* check target_thread */ if (RTEST(target_thread)) { if (tp->target_th) { @@ -1563,6 +1574,8 @@ tracepoint_allow_reentry(rb_execution_context_t *ec, VALUE self) https://github.com/ruby/ruby/blob/trunk/vm_trace.c#L1574 void Init_vm_trace(void) { + sym_default = ID2SYM(rb_intern_const("default")); + /* trace_func */ rb_define_global_function("set_trace_func", set_trace_func, 1); rb_define_method(rb_cThread, "set_trace_func", thread_set_trace_func_m, 1); -- cgit v1.2.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/