From 5084233b88cc48a74b58690423df1129668d5706 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 13 Dec 2018 18:27:32 +0900 Subject: Split global search for module --- variable.c | 28 +++++++++++++++++----------- 1 file 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) { -- cgit v1.2.3