diff options
author | Nobuyoshi Nakada <[email protected]> | 2018-12-13 18:27:32 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <[email protected]> | 2019-06-23 01:26:48 +0900 |
commit | 5084233b88cc48a74b58690423df1129668d5706 (patch) | |
tree | 34fad189e8de605ac2b40103d5a686edbeaa0dc6 | |
parent | 151843b9816b52b1ddb1e9b2040991a7de4173c6 (diff) |
Split global search for module
-rw-r--r-- | variable.c | 28 |
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) { |