Feature #20757
closedMake rb_tracearg_(parameters|eval_script|instruction_sequence) public C-API
Description
Abstract
As a C-extension developer when using tracepoints I include "ruby/debug.h". This includes most of TracePoint's API but it seems like the C-equivalents for TracePoint#parameters, TracePoint#eval_script and TracePoint#instruction_sequence are missing/not being exported in the header.
Background
Most APIs like rb_tracearg_return_value are exported in "ruby/debug.h". If I understand correctly, the implementations for those methods are located in "ruby/vm_trace.c". The following methods implemented in "ruby/vm_trace.c" are missing in "ruby/debug.h":
- rb_tracearg_parameters
- rb_tracearg_eval_script
- rb_tracearg_instruction_sequence
Proposal
I propose to add those methods to "ruby/debug.h". From my limiting understanding the change should be simple and not break backward compatibility, because we'd only need to add those function declarations to "ruby/debug.h".
I'd be open to contribute this change if it was approved.
Use cases
I'm implementing a method call tracer for Ruby using the C-extension API. I wanted to get information about the parameters that the called method receives. When writing in Ruby this can be done using the TracePoint#parameters method, but I could not find the equivalent C-API. A workaround is to retrieve the method object (using the method_id) and check the method parameters.
See also
Updated by richardboehme (Richard Böhme) about 1 year ago
Actually it seems like retrieving the method object using the method_id does not work well for super-calls. See this example:
TracePoint.new(:call) do |tp|
p tp.self
end.enable
class A
def test
end
end
class B < A
def test = super
end
B.new.test
TracePoint#self will return the instance of B twice, which makes it hard to get the parameters of A#test without being able to call TracePoint#parameters. In general this makes it hard to track down the location of the method behind TracePoint#method_id, but this is another issue.
Updated by mame (Yusuke Endoh) about 1 year ago
- Assignee set to ko1 (Koichi Sasada)
Updated by hsbt (Hiroshi SHIBATA) 12 months ago
- Status changed from Open to Assigned
Updated by ko1 (Koichi Sasada) 11 months ago
Maybe no problem. Could you make a patch?
Updated by richardboehme (Richard Böhme) 10 months ago
I've added the methods to debug.h and in my small test case it seemed to work without any problems. The PR is at https://github.com/ruby/ruby/pull/12553. Let me know if this is fine like this or if I should change anything!
Updated by richardboehme (Richard Böhme) 8 months ago
- Status changed from Assigned to Closed
Applied in changeset git|04ebedf7f0144e8d5b8b2cd9cd243a2581bf974c.
Make rb_tracearg_(parameters|eval_script|instruction_sequence) public C-API
This allows C-Extension developers to call those methods to retrieve
information about a TracePoint's parameters, eval script and
instruction sequence.
Implements [Feature #20757]