Bug #7554

TracePoint#defined_class doesn't return Class or Module

Added by Koichi Sasada over 1 year ago. Updated over 1 year ago.

[ruby-core:50864]
Status:Closed
Priority:Normal
Assignee:Koichi Sasada
Category:core
Target version:2.0.0
ruby -v:ruby 2.0.0dev (2012-12-01 trunk 38127) [i386-mswin32_100] Backport:

Description

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.definedclass, tp.definedclass.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

--- vmtrace.c (revision 38362)
+++ vm
trace.c (working copy)
@@ -712,9 +712,6 @@
if (RBTYPEP(tracearg->klass, TICLASS)) {
tracearg->klass = RBASIC(tracearg->klass)->klass;
}
- else if (FLTEST(tracearg->klass, FLSINGLETON)) {
- trace
arg->klass = rbivget(tracearg->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 `settracefunc' (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.

Associated revisions

Revision 38430
Added by Koichi Sasada over 1 year ago

  • vmtrace.c (fillidandklass): TracePoint#definedclass returns singleton class. set_trace_func' passed attached class (which is attached/modified by singleton class) by 6th block parameter if it is singleton class. Previous behavior follows this spec. However, this method nameddefinedclass' should return singleton class directly because singleton methods are defined in singleton class. There are no compatible issue because TracePoint is introduced after 2.0. But compatiblity with set_trace_func' is brokne. This means that you can not replace allsettracefunc' code with TracePoint without consideration of this behavior. [Bug #7554]
  • test/ruby/test_settracefunc.rb: change a test to catch up an above chagne.

History

#1 Updated by Koichi Sasada over 1 year ago

  • Description updated (diff)

#2 Updated by Koichi Sasada over 1 year ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r38430.
Koichi, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • vmtrace.c (fillidandklass): TracePoint#definedclass returns singleton class. set_trace_func' passed attached class (which is attached/modified by singleton class) by 6th block parameter if it is singleton class. Previous behavior follows this spec. However, this method nameddefinedclass' should return singleton class directly because singleton methods are defined in singleton class. There are no compatible issue because TracePoint is introduced after 2.0. But compatiblity with set_trace_func' is brokne. This means that you can not replace allsettracefunc' code with TracePoint without consideration of this behavior. [Bug #7554]
  • test/ruby/test_settracefunc.rb: change a test to catch up an above chagne.

Also available in: Atom PDF