Project

General

Profile

Actions

Feature #20757

open

Make rb_tracearg_(parameters|eval_script|instruction_sequence) public C-API

Added by richardboehme (Richard Böhme) 3 months ago. Updated 12 days ago.

Status:
Assigned
Target version:
-
[ruby-core:119272]

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

  • Implementation of TracePoint#parameters in #14694
  • Implementation of TracePoint#eval_script and TracePoint#instruction_sequence in #15287

Updated by richardboehme (Richard Böhme) 3 months 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) 3 months ago

  • Assignee set to ko1 (Koichi Sasada)
Actions #3

Updated by hsbt (Hiroshi SHIBATA) about 1 month ago

  • Status changed from Open to Assigned

Updated by ko1 (Koichi Sasada) 12 days ago

Maybe no problem. Could you make a patch?

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0