Fix `Module#const_defined?` on inherited constants

[Fix GH-2061]

From: manga_osyo <manga.osyo@gmail.com>

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66938 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2019-01-28 13:32:32 +00:00
Родитель dd4fdb32bd
Коммит 7fa16fd962
2 изменённых файлов: 11 добавлений и 1 удалений

Просмотреть файл

@ -2688,7 +2688,6 @@ rb_mod_const_defined(int argc, VALUE *argv, VALUE mod)
return Qfalse;
mod = rb_const_get_at(mod, id);
}
recur = Qfalse;
if (p < pend && !RB_TYPE_P(mod, T_MODULE) && !RB_TYPE_P(mod, T_CLASS)) {
rb_raise(rb_eTypeError, "%"PRIsVALUE" does not refer to class/module",

Просмотреть файл

@ -338,6 +338,17 @@ class TestModule < Test::Unit::TestCase
assert_raise(NameError) {self.class.const_defined?(const)}
end
def test_nested_defined_inheritance
assert_send([Object, :const_defined?, [self.class.name, 'User', 'MIXIN'].join('::')])
assert_send([self.class, :const_defined?, 'User::MIXIN'])
assert_send([Object, :const_defined?, 'File::SEEK_SET'])
# const_defined? with `false`
assert_not_send([Object, :const_defined?, [self.class.name, 'User', 'MIXIN'].join('::'), false])
assert_not_send([self.class, :const_defined?, 'User::MIXIN', false])
assert_not_send([Object, :const_defined?, 'File::SEEK_SET', false])
end
def test_nested_defined_bad_class
assert_raise(TypeError) do
self.class.const_defined?('User::USER::Foo')