Bug #7554
Updated by ko1 (Koichi Sasada) almost 12 years ago
In some case (using singleton method), TracePoint#defined_class doesn't return Class or Module. # example def self.foo end obj = Object.new def obj.foo end module M def baz end end class C include M def self.bar end end TracePoint.trace(:call){|tp| p [tp.defined_class, tp.defined_class.kind_of?(Module)] } foo obj.foo C.bar C.new.baz #=> # ruby 2.0.0dev (2012-12-01 trunk 38127) [i386-mswin32_100] [main, false] [#<Object:0x2d8267c>, false] [C, true] [M, true] ### The name `defined_class' expected to return object of Class or Module. So it should be return Class or Module. Current code returns modified object by singleton class. I propose to return singleton class directly. The following patch fixes this issue. ### Index: vm_trace.c =================================================================== --- vm_trace.c (revision 38362) +++ vm_trace.c (working copy) @@ -712,9 +712,6 @@ if (RB_TYPE_P(trace_arg->klass, T_ICLASS)) { trace_arg->klass = RBASIC(trace_arg->klass)->klass; } - else if (FL_TEST(trace_arg->klass, FL_SINGLETON)) { - trace_arg->klass = rb_iv_get(trace_arg->klass, "__attached__"); - } } else { trace_arg->klass = Qnil; ### After that, that script shows: ### [#<Class:#<Object:0x874b244>>, true] [#<Class:#<Object:0x873f9a8>>, true] [#<Class:C>, true] [M, true] ### The current Current behavior is from `set_trace_func' (6th parameter of block). I'm not sure why it returns modified object instead of singleton class. I believe TracePoint#defined_class should return singleton class directly. But TracePoint is introduced from 2.0, so newer, no compatibility compatible issue.