diff options
Diffstat (limited to 'mfd/drivers.c')
-rw-r--r-- | mfd/drivers.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/mfd/drivers.c b/mfd/drivers.c index ed8a288a..1b7203fa 100644 --- a/mfd/drivers.c +++ b/mfd/drivers.c @@ -1998,8 +1998,8 @@ code_type_switch(NODE *node, struct locus **old_locus) /* Loop nesting stack */ struct loop_stack { struct literal *ident; - prog_counter_t *begjmp; prog_counter_t *endjmp; + prog_counter_t *nxtjmp; }; static mf_stack_t loop_stack; @@ -2039,13 +2039,13 @@ within_loop(struct literal *lit) } void -enter_loop(struct literal *lit, prog_counter_t *begptr, prog_counter_t *endptr) +enter_loop(struct literal *lit, prog_counter_t *endptr, prog_counter_t *nxtptr) { struct loop_stack ent; if (!loop_stack) loop_stack = mf_stack_create(sizeof(struct loop_stack), 0); - ent.begjmp = begptr; ent.endjmp = endptr; + ent.nxtjmp = nxtptr; ent.ident = lit; mf_stack_push(loop_stack, &ent); } @@ -2083,7 +2083,7 @@ code_type_next(NODE *node, struct locus **old_locus) } code_op(opcode_jmp); - *ent.begjmp = code_immediate((void*) *ent.begjmp); + *ent.nxtjmp = code_immediate((void*) *ent.nxtjmp); } @@ -2206,11 +2206,11 @@ code_type_loop(NODE *node, struct locus **old_locus) jmp L_begin L_end: */ - prog_counter_t begin, end, begjmp = 0, endjmp = 0; + prog_counter_t begin, end, stmt, endjmp = 0, nxtjmp = 0; MARK_LOCUS(); - enter_loop(node->v.loop.ident, &begjmp, &endjmp); + enter_loop(node->v.loop.ident, &endjmp, &nxtjmp); traverse_tree(node->v.loop.for_stmt); begin = code_get_counter(); @@ -2227,14 +2227,15 @@ code_type_loop(NODE *node, struct locus **old_locus) code_op(opcode_bz); endjmp = code_immediate((void*)endjmp); } - + + stmt = code_get_counter(); traverse_tree(node->v.loop.stmt); code_op(opcode_jmp); code_immediate((void*)(begin - code_get_counter() - 1)); end = code_get_counter(); - jump_fixup(begjmp, begin); jump_fixup(endjmp, end); + jump_fixup(nxtjmp, stmt); } |