From: "ko1 (Koichi Sasada)" Date: 2012-12-13T17:29:57+09:00 Subject: [ruby-core:50864] [ruby-trunk - Bug #7554][Open] TracePoint#defined_class doesn't return Class or Module Issue #7554 has been reported by ko1 (Koichi Sasada). ---------------------------------------- Bug #7554: TracePoint#defined_class doesn't return Class or Module https://bugs.ruby-lang.org/issues/7554 Author: ko1 (Koichi Sasada) Status: Open Priority: Normal Assignee: ko1 (Koichi Sasada) Category: core Target version: 2.0.0 ruby -v: ruby 2.0.0dev (2012-12-01 trunk 38127) [i386-mswin32_100] 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] [#, 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. 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: ### [#>, true] [#>, true] [#, true] [M, true] ### Current behavior is from `set_trace_func' (6th parameter of block). But TracePoint is newer, no compatible issue. -- http://bugs.ruby-lang.org/