Feature #20757
openMake 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 month 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 month ago
- Assignee set to ko1 (Koichi Sasada)