summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c16
-rw-r--r--src/variable.c8
-rw-r--r--src/vm.c3
-rw-r--r--test/t/exception.rb5
4 files changed, 26 insertions, 6 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c
index efdd77888..9b064b867 100644
--- a/mrbgems/mruby-compiler/core/codegen.c
+++ b/mrbgems/mruby-compiler/core/codegen.c
@@ -1645,7 +1645,7 @@ codegen(codegen_scope *s, node *tree, int val)
node *t = tree->cdr, *p;
int rhs = cursp();
- if ((intptr_t)t->car == NODE_ARRAY && nosplat(t->cdr)) {
+ if ((intptr_t)t->car == NODE_ARRAY && t->cdr && nosplat(t->cdr)) {
/* fixed rhs */
t = t->cdr;
while (t) {
@@ -1655,11 +1655,21 @@ codegen(codegen_scope *s, node *tree, int val)
}
tree = tree->car;
if (tree->car) { /* pre */
+ int first = TRUE;
t = tree->car;
n = 0;
while (t) {
- gen_assignment(s, t->car, rhs+n, NOVAL);
- n++;
+ if (n < len) {
+ gen_assignment(s, t->car, rhs+n, NOVAL);
+ n++;
+ }
+ else {
+ if (first) {
+ genop(s, MKOP_A(OP_LOADNIL, rhs+n));
+ first = FALSE;
+ }
+ gen_assignment(s, t->car, rhs+n, NOVAL);
+ }
t = t->cdr;
}
}
diff --git a/src/variable.c b/src/variable.c
index 3b5674923..29f43e69d 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -760,13 +760,15 @@ mrb_mod_cv_get(mrb_state *mrb, struct RClass * c, mrb_sym sym)
{
struct RClass * cls = c;
mrb_value v;
+ int given = FALSE;
while (c) {
if (c->iv && iv_get(mrb, c->iv, sym, &v)) {
- return v;
+ given = TRUE;
}
c = c->super;
}
+ if (given) return v;
if (cls && cls->tt == MRB_TT_SCLASS) {
mrb_value klass;
@@ -774,12 +776,14 @@ mrb_mod_cv_get(mrb_state *mrb, struct RClass * c, mrb_sym sym)
mrb_intern_lit(mrb, "__attached__"));
c = mrb_class_ptr(klass);
if (c->tt == MRB_TT_CLASS || c->tt == MRB_TT_MODULE) {
+ given = FALSE;
while (c) {
if (c->iv && iv_get(mrb, c->iv, sym, &v)) {
- return v;
+ given = TRUE;
}
c = c->super;
}
+ if (given) return v;
}
}
mrb_name_error(mrb, sym, "uninitialized class variable %S in %S",
diff --git a/src/vm.c b/src/vm.c
index fcc69a1f9..a7418e6e7 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -1513,6 +1513,7 @@ RETRY_TRY_BLOCK:
/* A B return R(A) (B=normal,in-block return/break) */
if (mrb->exc) {
mrb_callinfo *ci;
+ mrb_value *stk;
int eidx;
L_RAISE:
@@ -1524,6 +1525,7 @@ RETRY_TRY_BLOCK:
if (ci->ridx == 0) goto L_STOP;
goto L_RESCUE;
}
+ stk = mrb->c->stack;
while (ci[0].ridx == ci[-1].ridx) {
cipop(mrb);
ci = mrb->c->ci;
@@ -1533,6 +1535,7 @@ RETRY_TRY_BLOCK:
MRB_THROW(prev_jmp);
}
if (ci == mrb->c->cibase) {
+ mrb->c->stack = stk;
while (eidx > 0) {
ecall(mrb, --eidx);
}
diff --git a/test/t/exception.rb b/test/t/exception.rb
index 839250ea8..2dc8f5487 100644
--- a/test/t/exception.rb
+++ b/test/t/exception.rb
@@ -338,10 +338,13 @@ assert('Exception 19') do
begin
1 * "b"
ensure
- @e = self.z
+ @e = self.zz
end
end
+ def zz
+ true
+ end
def z
true
end