Skip to content

Commit

Permalink
Do not show an anonymous class as a receiver
Browse files Browse the repository at this point in the history
  • Loading branch information
mame committed Feb 15, 2024
1 parent 0da12fa commit a7718c9
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 4 deletions.
19 changes: 19 additions & 0 deletions test/ruby/test_backtrace.rb
Original file line number Diff line number Diff line change
Expand Up @@ -428,4 +428,23 @@ def foo
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
6 changes: 6 additions & 0 deletions variable.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
11 changes: 7 additions & 4 deletions vm_backtrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Expand Down

0 comments on commit a7718c9

Please sign in to comment.