aboutsummaryrefslogtreecommitdiffstats
path: root/variable.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2018-12-13 18:27:32 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-06-23 01:26:48 +0900
commit5084233b88cc48a74b58690423df1129668d5706 (patch)
tree34fad189e8de605ac2b40103d5a686edbeaa0dc6 /variable.c
parent151843b9816b52b1ddb1e9b2040991a7de4173c6 (diff)
downloadruby-5084233b88cc48a74b58690423df1129668d5706.tar.gz
Split global search for module
Diffstat (limited to 'variable.c')
-rw-r--r--variable.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/variable.c b/variable.c
index 6394e01241..296e58a742 100644
--- a/variable.c
+++ b/variable.c
@@ -2385,14 +2385,11 @@ rb_const_get_0(VALUE klass, ID id, int exclude, int recurse, int visibility)
}
static VALUE
-rb_const_search(VALUE klass, ID id, int exclude, int recurse, int visibility)
+rb_const_search_from(VALUE klass, ID id, int exclude, int recurse, int visibility)
{
- VALUE value, tmp, av;
- rb_const_flag_t flag;
- int mod_retry = 0;
+ VALUE value, tmp;
tmp = klass;
- retry:
while (RTEST(tmp)) {
VALUE am = 0;
rb_const_entry_t *ce;
@@ -2414,7 +2411,7 @@ rb_const_search(VALUE klass, ID id, int exclude, int recurse, int visibility)
rb_autoload_load(tmp, id);
continue;
}
- if (exclude && tmp == rb_cObject && klass != rb_cObject) {
+ if (exclude && tmp == rb_cObject) {
goto not_found;
}
return value;
@@ -2422,17 +2419,26 @@ rb_const_search(VALUE klass, ID id, int exclude, int recurse, int visibility)
if (!recurse) break;
tmp = RCLASS_SUPER(tmp);
}
- if (!exclude && !mod_retry && BUILTIN_TYPE(klass) == T_MODULE) {
- mod_retry = 1;
- tmp = rb_cObject;
- goto retry;
- }
not_found:
GET_EC()->private_const_reference = 0;
return Qundef;
}
+static VALUE
+rb_const_search(VALUE klass, ID id, int exclude, int recurse, int visibility)
+{
+ VALUE value;
+
+ if (klass == rb_cObject) exclude = FALSE;
+ value = rb_const_search_from(klass, id, exclude, recurse, visibility);
+ if (value != Qundef) return value;
+ if (exclude) return value;
+ if (BUILTIN_TYPE(klass) != T_MODULE) return value;
+ /* search global const too, if klass is a module */
+ return rb_const_search_from(rb_cObject, id, FALSE, recurse, visibility);
+}
+
VALUE
rb_const_get_from(VALUE klass, ID id)
{