diff options
| author | Tomoyuki Sahara <[email protected]> | 2012-09-04 13:54:38 +0900 |
|---|---|---|
| committer | Tomoyuki Sahara <[email protected]> | 2012-09-04 15:59:39 +0900 |
| commit | 20e9d53fb804a1518afa6f74ec8def289978b9ee (patch) | |
| tree | 818fe7758eb4bb58cb235fec58d3ee672ddbe2e0 /src | |
| parent | eb080397fa0c3a9bc680f511a563be87920bcc37 (diff) | |
| download | mruby-20e9d53fb804a1518afa6f74ec8def289978b9ee.tar.gz mruby-20e9d53fb804a1518afa6f74ec8def289978b9ee.zip | |
fix out-of-bound access on compiling empty blocks.
Diffstat (limited to 'src')
| -rw-r--r-- | src/codegen.c | 25 |
1 files changed, 14 insertions, 11 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) { |
