summaryrefslogtreecommitdiffhomepage
path: root/src/variable.c
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-06-02 19:01:58 +0900
committerYukihiro Matsumoto <[email protected]>2012-06-02 19:01:58 +0900
commit98fb528f6f80ade0f08e9a373cb89848bc3ded13 (patch)
tree22ac4dd63e9fbf2fe6bc791f8ccb481c18171157 /src/variable.c
parent231cb59566752ef3f742307e2b7108a51f6b6c7e (diff)
parent92f192521865137c7e457b4a54c5df4ad2fbb049 (diff)
downloadmruby-98fb528f6f80ade0f08e9a373cb89848bc3ded13.tar.gz
mruby-98fb528f6f80ade0f08e9a373cb89848bc3ded13.zip
Merge branch 'master' of github.com:mruby/mruby
Diffstat (limited to 'src/variable.c')
-rw-r--r--src/variable.c35
1 files changed, 6 insertions, 29 deletions
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 */