summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2018-12-13 18:12:07 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-06-23 01:26:42 +0900
commit151843b9816b52b1ddb1e9b2040991a7de4173c6 (patch)
tree11589ad540d3a8e864f0fe2906dff8bf68802521
parentc033dc3073839e3578f1ba25d53b837974b56474 (diff)
Hoisted out autoloading_const_entry
-rw-r--r--variable.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/variable.c b/variable.c
index 7c0857921d..6394e01241 100644
--- a/variable.c
+++ b/variable.c
@@ -2138,9 +2138,26 @@ check_autoload_required(VALUE mod, ID id, const char **loadingpath)
return 0;
}
+struct autoload_const *autoloading_const_entry(VALUE mod, ID id);
+
MJIT_FUNC_EXPORTED int
rb_autoloading_value(VALUE mod, ID id, VALUE* value, rb_const_flag_t *flag)
{
+ struct autoload_const *ac = autoloading_const_entry(mod, id);
+ if (!ac) return FALSE;
+
+ if (value) {
+ *value = ac->value;
+ }
+ if (flag) {
+ *flag = ac->flag;
+ }
+ return TRUE;
+}
+
+struct autoload_const *
+autoloading_const_entry(VALUE mod, ID id)
+{
VALUE load = autoload_data(mod, id);
struct autoload_data_i *ele;
struct autoload_const *ac;
@@ -2151,13 +2168,7 @@ rb_autoloading_value(VALUE mod, ID id, VALUE* value, rb_const_flag_t *flag)
if (ele->state && ele->state->thread == rb_thread_current()) {
if (ac->value != Qundef) {
- if (value) {
- *value = ac->value;
- }
- if (flag) {
- *flag = ac->flag;
- }
- return 1;
+ return ac;
}
}
return 0;
@@ -2395,9 +2406,11 @@ rb_const_search(VALUE klass, ID id, int exclude, int recurse, int visibility)
rb_const_warn_if_deprecated(ce, tmp, id);
value = ce->value;
if (value == Qundef) {
+ struct autoload_const *ac;
if (am == tmp) break;
am = tmp;
- if (rb_autoloading_value(tmp, id, &av, &flag)) return av;
+ ac = autoloading_const_entry(tmp, id);
+ if (ac) return ac->value;
rb_autoload_load(tmp, id);
continue;
}