Issue #16383 has been reported by AndyMaleh (Andy Maleh).
----------------------------------------
Bug #16383: TracePoint does not report calls to attribute reader methods
https://bugs.ruby-lang.org/issues/16383
* Author: AndyMaleh (Andy Maleh)
* Status: Open
* Priority: Normal
* Assignee:
* Target version:
* 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)
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:[email protected]?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.