aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--test/ruby/test_settracefunc.rb2
-rw-r--r--trace_point.rb4
-rw-r--r--vm_trace.c13
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
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
# 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
# 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 @@
#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
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)
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);