From d10451f3fd51f577e704db770de48d05044eb45c Mon Sep 17 00:00:00 2001 From: nobu Date: Mon, 8 Apr 2019 13:47:37 +0000 Subject: 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 --- object.c | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) (limited to 'object.c') diff --git a/object.c b/object.c index d31755323e..35f07d995d 100644 --- a/object.c +++ b/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 (!rb_const_defined(mod, id)) - return Qfalse; - mod = rb_const_get(mod, id); - } - else { + +#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_from(mod, id)) + return Qfalse; + 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", -- cgit v1.2.3