diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-10-17 08:45:06 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-10-17 08:45:06 +0900 |
| commit | c96def7c96c50f3b8e22e47ce31a6c5a37939dfd (patch) | |
| tree | 2616d88f2332ecac7eedb2ff8ea4c52ffb456ba7 /src/variable.c | |
| parent | e59ad60327e9ebf554782609c5da2c0440ec8413 (diff) | |
| download | mruby-c96def7c96c50f3b8e22e47ce31a6c5a37939dfd.tar.gz mruby-c96def7c96c50f3b8e22e47ce31a6c5a37939dfd.zip | |
Remove top-level constant lookup; CRuby2.5
Diffstat (limited to 'src/variable.c')
| -rw-r--r-- | src/variable.c | 9 |
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 |
