Commit 91318da3 authored by Yukihiro Matsumoto's avatar Yukihiro Matsumoto

wrong return value from empty block/lambda

parent 90323f54
...@@ -308,7 +308,8 @@ push_(codegen_scope *s) ...@@ -308,7 +308,8 @@ push_(codegen_scope *s)
} }
#define push() push_(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 pop_n(n) (s->sp-=(n))
#define cursp() (s->sp) #define cursp() (s->sp)
...@@ -508,6 +509,9 @@ lambda_body(codegen_scope *s, node *tree, int blk) ...@@ -508,6 +509,9 @@ lambda_body(codegen_scope *s, node *tree, int blk)
pop(); pop();
c = s->iseq[s->pc-1]; c = s->iseq[s->pc-1];
if (GET_OPCODE(c) != OP_RETURN || GETARG_B(c) != OP_R_NORMAL || s->pc == s->lastlabel) { 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)); genop(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL));
} }
if (blk) { if (blk) {
...@@ -524,12 +528,15 @@ scope_body(codegen_scope *s, node *tree) ...@@ -524,12 +528,15 @@ scope_body(codegen_scope *s, node *tree)
codegen_scope *scope = scope_new(s->mrb, s, tree->car); codegen_scope *scope = scope_new(s->mrb, s, tree->car);
int idx = scope->idx; int idx = scope->idx;
codegen(scope, tree->cdr, VAL);
if (!s->iseq) { if (!s->iseq) {
codegen(scope, tree->cdr, VAL);
genop(scope, MKOP_A(OP_STOP, 0)); genop(scope, MKOP_A(OP_STOP, 0));
} }
else { 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)); genop(scope, MKOP_AB(OP_RETURN, scope->sp, OP_R_NORMAL));
} }
scope_finish(scope, idx); scope_finish(scope, idx);
......
...@@ -1563,12 +1563,11 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ...@@ -1563,12 +1563,11 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
mrb->arena_idx = ai; mrb->arena_idx = ai;
if (mrb->exc) goto L_RAISE; if (mrb->exc) goto L_RAISE;
/* pop stackpos */ /* pop stackpos */
regs = mrb->stack = mrb->stbase + ci->stackidx; mrb->stack = mrb->stbase + ci->stackidx;
cipop(mrb); cipop(mrb);
NEXT; NEXT;
} }
else { else {
/* setup environment for calling method */
irep = p->body.irep; irep = p->body.irep;
pool = irep->pool; pool = irep->pool;
syms = irep->syms; syms = irep->syms;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment