[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]