summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/codegen.c13
-rw-r--r--src/vm.c3
2 files changed, 11 insertions, 5 deletions
diff --git a/src/codegen.c b/src/codegen.c
index 866bfcb44..321223d9d 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -308,7 +308,8 @@ push_(codegen_scope *s)
}
#define push() push_(s)
-#define pop() (s->sp--)
+#define pop_(s) ((s)->sp--)
+#define pop() pop_(s)
#define pop_n(n) (s->sp-=(n))
#define cursp() (s->sp)
@@ -508,6 +509,9 @@ lambda_body(codegen_scope *s, node *tree, int blk)
pop();
c = s->iseq[s->pc-1];
if (GET_OPCODE(c) != OP_RETURN || GETARG_B(c) != OP_R_NORMAL || s->pc == s->lastlabel) {
+ if (s->nregs == 0) {
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
+ }
genop(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL));
}
if (blk) {
@@ -524,12 +528,15 @@ scope_body(codegen_scope *s, node *tree)
codegen_scope *scope = scope_new(s->mrb, s, tree->car);
int idx = scope->idx;
+ codegen(scope, tree->cdr, VAL);
if (!s->iseq) {
- codegen(scope, tree->cdr, VAL);
genop(scope, MKOP_A(OP_STOP, 0));
}
else {
- codegen(scope, tree->cdr, VAL);
+ pop_(scope);
+ if (scope->nregs == 0) {
+ genop(scope, MKOP_A(OP_LOADNIL, scope->sp));
+ }
genop(scope, MKOP_AB(OP_RETURN, scope->sp, OP_R_NORMAL));
}
scope_finish(scope, idx);
diff --git a/src/vm.c b/src/vm.c
index f3c408809..7b5e1e87a 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -1563,12 +1563,11 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
mrb->arena_idx = ai;
if (mrb->exc) goto L_RAISE;
/* pop stackpos */
- regs = mrb->stack = mrb->stbase + ci->stackidx;
+ mrb->stack = mrb->stbase + ci->stackidx;
cipop(mrb);
NEXT;
}
else {
- /* setup environment for calling method */
irep = p->body.irep;
pool = irep->pool;
syms = irep->syms;