From a7718c914a216457ca9d3806085e673eabda8b31 Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Thu, 15 Feb 2024 20:04:23 +0900 Subject: [PATCH] Do not show an anonymous class as a receiver --- test/ruby/test_backtrace.rb | 19 +++++++++++++++++++ variable.c | 6 ++++++ vm_backtrace.c | 11 +++++++---- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/test/ruby/test_backtrace.rb b/test/ruby/test_backtrace.rb index 50d37faa1d..60f9605e40 100644 --- a/test/ruby/test_backtrace.rb +++ b/test/ruby/test_backtrace.rb @@ -428,4 +428,23 @@ class TestBacktrace < Test::Unit::TestCase enum.next end; end + + def test_no_receiver_for_anonymous_class + err = ["-:2:in 'bar': unhandled exception", # Not '#.bar' + "\tfrom -:3:in '
'"] + assert_in_out_err([], <<-"end;", [], err) + foo = Class.new + def foo.bar = raise + foo.bar + end; + + err = ["-:3:in 'baz': unhandled exception", # Not '#::Bar.baz' + "\tfrom -:4:in '
'"] + assert_in_out_err([], <<-"end;", [], err) + foo = Class.new + foo::Bar = Class.new + def (foo::Bar).baz = raise + foo::Bar.baz + end; + end end diff --git a/variable.c b/variable.c index 7039baed6a..ab779f7420 100644 --- a/variable.c +++ b/variable.c @@ -111,6 +111,12 @@ classname(VALUE klass, bool *permanent) return classpath; } +VALUE +rb_mod_name0(VALUE klass, bool *permanent) +{ + return classname(klass, permanent); +} + /* * call-seq: * mod.name -> string diff --git a/vm_backtrace.c b/vm_backtrace.c index b1b9f54eb8..fa00c06f63 100644 --- a/vm_backtrace.c +++ b/vm_backtrace.c @@ -191,22 +191,25 @@ location_lineno_m(VALUE self) return INT2FIX(location_lineno(location_ptr(self))); } +VALUE rb_mod_name0(VALUE klass, bool *permanent); + static VALUE gen_method_name(VALUE owner, VALUE name) { + bool permanent; if (RB_TYPE_P(owner, T_CLASS) || RB_TYPE_P(owner, T_MODULE)) { if (RBASIC(owner)->flags & FL_SINGLETON) { VALUE v = RCLASS_ATTACHED_OBJECT(owner); if (RB_TYPE_P(v, T_CLASS) || RB_TYPE_P(v, T_MODULE)) { - v = rb_class_path(v); - if (!NIL_P(v)) { + v = rb_mod_name0(v, &permanent); + if (permanent && !NIL_P(v)) { return rb_sprintf("%"PRIsVALUE".%"PRIsVALUE, v, name); } } } else { - owner = rb_class_path(owner); - if (!NIL_P(owner)) { + owner = rb_mod_name0(owner, &permanent); + if (permanent && !NIL_P(owner)) { return rb_sprintf("%"PRIsVALUE"#%"PRIsVALUE, owner, name); } }