From 6c299aae67e2e0f13a470b855298bc1efb43387a Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Mon, 7 Nov 2016 00:44:08 +0900 Subject: fixed wrong stack adjustment for ensure clauses; fix #3175 --- src/vm.c | 3 +++ test/t/exception.rb | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) 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 -- cgit v1.2.3 From 1142cf20370362ab2b974b235e7606246245ce23 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 8 Nov 2016 22:18:41 +0900 Subject: fixed a bug with [] in RHS of multiple assignments; fix #3236 --- mrbgems/mruby-compiler/core/codegen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index efdd77888..c898acddc 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) { -- cgit v1.2.3 From 872517dff372ee6fde92c71861abf6ab9fbab958 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 8 Nov 2016 23:51:15 +0900 Subject: class variables in higher order have a priority; fix #3235 --- src/variable.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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", -- cgit v1.2.3 From 3f002b6993df9ea4843e2479d706e7426d57bb5a Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Fri, 11 Nov 2016 04:37:42 +0900 Subject: fixed a bug when number of LHS and RHS differs; fix #3239 --- mrbgems/mruby-compiler/core/codegen.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index c898acddc..9b064b867 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -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; } } -- cgit v1.2.3