diff options
| author | Yukihiro Matsumoto <[email protected]> | 2012-06-02 19:01:58 +0900 |
|---|---|---|
| committer | Yukihiro Matsumoto <[email protected]> | 2012-06-02 19:01:58 +0900 |
| commit | 98fb528f6f80ade0f08e9a373cb89848bc3ded13 (patch) | |
| tree | 22ac4dd63e9fbf2fe6bc791f8ccb481c18171157 | |
| parent | 231cb59566752ef3f742307e2b7108a51f6b6c7e (diff) | |
| parent | 92f192521865137c7e457b4a54c5df4ad2fbb049 (diff) | |
| download | mruby-98fb528f6f80ade0f08e9a373cb89848bc3ded13.tar.gz mruby-98fb528f6f80ade0f08e9a373cb89848bc3ded13.zip | |
Merge branch 'master' of github.com:mruby/mruby
| -rw-r--r-- | AUTHORS | 1 | ||||
| -rw-r--r-- | src/variable.c | 35 |
2 files changed, 7 insertions, 29 deletions
@@ -6,3 +6,4 @@ Original Authors "mruby developers" are: Daniel Bovensiepen Jon Maken Bjorn De Meyer + Yuichiro MASUI diff --git a/src/variable.c b/src/variable.c index a17484903..33cd6ba14 100644 --- a/src/variable.c +++ b/src/variable.c @@ -186,7 +186,7 @@ mrb_vm_cv_set(mrb_state *mrb, mrb_sym sym, mrb_value v) if (k != kh_end(h)) { k = kh_put(iv, h, sym); kh_value(h, k) = v; - return; + return; } } c = c->super; @@ -233,26 +233,8 @@ const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym) struct RClass *c = base; khash_t(iv) *h; khiter_t k; + mrb_sym cm = mrb_intern(mrb, "const_missing"); - if (c->iv) { - h = c->iv; - k = kh_get(iv, h, sym); - if (k != kh_end(h)) { - return kh_value(h, k); - } - } - for (;;) { - c = mrb_class_outer_module(mrb, c); - if (!c) break; - if (c->iv) { - h = c->iv; - k = kh_get(iv, h, sym); - if (k != kh_end(h)) { - return kh_value(h, k); - } - } - } - c = base->super; while (c) { if (c->iv) { h = c->iv; @@ -260,19 +242,14 @@ const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym) if (k != kh_end(h)) { return kh_value(h, k); } + if (mrb_respond_to(mrb, mrb_obj_value(c), cm)) { + mrb_value argv = mrb_symbol_value(sym); + return mrb_funcall_argv(mrb, mrb_obj_value(c), "const_missing", 1, &argv); + } } c = c->super; } - if (!c) { - c = mrb->object_class; - } - - if (mrb_respond_to(mrb, mrb_obj_value(c), mrb_intern(mrb, "const_missing"))) { - mrb_value argv = mrb_symbol_value(sym); - return mrb_funcall_argv(mrb, mrb_obj_value(c), "const_missing", 1, &argv); - } - mrb_raise(mrb, E_NAME_ERROR, "uninitialized constant %s", mrb_sym2name(mrb, sym)); /* not reached */ |
