From 91318da3bc2f7465ed490544afb531041aa4a092 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 2 Aug 2012 12:57:57 +0900 Subject: wrong return value from empty block/lambda --- src/codegen.c | 13 ++++++++++--- src/vm.c | 3 +-- 2 files changed, 11 insertions(+), 5 deletions(-) (limited to 'src') 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; -- cgit v1.2.3