summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYusuke Endoh <[email protected]>2024-02-15 20:04:23 +0900
committerYusuke Endoh <[email protected]>2024-02-15 20:43:11 +0900
commita7718c914a216457ca9d3806085e673eabda8b31 (patch)
tree99f122f32afba7f5c8407c6ac3eecd2bebc1c364
parent0da12fa34e904603d2aa84e25924a3fde8a44f39 (diff)
Do not show an anonymous class as a receiver
-rw-r--r--test/ruby/test_backtrace.rb19
-rw-r--r--variable.c6
-rw-r--r--vm_backtrace.c11
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 '#<Class:0xXXX>.bar'
+ "\tfrom -:3:in '<main>'"]
+ assert_in_out_err([], <<-"end;", [], err)
+ foo = Class.new
+ def foo.bar = raise
+ foo.bar
+ end;
+
+ err = ["-:3:in 'baz': unhandled exception", # Not '#<Class:0xXXX>::Bar.baz'
+ "\tfrom -:4:in '<main>'"]
+ 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);
}
}