diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-12-17 20:28:51 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-12-17 20:28:51 +0000 |
commit | 6247099f4c85a43c0405d1f4536cea99b37a652a (patch) | |
tree | 0c75755809a4c683dac52dc02f4ab85b18de7c7b /vm_trace.c | |
parent | 4654d75ea31041d5ab90a4ead43b53743f20f391 (diff) | |
download | ruby-6247099f4c85a43c0405d1f4536cea99b37a652a.tar.gz |
* vm_trace.c (fill_id_and_klass): TracePoint#defined_class 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 named `defined_class' 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 all `set_trace_func' code with TracePoint
without consideration of this behavior.
[Bug #7554]
* test/ruby/test_settracefunc.rb: change a test to catch up
an above chagne.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38430 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_trace.c')
-rw-r--r-- | vm_trace.c | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/vm_trace.c b/vm_trace.c index 9b8ec40b33..ec5fe4f2dd 100644 --- a/vm_trace.c +++ b/vm_trace.c @@ -716,9 +716,6 @@ fill_id_and_klass(rb_trace_arg_t *trace_arg) 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; @@ -838,7 +835,36 @@ tracepoint_attr_method_id(VALUE tpval) } /* - * Return class or id from +:class+ event + * Return class or module the method being called. + * + * class C; def foo; end; end + * trace = TracePoint.new(:call) do |tp| + * tp.defined_class #=> C + * end.enable do + * C.new.foo + * end + * + * If method is defined by a module, then returns that module. + * + * module M; def foo; end; end + * class C; include M; end; + * trace = TracePoint.new(:call) do |tp| + * tp.defined_class #=> M + * end.enable do + * C.new.foo + * end + * + * Note that TracePont#defined_class returns singleton class. + * 6th block parameter of `set_trace_func' passes original class + * of attached by singleton class. This is a difference between + * `set_trace_func' and TracePoint. + * + * class C; def self.foo; end; end + * trace = TracePoint.new(:call) do |tp| + * tp.defined_class #=> #<Class:C> + * end.enable do + * C.foo + * end */ static VALUE tracepoint_attr_defined_class(VALUE tpval) |