Use receiver #name rather than #inspect to build NameError message
This commit is contained in:
parent
4e1f2283b4
commit
385ac07fd8
Notes:
git
2020-05-26 14:10:58 +09:00
15
error.c
15
error.c
@ -1761,6 +1761,17 @@ name_err_mesg_equal(VALUE obj1, VALUE obj2)
|
|||||||
return Qtrue;
|
return Qtrue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* :nodoc: */
|
||||||
|
static VALUE
|
||||||
|
name_err_mesg_receiver_name(VALUE obj)
|
||||||
|
{
|
||||||
|
if (RB_SPECIAL_CONST_P(obj)) return Qundef;
|
||||||
|
if (RB_BUILTIN_TYPE(obj) == T_MODULE || RB_BUILTIN_TYPE(obj) == T_CLASS) {
|
||||||
|
return rb_check_funcall(obj, rb_intern("name"), 0, 0);
|
||||||
|
}
|
||||||
|
return Qundef;
|
||||||
|
}
|
||||||
|
|
||||||
/* :nodoc: */
|
/* :nodoc: */
|
||||||
static VALUE
|
static VALUE
|
||||||
name_err_mesg_to_str(VALUE obj)
|
name_err_mesg_to_str(VALUE obj)
|
||||||
@ -1789,7 +1800,9 @@ name_err_mesg_to_str(VALUE obj)
|
|||||||
d = FAKE_CSTR(&d_str, "false");
|
d = FAKE_CSTR(&d_str, "false");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
d = rb_protect(rb_inspect, obj, &state);
|
d = rb_protect(name_err_mesg_receiver_name, obj, &state);
|
||||||
|
if (state || d == Qundef || d == Qnil)
|
||||||
|
d = rb_protect(rb_inspect, obj, &state);
|
||||||
if (state)
|
if (state)
|
||||||
rb_set_errinfo(Qnil);
|
rb_set_errinfo(Qnil);
|
||||||
if (NIL_P(d)) {
|
if (NIL_P(d)) {
|
||||||
|
@ -154,6 +154,36 @@ describe "Literal (A::X) constant resolution" do
|
|||||||
-> { ConstantSpecs::ParentA::CS_CONSTX }.should raise_error(NameError)
|
-> { ConstantSpecs::ParentA::CS_CONSTX }.should raise_error(NameError)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
ruby_version_is "2.8" do
|
||||||
|
it "uses the module or class #name to craft the error message" do
|
||||||
|
mod = Module.new do
|
||||||
|
def self.name
|
||||||
|
"ModuleName"
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.inspect
|
||||||
|
"<unusable info>"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-> { mod::DOES_NOT_EXIST }.should raise_error(NameError, /uninitialized constant ModuleName::DOES_NOT_EXIST/)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "uses the module or class #inspect to craft the error message if they are anonymous" do
|
||||||
|
mod = Module.new do
|
||||||
|
def self.name
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.inspect
|
||||||
|
"<unusable info>"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-> { mod::DOES_NOT_EXIST }.should raise_error(NameError, /uninitialized constant <unusable info>::DOES_NOT_EXIST/)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
it "sends #const_missing to the original class or module scope" do
|
it "sends #const_missing to the original class or module scope" do
|
||||||
ConstantSpecs::ClassA::CS_CONSTX.should == :CS_CONSTX
|
ConstantSpecs::ClassA::CS_CONSTX.should == :CS_CONSTX
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user