shithub: scc

Download patch

ref: 02e6ceca3bbaed6ec4120852882e62e464084f01
parent: 456579a04d4747048f8a1a395fee58950c0d29d9
author: Roberto E. Vargas Caballero <[email protected]>
date: Sun Apr 20 02:44:09 EDT 2014

Convert some expressions to new Node fields

The change due to the new Node structure is too big that may is
not a good idea do it in only one commit. This is the first of
a serie of commit.

--- a/expr.c
+++ b/expr.c
@@ -29,7 +29,7 @@
 
 	if (options.npromote)
 		return np;
-	tp = UNQUAL(np->type);
+	tp = np->utype;
 	if (tp == chartype || tp == shortype || tp == booltype)
 		return castcode(np, inttype);
 	else if (tp == uchartype || tp == ushortype)
@@ -44,8 +44,8 @@
 	Node *np1 = *p1, *np2 = *p2;
 	signed char n;
 
-	tp1 = UNQUAL(np1->type);
-	tp2 = UNQUAL(np2->type);
+	tp1 = np1->utype;
+	tp2 = np1->utype;
 	if (tp1 == tp2)
 		return;
 	new1 = new2 = NULL;
@@ -69,17 +69,12 @@
 static Node *
 bitlogic(char op, Node *np1, Node *np2)
 {
-	Type *tp1, *tp2;
-	uint8_t t1, t2;
-
 	np1 = promote(np1);
 	np2 = promote(np2);
-	GETBTYPE(np1, tp1, t1);
-	GETBTYPE(np2, tp2, t2);
 
-	if (t1 != INT || t2 != INT)
+	if (np1->typeop != INT || np2->typeop != INT)
 		error("No integer operand in bit logical operation");
-	if (tp1 != tp2)
+	if (np1->utype != np2->utype)
 		typeconv(&np1, &np2);
 	return bincode(op, np1->type, np1, np2);
 }
@@ -89,8 +84,7 @@
 {
 	Type *tp;
 
-	tp = UNQUAL(np->type);
-	tp = mktype(tp->type, PTR, NULL, 0);
+	tp = mktype(np->utype->type, PTR, NULL, 0);
 	return unarycode(OADDR, tp, np);
 }
 
@@ -98,21 +92,19 @@
  * Convert a Node to a type
  */
 Node *
-convert(Node *np, Type *tp1, char iscast)
+convert(Node *np, Type *tp, char iscast)
 {
-	Type *tp2;
-	register uint8_t t1, t2;
+	uint8_t t1, t2;
 
-	tp1 = UNQUAL(tp1), tp2 = UNQUAL(np->type);
-	if (tp1 == tp2)
+	if (np->type == tp)
 		return np;
-	t1 = tp1->op, t2 = tp2->op;
+	t1 = np->typeop, t2 = BTYPE(tp);
 
 	switch (t1) {
 	case ENUM: case INT: case FLOAT:
 		switch (t2) {
 		case INT: case FLOAT: case ENUM:
-			return castcode(np, tp1);
+			return castcode(np, tp);
 		}
 		break;
 	case PTR:
@@ -120,17 +112,19 @@
 		case ARY: case FTN:
 			np = addr2ptr(np);
 		case PTR:
-			if (iscast || tp1 == pvoidtype ||  tp2 == pvoidtype) {
+			if (iscast && t2 != FLOAT ||
+			    tp == pvoidtype ||
+			    np->utype == pvoidtype) {
 				/* TODO:
 				 * we assume conversion between pointers
 				 * do not need any operation, but due to
 				 * alignment problems that may be false
 				 */
-				np->type = tp1;
+				np->type = tp;
+				np->utype = UNQUAL(tp);
 				return np;
 			}
 			return NULL;
-
 		}
 	}
 	return NULL;