diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/codegen.c | 25 | ||||
| -rw-r--r-- | src/variable.c | 2 |
2 files changed, 15 insertions, 12 deletions
diff --git a/src/codegen.c b/src/codegen.c index 49d53b1ea..799ec1500 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -511,9 +511,10 @@ for_body(codegen_scope *s, node *tree) } codegen(s, tree->cdr->cdr->car, VAL); pop(); - c = s->iseq[s->pc-1]; - if (GET_OPCODE(c) != OP_RETURN || GETARG_B(c) != OP_R_NORMAL || s->pc == s->lastlabel) { - genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL); + if (s->pc > 0) { + c = s->iseq[s->pc-1]; + if (GET_OPCODE(c) != OP_RETURN || GETARG_B(c) != OP_R_NORMAL || s->pc == s->lastlabel) + genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL); } loop_pop(s, NOVAL); scope_finish(s, idx); @@ -593,14 +594,16 @@ lambda_body(codegen_scope *s, node *tree, int blk) } codegen(s, tree->cdr->car, VAL); 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, 0)); - genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL)); - } - else { - genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL); + if (s->pc > 0) { + 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, 0)); + genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL)); + } + else { + genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL); + } } } if (blk) { diff --git a/src/variable.c b/src/variable.c index effdf51d4..74dfc02c9 100644 --- a/src/variable.c +++ b/src/variable.c @@ -549,7 +549,7 @@ mrb_iv_remove(mrb_state *mrb, mrb_value obj, mrb_sym sym) iv_tbl *t = mrb_obj_ptr(obj)->iv; mrb_value val; - if (iv_del(mrb, t, sym, &val)) { + if (t && iv_del(mrb, t, sym, &val)) { return val; } } |
