зеркало из https://github.com/github/ruby.git
object.c: fix searching nested const paths
* object.c (rb_mod_const_get, rb_mod_const_defined): nested const paths should not search from toplevel constants. [ruby-core:92202] [Bug #15758] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67472 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
e1b592b508
Коммит
d10451f3fd
31
object.c
31
object.c
|
@ -2526,7 +2526,19 @@ rb_mod_const_get(int argc, VALUE *argv, VALUE mod)
|
|||
name = ID2SYM(id);
|
||||
goto wrong_name;
|
||||
}
|
||||
mod = RTEST(recur) ? rb_const_get(mod, id) : rb_const_get_at(mod, id);
|
||||
#if 0
|
||||
mod = rb_const_get_0(mod, id, beglen > 0 || !RTEST(recur), RTEST(recur), FALSE);
|
||||
#else
|
||||
if (!RTEST(recur)) {
|
||||
mod = rb_const_get_at(mod, id);
|
||||
}
|
||||
else if (beglen == 0) {
|
||||
mod = rb_const_get(mod, id);
|
||||
}
|
||||
else {
|
||||
mod = rb_const_get_from(mod, id);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
return mod;
|
||||
|
@ -2674,16 +2686,27 @@ rb_mod_const_defined(int argc, VALUE *argv, VALUE mod)
|
|||
name = ID2SYM(id);
|
||||
goto wrong_name;
|
||||
}
|
||||
if (RTEST(recur)) {
|
||||
|
||||
#if 0
|
||||
mod = rb_const_search(mod, id, beglen > 0 || !RTEST(recur), RTEST(recur), FALSE);
|
||||
if (mod == Qundef) return Qfalse;
|
||||
#else
|
||||
if (!RTEST(recur)) {
|
||||
if (!rb_const_defined_at(mod, id))
|
||||
return Qfalse;
|
||||
mod = rb_const_get_at(mod, id);
|
||||
}
|
||||
else if (beglen == 0) {
|
||||
if (!rb_const_defined(mod, id))
|
||||
return Qfalse;
|
||||
mod = rb_const_get(mod, id);
|
||||
}
|
||||
else {
|
||||
if (!rb_const_defined_at(mod, id))
|
||||
if (!rb_const_defined_from(mod, id))
|
||||
return Qfalse;
|
||||
mod = rb_const_get_at(mod, id);
|
||||
mod = rb_const_get_from(mod, id);
|
||||
}
|
||||
#endif
|
||||
|
||||
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",
|
||||
|
|
|
@ -296,6 +296,9 @@ class TestModule < Test::Unit::TestCase
|
|||
def test_nested_get
|
||||
assert_equal Other, Object.const_get([self.class, 'Other'].join('::'))
|
||||
assert_equal User::USER, self.class.const_get([User, 'USER'].join('::'))
|
||||
assert_raise(NameError) {
|
||||
Object.const_get([self.class.name, 'String'].join('::'))
|
||||
}
|
||||
end
|
||||
|
||||
def test_nested_get_symbol
|
||||
|
@ -328,6 +331,7 @@ class TestModule < Test::Unit::TestCase
|
|||
assert_send([Object, :const_defined?, [self.class.name, 'Other'].join('::')])
|
||||
assert_send([self.class, :const_defined?, 'User::USER'])
|
||||
assert_not_send([self.class, :const_defined?, 'User::Foo'])
|
||||
assert_not_send([Object, :const_defined?, [self.class.name, 'String'].join('::')])
|
||||
end
|
||||
|
||||
def test_nested_defined_symbol
|
||||
|
|
Загрузка…
Ссылка в новой задаче