summaryrefslogtreecommitdiffhomepage
path: root/src/variable.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-10-17 08:45:06 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-10-17 08:45:06 +0900
commitc96def7c96c50f3b8e22e47ce31a6c5a37939dfd (patch)
tree2616d88f2332ecac7eedb2ff8ea4c52ffb456ba7 /src/variable.c
parente59ad60327e9ebf554782609c5da2c0440ec8413 (diff)
downloadmruby-c96def7c96c50f3b8e22e47ce31a6c5a37939dfd.tar.gz
mruby-c96def7c96c50f3b8e22e47ce31a6c5a37939dfd.zip
Remove top-level constant lookup; CRuby2.5
Diffstat (limited to 'src/variable.c')
-rw-r--r--src/variable.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/variable.c b/src/variable.c
index 50fc70682..4fbe82dd9 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -663,17 +663,18 @@ mod_const_check(mrb_state *mrb, mrb_value mod)
}
static mrb_value
-const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym)
+const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym, mrb_bool top)
{
struct RClass *c = base;
mrb_value v;
iv_tbl *t;
mrb_bool retry = FALSE;
mrb_value name;
+ struct RClass *oclass = mrb->object_class;
L_RETRY:
while (c) {
- if (c->iv) {
+ if (c->iv && (top || c != oclass || base == oclass)) {
t = c->iv;
if (iv_get(mrb, t, sym, &v))
return v;
@@ -693,7 +694,7 @@ MRB_API mrb_value
mrb_const_get(mrb_state *mrb, mrb_value mod, mrb_sym sym)
{
mod_const_check(mrb, mod);
- return const_get(mrb, mrb_class_ptr(mod), sym);
+ return const_get(mrb, mrb_class_ptr(mod), sym, FALSE);
}
mrb_value
@@ -729,7 +730,7 @@ mrb_vm_const_get(mrb_state *mrb, mrb_sym sym)
}
irep = irep->outer;
}
- return const_get(mrb, c, sym);
+ return const_get(mrb, c, sym, TRUE);
}
MRB_API void