From 6069a33089916d7059c2bd2aeddc02a3eb440520 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Tue, 23 Oct 2012 09:42:22 +0900 Subject: mrb_raisef(): new function. Same as previou version of mrb_raise(). mrb_raise(): API modified. It cannot treat variable arguments. --- src/variable.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/variable.c') diff --git a/src/variable.c b/src/variable.c index 74dfc02c9..e3e4c4fb5 100644 --- a/src/variable.c +++ b/src/variable.c @@ -712,7 +712,7 @@ const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym) } c = c->super; } - mrb_raise(mrb, E_NAME_ERROR, "uninitialized constant %s", + mrb_raisef(mrb, E_NAME_ERROR, "uninitialized constant %s", mrb_sym2name(mrb, sym)); /* not reached */ return mrb_nil_value(); -- cgit v1.2.3 From 559933f577d5073464aa06facc1b754de6225d8a Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 26 Oct 2012 20:46:02 +0900 Subject: singleton classes should be able to have instance variables; close #509 --- src/variable.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src/variable.c') diff --git a/src/variable.c b/src/variable.c index e3e4c4fb5..7f9274ee4 100644 --- a/src/variable.c +++ b/src/variable.c @@ -420,6 +420,7 @@ obj_iv_p(mrb_value obj) case MRB_TT_OBJECT: case MRB_TT_CLASS: case MRB_TT_MODULE: + case MRB_TT_SCLASS: case MRB_TT_HASH: case MRB_TT_DATA: return TRUE; -- cgit v1.2.3 From ec343a64217a4825a97d4ef469699445f86a30e7 Mon Sep 17 00:00:00 2001 From: skandhas Date: Tue, 30 Oct 2012 14:00:58 +0800 Subject: fix cannot get/set const variable form singleton class --- src/variable.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src/variable.c') diff --git a/src/variable.c b/src/variable.c index 7f9274ee4..af75f5169 100644 --- a/src/variable.c +++ b/src/variable.c @@ -674,6 +674,7 @@ mod_const_check(mrb_state *mrb, mrb_value mod) switch (mrb_type(mod)) { case MRB_TT_CLASS: case MRB_TT_MODULE: + case MRB_TT_SCLASS: break; default: mrb_raise(mrb, E_TYPE_ERROR, "constant look-up for non class/module"); -- cgit v1.2.3 From 8cf42709d1933ad450120dff145723acba1fbc68 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 1 Nov 2012 04:21:39 +0900 Subject: constant access should refer outer class/module; close #514 --- src/variable.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'src/variable.c') diff --git a/src/variable.c b/src/variable.c index af75f5169..eebe81575 100644 --- a/src/variable.c +++ b/src/variable.c @@ -700,7 +700,7 @@ const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym) } c = c->super; } - if (!retry && base->tt == MRB_TT_MODULE) { + if (!retry && base && base->tt == MRB_TT_MODULE) { c = mrb->object_class; retry = 1; goto L_RETRY; @@ -733,6 +733,22 @@ mrb_vm_const_get(mrb_state *mrb, mrb_sym sym) struct RClass *c = mrb->ci->proc->target_class; if (!c) c = mrb->ci->target_class; + if (c) { + struct RClass *c2 = c; + mrb_value v; + + if (c->iv && iv_get(mrb, c->iv, sym, &v)) { + return v; + } + c2 = c; + for (;;) { + c2 = mrb_class_outer_module(mrb, c2); + if (!c2) break; + if (c2->iv && iv_get(mrb, c2->iv, sym, &v)) { + return v; + } + } + } return const_get(mrb, c, sym); } -- cgit v1.2.3