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] [#<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. 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] ### Current behavior is from `set_trace_func' (6th parameter of block). But TracePoint is newer, no compatible issue.
on 2012-12-13 09:30
on 2012-12-13 09:34
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] [#<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 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.
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.