Project

General

Profile

Bug #7554

Updated by ko1 (Koichi Sasada) over 11 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. 

Back