summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--object.c13
-rw-r--r--test/ruby/test_module.rb21
2 files changed, 24 insertions, 10 deletions
diff --git a/object.c b/object.c
index 9b8ca7400b..81c5c5643f 100644
--- a/object.c
+++ b/object.c
@@ -2134,16 +2134,16 @@ rb_mod_const_get(int argc, VALUE *argv, VALUE mod)
}
if (!id) {
- if (!ISUPPER(*pbeg) || !rb_enc_symname2_p(pbeg, len, enc)) {
- part = rb_str_subseq(name, beglen, len);
+ part = rb_str_subseq(name, beglen, len);
+ OBJ_FREEZE(part);
+ if (!ISUPPER(*pbeg) || !rb_is_const_name(part)) {
rb_name_error_str(part, "wrong constant name %"PRIsVALUE,
QUOTE(part));
}
else if (!rb_method_basic_definition_p(CLASS_OF(mod), id_const_missing)) {
- id = rb_intern3(pbeg, len, enc);
+ id = rb_intern_str(part);
}
else {
- part = rb_str_subseq(name, beglen, len);
rb_name_error_str(part, "uninitialized constant %"PRIsVALUE"%"PRIsVALUE,
rb_str_subseq(name, 0, beglen),
QUOTE(part));
@@ -2271,8 +2271,9 @@ rb_mod_const_defined(int argc, VALUE *argv, VALUE mod)
}
if (!id) {
- if (!ISUPPER(*pbeg) || !rb_enc_symname2_p(pbeg, len, enc)) {
- part = rb_str_subseq(name, beglen, len);
+ part = rb_str_subseq(name, beglen, len);
+ OBJ_FREEZE(part);
+ if (!ISUPPER(*pbeg) || !rb_is_const_name(part)) {
rb_name_error_str(part, "wrong constant name %"PRIsVALUE,
QUOTE(part));
}
diff --git a/test/ruby/test_module.rb b/test/ruby/test_module.rb
index 5b5e04b0da..4f834f0c1e 100644
--- a/test/ruby/test_module.rb
+++ b/test/ruby/test_module.rb
@@ -240,7 +240,7 @@ class TestModule < Test::Unit::TestCase
assert_not_operator(Math, :const_defined?, "IP")
end
- def test_bad_constants
+ def each_bad_constants(m, &b)
[
"#<Class:0x7b8b718b>",
":Object",
@@ -248,15 +248,28 @@ class TestModule < Test::Unit::TestCase
":",
["String::", "[Bug #7573]"],
"\u3042",
+ "Name?",
].each do |name, msg|
expected = "wrong constant name %s" % quote(name)
msg = "#{msg}#{': ' if msg}wrong constant name #{name.dump}"
- assert_raise_with_message(NameError, expected, msg) {
- Object.const_get name
- }
+ assert_raise_with_message(NameError, expected, "#{msg} to #{m}") do
+ yield name
+ end
end
end
+ def test_bad_constants_get
+ each_bad_constants("get") {|name|
+ Object.const_get name
+ }
+ end
+
+ def test_bad_constants_defined
+ each_bad_constants("defined?") {|name|
+ Object.const_defined? name
+ }
+ end
+
def test_leading_colons
assert_equal Object, AClass.const_get('::Object')
end