From: "ko1 (Koichi Sasada)" Date: 2012-12-13T17:34:00+09:00 Subject: [ruby-core:50865] [ruby-trunk - Bug #7554] TracePoint#defined_class doesn't return Class or Module Issue #7554 has been updated by ko1 (Koichi Sasada). Description updated ---------------------------------------- Bug #7554: TracePoint#defined_class doesn't return Class or Module https://bugs.ruby-lang.org/issues/7554#change-34696 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. 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: ### [#>, true] [#>, true] [#, true] [M, true] ### The 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. TracePoint is introduced from 2.0, so no compatibility issue. -- http://bugs.ruby-lang.org/