shithub: scc

Download patch

ref: 6624f3b6cd575a670cf4f424e4e93ae8df8a43df
parent: c9a7bedda831d58121897c43f3e92badb6852f3a
author: Roberto E. Vargas Caballero <[email protected]>
date: Fri Apr 18 06:06:08 EDT 2014

Add function iszero()

This check is going to be done in a lot of different places, so
it is a good idea to have this function.

--- a/expr.c
+++ b/expr.c
@@ -286,13 +286,18 @@
 }
 
 static Node *
-eval(Node *np)
+iszero(Node *np)
 {
-	Node *ifyes, *ifno;
+	if (ISNODELOG(np))
+		return np;
+	return compare(ONE, np, constcode(zero));
+}
 
+static Node *
+eval(Node *np)
+{
 	if (!ISNODELOG(np))
 		return np;
-
 	return ternarycode(np, constcode(one), constcode(zero));
 }
 
@@ -691,10 +696,10 @@
 static Node *
 ternary(void)
 {
-	Node *cond, *ifyes, *ifno;
+	Node *np, *ifyes, *ifno;
 	Type *tp1, *tp2;
 
-	cond = or();
+	np = or();
 	while (accept('?')) {
 		ifyes = promote(expr());
 		expect(':');
@@ -703,10 +708,9 @@
 		tp2 = UNQUAL(ifno->type);
 		if (tp1 != tp2)
 			typeconv(&ifyes, &ifno);
-		cond = ternarycode(compare(ONE, cond, constcode(zero)),
-	                           ifyes, ifno);
+		np = ternarycode(iszero(np), ifyes, ifno);
 	}
-	return cond;
+	return np;
 }
 
 static Node *