ref: 565ba0922428a7a04198f8d11216309f018d6d50
parent: 7d7ee21e09b35138c6be3cace6c0d9778c90603c
author: Roberto E. Vargas Caballero <[email protected]>
date: Tue Aug 5 14:03:19 EDT 2014
Add eqtype() This function compare two types and see if they are the same type or not. This function is needed because the comparision of pointers can be difficult, because if they pointed to a function they are going to point to different structures, because different functions with the same type have different Type structure (this is done because is hard to generate a hash in this case).
--- a/cc1/cc1.h
+++ b/cc1/cc1.h
@@ -85,6 +85,7 @@
struct symbol *hash;
};
+extern bool eqtype(Type *tp1, Type *tp2);
extern Type *ctype(int8_t type, int8_t sign, int8_t size),
*mktype(Type *tp, uint8_t op, void *data);
--- a/cc1/expr.c
+++ b/cc1/expr.c
@@ -9,6 +9,8 @@
Node *expr(void);
+/* TODO: Change np1 and np2 to left and right (or l, r) */
+
void
init_expr(void)
{
@@ -111,9 +113,8 @@
{
uint8_t t;
- if (np->type == tp)
+ if (eqtype(np->type, tp))
return np;
-
t = tp->op;
switch (np->typeop) {
case ENUM: case INT: case FLOAT:
--- a/cc1/types.c
+++ b/cc1/types.c
@@ -207,3 +207,27 @@
return *tbl = bp;
}
+bool
+eqtype(Type *tp1, Type *tp2)
+{
+ Funpar *fp1, *fp2;
+
+ if (tp1 == tp2)
+ return 1;
+ if (tp1->op != tp2->op || tp1->op != PTR)
+ return 0;
+ tp1 = tp1->type;
+ tp2 = tp2->type;
+ if (tp1->op != tp2->op || tp1->op != FTN || !eqtype(tp1->type, tp2->type))
+ return 0;
+ fp2 = tp2->u.pars;
+ fp1 = tp1->u.pars;
+ while (fp1 && fp2) {
+ if (!eqtype(fp1->type, fp2->type))
+ break;
+ fp1 = fp1->next;
+ fp2 = fp2->next;
+ }
+
+ return fp1 == fp2;
+}