codegen.c: refactor `NODE_WHILE` and `NODE_UNTIL`.

parent 7c6c4ebb
...@@ -2268,10 +2268,7 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -2268,10 +2268,7 @@ codegen(codegen_scope *s, node *tree, int val)
if (!val) lp->reg = -1; if (!val) lp->reg = -1;
lp->pc0 = new_label(s); lp->pc0 = new_label(s);
switch (nint(tree->car->car)) { if (true_always(tree->car)) {
case NODE_TRUE:
case NODE_INT:
case NODE_STR:
if (nt == NODE_UNTIL) { if (nt == NODE_UNTIL) {
if (val) { if (val) {
genop_1(s, OP_LOADNIL, cursp()); genop_1(s, OP_LOADNIL, cursp());
...@@ -2279,9 +2276,8 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -2279,9 +2276,8 @@ codegen(codegen_scope *s, node *tree, int val)
} }
goto exit; goto exit;
} }
break; }
case NODE_FALSE: else if (false_always(tree->car)) {
case NODE_NIL:
if (nt == NODE_WHILE) { if (nt == NODE_WHILE) {
if (val) { if (val) {
genop_1(s, OP_LOADNIL, cursp()); genop_1(s, OP_LOADNIL, cursp());
...@@ -2289,17 +2285,14 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -2289,17 +2285,14 @@ codegen(codegen_scope *s, node *tree, int val)
} }
goto exit; goto exit;
} }
break; }
default: codegen(s, tree->car, VAL);
codegen(s, tree->car, VAL); pop();
pop(); if (nt == NODE_WHILE) {
if (nt == NODE_WHILE) { pos = genjmp2_0(s, OP_JMPNOT, cursp(), NOVAL);
pos = genjmp2_0(s, OP_JMPNOT, cursp(), NOVAL); }
} else {
else { pos = genjmp2_0(s, OP_JMPIF, cursp(), NOVAL);
pos = genjmp2_0(s, OP_JMPIF, cursp(), NOVAL);
}
break;
} }
lp->pc1 = new_label(s); lp->pc1 = new_label(s);
codegen(s, tree->cdr, NOVAL); codegen(s, tree->cdr, NOVAL);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment