mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
wrong return value from empty block/lambda
This commit is contained in:
+10
-3
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user