class.c: refine error messages
* class.c (rb_define_class, rb_define_class_id_under): refine error messages. * class.c (rb_define_module, rb_define_module_id_under): ditto, and make consistent with class. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51958 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
dca6009c3e
commit
eb47de3005
@ -1,3 +1,11 @@
|
|||||||
|
Sun Sep 27 23:32:46 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* class.c (rb_define_class, rb_define_class_id_under): refine
|
||||||
|
error messages.
|
||||||
|
|
||||||
|
* class.c (rb_define_module, rb_define_module_id_under): ditto,
|
||||||
|
and make consistent with class.
|
||||||
|
|
||||||
Sun Sep 27 18:44:43 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
|
Sun Sep 27 18:44:43 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
|
||||||
|
|
||||||
* ChangeLog: removed duplicated message.
|
* ChangeLog: removed duplicated message.
|
||||||
|
31
class.c
31
class.c
@ -636,7 +636,8 @@ rb_define_class(const char *name, VALUE super)
|
|||||||
if (rb_const_defined(rb_cObject, id)) {
|
if (rb_const_defined(rb_cObject, id)) {
|
||||||
klass = rb_const_get(rb_cObject, id);
|
klass = rb_const_get(rb_cObject, id);
|
||||||
if (!RB_TYPE_P(klass, T_CLASS)) {
|
if (!RB_TYPE_P(klass, T_CLASS)) {
|
||||||
rb_raise(rb_eTypeError, "%s is not a class", name);
|
rb_raise(rb_eTypeError, "%s is not a class (%"PRIsVALUE")",
|
||||||
|
name, rb_obj_class(klass));
|
||||||
}
|
}
|
||||||
if (rb_class_real(RCLASS_SUPER(klass)) != super) {
|
if (rb_class_real(RCLASS_SUPER(klass)) != super) {
|
||||||
rb_raise(rb_eTypeError, "superclass mismatch for class %s", name);
|
rb_raise(rb_eTypeError, "superclass mismatch for class %s", name);
|
||||||
@ -703,11 +704,15 @@ rb_define_class_id_under(VALUE outer, ID id, VALUE super)
|
|||||||
if (rb_const_defined_at(outer, id)) {
|
if (rb_const_defined_at(outer, id)) {
|
||||||
klass = rb_const_get_at(outer, id);
|
klass = rb_const_get_at(outer, id);
|
||||||
if (!RB_TYPE_P(klass, T_CLASS)) {
|
if (!RB_TYPE_P(klass, T_CLASS)) {
|
||||||
rb_raise(rb_eTypeError, "%"PRIsVALUE" is not a class", rb_id2str(id));
|
rb_raise(rb_eTypeError, "%"PRIsVALUE"::%"PRIsVALUE" is not a class"
|
||||||
|
" (%"PRIsVALUE")",
|
||||||
|
outer, rb_id2str(id), rb_obj_class(klass));
|
||||||
}
|
}
|
||||||
if (rb_class_real(RCLASS_SUPER(klass)) != super) {
|
if (rb_class_real(RCLASS_SUPER(klass)) != super) {
|
||||||
rb_raise(rb_eTypeError, "superclass mismatch for class %"PRIsVALUE"",
|
rb_raise(rb_eTypeError, "superclass mismatch for class "
|
||||||
rb_id2str(id));
|
"%"PRIsVALUE"::%"PRIsVALUE""
|
||||||
|
" (%"PRIsVALUE" is given but was %"PRIsVALUE")",
|
||||||
|
outer, rb_id2str(id), RCLASS_SUPER(klass), super);
|
||||||
}
|
}
|
||||||
return klass;
|
return klass;
|
||||||
}
|
}
|
||||||
@ -752,9 +757,11 @@ rb_define_module(const char *name)
|
|||||||
id = rb_intern(name);
|
id = rb_intern(name);
|
||||||
if (rb_const_defined(rb_cObject, id)) {
|
if (rb_const_defined(rb_cObject, id)) {
|
||||||
module = rb_const_get(rb_cObject, id);
|
module = rb_const_get(rb_cObject, id);
|
||||||
if (RB_TYPE_P(module, T_MODULE))
|
if (!RB_TYPE_P(module, T_MODULE)) {
|
||||||
return module;
|
rb_raise(rb_eTypeError, "%s is not a module (%"PRIsVALUE")",
|
||||||
rb_raise(rb_eTypeError, "%s is not a module", rb_obj_classname(module));
|
name, rb_obj_class(module));
|
||||||
|
}
|
||||||
|
return module;
|
||||||
}
|
}
|
||||||
module = rb_define_module_id(id);
|
module = rb_define_module_id(id);
|
||||||
rb_vm_add_root_module(id, module);
|
rb_vm_add_root_module(id, module);
|
||||||
@ -776,10 +783,12 @@ rb_define_module_id_under(VALUE outer, ID id)
|
|||||||
|
|
||||||
if (rb_const_defined_at(outer, id)) {
|
if (rb_const_defined_at(outer, id)) {
|
||||||
module = rb_const_get_at(outer, id);
|
module = rb_const_get_at(outer, id);
|
||||||
if (RB_TYPE_P(module, T_MODULE))
|
if (!RB_TYPE_P(module, T_MODULE)) {
|
||||||
return module;
|
rb_raise(rb_eTypeError, "%"PRIsVALUE"::%"PRIsVALUE" is not a module"
|
||||||
rb_raise(rb_eTypeError, "%s::%s is not a module",
|
" (%"PRIsVALUE")",
|
||||||
rb_class2name(outer), rb_obj_classname(module));
|
outer, rb_id2str(id), rb_obj_class(module));
|
||||||
|
}
|
||||||
|
return module;
|
||||||
}
|
}
|
||||||
module = rb_define_module_id(id);
|
module = rb_define_module_id(id);
|
||||||
rb_const_set(outer, id, module);
|
rb_const_set(outer, id, module);
|
||||||
|
@ -547,5 +547,12 @@ class TestClass < Test::Unit::TestCase
|
|||||||
assert_raise_with_message(TypeError, "#{n} is not a class") {
|
assert_raise_with_message(TypeError, "#{n} is not a class") {
|
||||||
m.module_eval "class #{n}; end"
|
m.module_eval "class #{n}; end"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert_separately([], <<-"end;")
|
||||||
|
Date = (class C\u{1f5ff}; self; end).new
|
||||||
|
assert_raise_with_message(TypeError, /C\u{1f5ff}/) {
|
||||||
|
require 'date'
|
||||||
|
}
|
||||||
|
end;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -2103,6 +2103,13 @@ class TestModule < Test::Unit::TestCase
|
|||||||
assert_raise_with_message(TypeError, "#{n} is not a module") {
|
assert_raise_with_message(TypeError, "#{n} is not a module") {
|
||||||
m.module_eval "module #{n}; end"
|
m.module_eval "module #{n}; end"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert_separately([], <<-"end;")
|
||||||
|
Etc = (class C\u{1f5ff}; self; end).new
|
||||||
|
assert_raise_with_message(TypeError, /C\u{1f5ff}/) {
|
||||||
|
require 'etc'
|
||||||
|
}
|
||||||
|
end;
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
Loading…
x
Reference in New Issue
Block a user