Bug #21298
open`ObjectSpace.allocation_class_path` returns inconsistent results depending on `TracePoint` state
Description
ObjectSpace.allocation_class_path is an API that returns the class of self in the context where an object was allocated. However, due to recent optimizations in Class#new (#21254), the return value now changes depending on whether TracePoint is enabled.
require "objspace"
class Foo
def test
obj = Object.new
ObjectSpace.allocation_class_path(obj)
end
end
ObjectSpace.trace_object_allocations_start
p Foo.new.test #=> 3.4.2: "Class", master: "Foo"
Previously, this returned "Class" (from the Class#new call frame), but in the master branch, the result is now "Foo" because that frame is gone.
I am ok for the incompatibility itself because I find the new behavior more intuitive and useful. However, there's an inconsistency: the optimization is disabled when TracePoint is enabled, causing the result to revert to the old behavior.
p Foo.new.test #=> master: "Foo"
TracePoint.new {}.enable do
p Foo.new.test #=> master: "Class", expected: "Foo"
end
This makes behavior dependent on whether TracePoint is enabled, which can lead to confusion.
@ko1 (Koichi Sasada) @tenderlovemaking (Aaron Patterson) Can we make ObjectSpace.allocation_class_path consistently return the class from the .new call context, regardless of the TracePoint state?
I am facing a failure of the following test when code coverage (which uses TracePoint) is enabled:
As a short-term workaround, I'm considering commenting out this test.