Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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