diff --git a/src/toolsrc/parse.c b/src/toolsrc/parse.c index a8f3408..7d8e4d4 100755 --- a/src/toolsrc/parse.c +++ b/src/toolsrc/parse.c @@ -861,9 +861,10 @@ int parse_stmnt(void) tag_while = tag_new(BRANCH_TYPE); tag_wend = tag_new(BRANCH_TYPE); tag_prevcnt = cont_tag; - cont_tag = tag_while; + cont_tag = tag_new(BRANCH_TYPE); tag_prevbrk = break_tag; break_tag = tag_wend; + emit_brnch(cont_tag); emit_codetag(tag_while); if (!(seq = parse_expr(NULL, &cfnvals))) parse_error("Bad expression"); @@ -872,12 +873,12 @@ int parse_stmnt(void) parse_warn("Expression value overflow"); while (cfnvals-- > 1) seq = gen_drop(seq); } - seq = gen_brfls(seq, tag_wend); - emit_seq(seq); + seq = gen_brtru(seq, tag_while); while (parse_stmnt()) next_line(); if (scantoken != LOOP_TOKEN) parse_error("Missing WHILE/END"); - emit_brnch(tag_while); + emit_codetag(cont_tag); + emit_seq(seq); emit_codetag(tag_wend); break_tag = tag_prevbrk; cont_tag = tag_prevcnt; diff --git a/src/toolsrc/parse.pla b/src/toolsrc/parse.pla index 47a467c..a5cab82 100644 --- a/src/toolsrc/parse.pla +++ b/src/toolsrc/parse.pla @@ -645,9 +645,10 @@ def parse_stmnt tag_while = new_tag(RELATIVE_FIXUP) tag_wend = new_tag(RELATIVE_FIXUP) tag_prevcnt = cont_tag - cont_tag = tag_while + cont_tag = new_tag(RELATIVE_FIXUP) tag_prevbrk = break_tag break_tag = tag_wend + emit_branch(cont_tag) emit_tag(tag_while) seq, cfnvals = parse_expr(NULL) if !seq; exit_err(ERR_INVAL|ERR_STATE); fin @@ -655,13 +656,13 @@ def parse_stmnt parse_warn("Expression value overflow") while cfnvals > 1;cfnvals--; seq = gen_op(seq, DROP_CODE); loop fin - seq = gen_oprel(seq, BRFALSE_CODE, tag_wend) - emit_seq(seq) + seq = gen_oprel(seq, BRTRUE_CODE, tag_while) while parse_stmnt nextln loop if token <> LOOP_TKN; exit_err(ERR_MISS|ERR_CLOSE|ERR_STATE); fin - emit_branch(tag_while) + emit_tag(cont_tag) + emit_seq(seq) emit_tag(tag_wend) break_tag = tag_prevbrk cont_tag = tag_prevcnt