summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Evans <code@jeremyevans.net>2021-04-26 15:21:52 -0700
committerJeremy Evans <code@jeremyevans.net>2021-04-26 15:21:52 -0700
commitd585799d7303abeb1b0ca6fc868f0b2d76a26250 (patch)
tree5e85b1064f430a99a243077051d5912637900d9d
parent203eeeefddb3ae6c0e129ad9cd99da804c2cbaba (diff)
Document binding behavior for C call/return events for TracePoint/set_trace_func
C methods do not have bindings, so binding returns the binding of the nearest C method. Fixes [Bug #9009]
-rw-r--r--trace_point.rb12
-rw-r--r--vm_trace.c4
2 files changed, 13 insertions, 3 deletions
diff --git a/trace_point.rb b/trace_point.rb
index d68eed4248..2e85369e65 100644
--- a/trace_point.rb
+++ b/trace_point.rb
@@ -309,15 +309,21 @@ class TracePoint
Primitive.tracepoint_attr_defined_class
end
- # Return the generated binding object from event
+ # Return the generated binding object from event.
+ #
+ # Note that for +c_call+ and +c_return+ events, the binding returned is the
+ # binding of the nearest Ruby method calling the C method, since C methods
+ # themselves do not have bindings.
def binding
Primitive.tracepoint_attr_binding
end
# Return the trace object during event
#
- # Same as TracePoint#binding:
- # trace.binding.eval('self')
+ # Same as the following, except it returns the correct object (the method
+ # receiver) for +c_call+ and +c_return+ events:
+ #
+ # trace.binding.eval('self')
def self
Primitive.tracepoint_attr_self
end
diff --git a/vm_trace.c b/vm_trace.c
index 383f255799..6e2c058779 100644
--- a/vm_trace.c
+++ b/vm_trace.c
@@ -519,6 +519,10 @@ static void call_trace_func(rb_event_flag_t, VALUE data, VALUE self, ID id, VALU
* line prog.rb:3 test Test
* line prog.rb:4 test Test
* return prog.rb:4 test Test
+ *
+ * Note that for +c-call+ and +c-return+ events, the binding returned is the
+ * binding of the nearest Ruby method calling the C method, since C methods
+ * themselves do not have bindings.
*/
static VALUE