Remove unnecessary OP_JMPNOT for unless statement.

This commit is contained in:
Yukihiro "Matz" Matsumoto
2019-08-17 12:29:04 +09:00
parent e76c5aad36
commit 13eaff4f9f
+13 -3
View File
@@ -1578,8 +1578,8 @@ codegen(codegen_scope *s, node *tree, int val)
} }
codegen(s, tree->car, VAL); codegen(s, tree->car, VAL);
pop(); pop();
if (tree->cdr->car) {
pos1 = genjmp2(s, OP_JMPNOT, cursp(), 0, val); pos1 = genjmp2(s, OP_JMPNOT, cursp(), 0, val);
codegen(s, tree->cdr->car, val); codegen(s, tree->cdr->car, val);
if (elsepart) { if (elsepart) {
if (val) pop(); if (val) pop();
@@ -1588,8 +1588,7 @@ codegen(codegen_scope *s, node *tree, int val)
codegen(s, elsepart, val); codegen(s, elsepart, val);
dispatch(s, pos2); dispatch(s, pos2);
} }
else { else if (val) {
if (val) {
pop(); pop();
pos2 = genjmp(s, OP_JMP, 0); pos2 = genjmp(s, OP_JMP, 0);
dispatch(s, pos1); dispatch(s, pos1);
@@ -1601,6 +1600,17 @@ codegen(codegen_scope *s, node *tree, int val)
dispatch(s, pos1); dispatch(s, pos1);
} }
} }
else { /* empty then-part */
if (elsepart) {
pos1 = genjmp2(s, OP_JMPIF, cursp(), 0, val);
codegen(s, elsepart, val);
dispatch(s, pos1);
}
else if (val) {
genop_1(s, OP_LOADNIL, cursp());
push();
}
}
} }
break; break;