aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--test/ruby/test_settracefunc.rb23
-rw-r--r--vm_trace.c2
2 files changed, 24 insertions, 1 deletions
diff --git a/test/ruby/test_settracefunc.rb b/test/ruby/test_settracefunc.rb
index 05d774016b..f869f574a7 100644
--- a/test/ruby/test_settracefunc.rb
+++ b/test/ruby/test_settracefunc.rb
@@ -70,6 +70,29 @@ class TestSetTraceFunc < Test::Unit::TestCase
assert_nil(binding)
end
+ def test_c_call_removed_method
+ # [Bug #19305]
+ klass = Class.new do
+ attr_writer :bar
+ alias_method :set_bar, :bar=
+ remove_method :bar=
+ end
+
+ obj = klass.new
+ method_id = nil
+ parameters = nil
+
+ TracePoint.new(:c_call) { |tp|
+ method_id = tp.method_id
+ parameters = tp.parameters
+ }.enable {
+ obj.set_bar(1)
+ }
+
+ assert_equal(:bar=, method_id)
+ assert_equal([[:req]], parameters)
+ end
+
def test_call
events = []
name = "#{self.class}\##{__method__}"
diff --git a/vm_trace.c b/vm_trace.c
index 3051266c57..20fade5fd9 100644
--- a/vm_trace.c
+++ b/vm_trace.c
@@ -915,7 +915,7 @@ rb_tracearg_parameters(rb_trace_arg_t *trace_arg)
if (trace_arg->klass && trace_arg->id) {
const rb_method_entry_t *me;
VALUE iclass = Qnil;
- me = rb_method_entry_without_refinements(trace_arg->klass, trace_arg->id, &iclass);
+ me = rb_method_entry_without_refinements(trace_arg->klass, trace_arg->called_id, &iclass);
return rb_unnamed_parameters(rb_method_entry_arity(me));
}
break;