[#97536] [Ruby master Bug#16694] JIT vs hardened GCC with PCH — v.ondruch@...
Issue #16694 has been reported by vo.x (Vit Ondruch).
11 messages
2020/03/18
[ruby-core:97374] [Ruby master Bug#16383] TracePoint does not report calls to attribute reader methods
From:
headius@...
Date:
2020-03-06 00:09:41 UTC
List:
ruby-core #97374
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>