Commit b00529e6 authored by Yukihiro Matsumoto's avatar Yukihiro Matsumoto

reduce invoking const_missing

parent 9ccf9767
...@@ -309,7 +309,8 @@ const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym) ...@@ -309,7 +309,8 @@ const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym)
struct RClass *c = base; struct RClass *c = base;
khash_t(iv) *h; khash_t(iv) *h;
khiter_t k; khiter_t k;
mrb_sym cm = mrb_intern(mrb, "const_missing"); int retry = 0;
mrb_sym cm;
L_RETRY: L_RETRY:
while (c) { while (c) {
...@@ -319,18 +320,23 @@ const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym) ...@@ -319,18 +320,23 @@ const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym)
if (k != kh_end(h)) { if (k != kh_end(h)) {
return kh_value(h, k); return kh_value(h, k);
} }
if (mrb_respond_to(mrb, mrb_obj_value(c), cm)) {
mrb_value name = mrb_symbol_value(sym);
return mrb_funcall(mrb, mrb_obj_value(c), "const_missing", 1, name);
}
} }
c = c->super; c = c->super;
} }
if (!retry && base->tt == MRB_TT_MODULE) {
if (base->tt == MRB_TT_MODULE) { c = mrb->object_class;
c = base = mrb->object_class; retry = 1;
goto L_RETRY; goto L_RETRY;
} }
c = base;
cm = mrb_intern(mrb, "const_missing");
while (c) {
if (mrb_respond_to(mrb, mrb_obj_value(c), cm)) {
mrb_value name = mrb_symbol_value(sym);
return mrb_funcall(mrb, mrb_obj_value(c), "const_missing", 1, name);
}
c = c->super;
}
mrb_raise(mrb, E_NAME_ERROR, "uninitialized constant %s", mrb_raise(mrb, E_NAME_ERROR, "uninitialized constant %s",
mrb_sym2name(mrb, sym)); mrb_sym2name(mrb, sym));
/* not reached */ /* not reached */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment