From: headius@... Date: 2020-03-06T00:09:41+00:00 Subject: [ruby-core:97374] [Ruby master Bug#16383] TracePoint does not report calls to attribute reader methods Issue #16383 has been updated by headius (Charles Nutter). > On microbenchmark, it is 30% slower, so we need to invent a hack to support it. In JRuby, that hack is called the `--debug` flag, which enables the full set of traces. At some point CRuby's probably going to have to do something similar, or else every operation in Ruby's going to pay the price of traces whether they're used or not. ---------------------------------------- Bug #16383: TracePoint does not report calls to attribute reader methods https://bugs.ruby-lang.org/issues/16383#change-84498 * Author: AndyMaleh (Andy Maleh) * Status: Open * Priority: Normal * ruby -v: ruby 2.5.7p206 (2019-10-01 revision 67816) [x86_64-darwin19] * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN ---------------------------------------- TracePoint does not report calls to attribute reader methods (e.g. methods defined using `attr_accessor` or `attr_reader`.) **Code sample to demonstrate:** ```ruby class Person attr_accessor :first_name attr_accessor :last_name def name "#{self.last_name}, #{self.first_name}" end end person = Person.new person.first_name = 'Josh' person.last_name = 'McGibbon' trace = TracePoint.new(:call) do |tp| p [tp.path, tp.lineno, tp.defined_class, tp.event, tp.method_id] end trace.enable person.name trace.disable class Person attr_writer :first_name attr_writer :last_name def name "#{self.last_name}, #{self.first_name}" end def first_name @first_name end def last_name @last_name end end person = Person.new person.first_name = 'Josh' person.last_name = 'McGibbon' trace = TracePoint.new(:call) do |tp| p [tp.path, tp.lineno, tp.defined_class, tp.event, tp.method_id] end trace.enable person.name trace.disable ``` **Output:** ``` ["trace_point_issue.rb", 4, Person, :call, :name] ["trace_point_issue.rb", 22, Person, :call, :name] ["trace_point_issue.rb", 28, Person, :call, :last_name] ["trace_point_issue.rb", 25, Person, :call, :first_name] ``` Please note how `:last_name` and `:first_name` show up only the second time `Person#name` is called. In other words, they show up when defined as actual methods using `def` keyword, but not when defined via `attr_accessor`. **Expected Output:** ``` ["trace_point_issue.rb", 22, Person, :call, :name] ["trace_point_issue.rb", 28, Person, :call, :last_name] ["trace_point_issue.rb", 25, Person, :call, :first_name] ["trace_point_issue.rb", 22, Person, :call, :name] ["trace_point_issue.rb", 28, Person, :call, :last_name] ["trace_point_issue.rb", 25, Person, :call, :first_name] ``` Your help in fixing or explaining this issue is greatly appreciated. My goal is to monitor all method calls when invoking a certain method (Person#name in this case) in order to attach observers to them dynamically for desktop UI data-binding use in my open-source project Glimmer: https://github.com/AndyObtiva/glimmer Cheers, Andy Maleh ---Files-------------------------------- trace_point_issue.rb (791 Bytes) tracepoint-attr-16383.patch (1.97 KB) -- https://bugs.ruby-lang.org/ Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe> <http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>