shithub: mc

Download patch

ref: 69ac58bd0e3bc37b8189f5fdd787c04216c80111
parent: 9355e0b3af32d4c1e3dd372709c79fb4745ee3e9
author: Ori Bernstein <[email protected]>
date: Sun Jun 24 09:51:02 EDT 2012

Make type names proper types.

--- a/8/reduce.c
+++ b/8/reduce.c
@@ -223,6 +223,8 @@
 
         case Tyslice:
             return 8; /* len; ptr */
+        case Tyalias:
+            return tysize(t->sub[0]);
         case Tyarray:
             assert(exprop(t->asize) == Olit);
             return t->asize->expr.args[0]->lit.intval * tysize(t->sub[0]);
@@ -377,6 +379,7 @@
     if (aggr->expr.type->type == Typtr)
         aggr = aggr->expr.args[0];
     ty = aggr->expr.type;
+    ty = tybase(ty);
 
     assert(ty->type == Tystruct);
     nl = aggrmemb(ty, &nn);
--- a/parse/gram.y
+++ b/parse/gram.y
@@ -241,7 +241,7 @@
 tydef   : Ttype Tident Tasn type Tendln
             {$$.line = $1->line;
              $$.name = $2->str;
-             $$.type = $4;}
+             $$.type = mktyalias($2->line, mkname($2->line, $2->str), $4);}
         | Ttype Tident Tendln
             {$$.line = $1->line;
              $$.name = $2->str;
--- a/parse/infer.c
+++ b/parse/infer.c
@@ -92,12 +92,12 @@
 
     if (t->resolved)
         return;
+    t->resolved = 1;
     n = aggrmemb(t, &nn);
     for (i = 0; i < nn; i++)
         infernode(n[i], NULL, NULL);
     for (i = 0; i < t->nsub; i++)
         t->sub[i] = tf(t->sub[i]);
-    t->resolved = 1;
 }
 
 /* fixd the most accurate type mapping we have */
--- a/parse/node.c
+++ b/parse/node.c
@@ -272,17 +272,6 @@
     return e->expr.op;
 }
 
-Node **aggrmemb(Type *t, size_t *n)
-{
-    *n = t->nmemb;
-    switch (t->type) {
-        case Tystruct: return t->sdecls; break;
-        case Tyunion: return t->udecls; break;
-        case Tyarray: return &t->asize; break;
-        default: return NULL;
-    }
-}
-
 char *namestr(Node *name)
 {
     if (!name)
--- a/parse/parse.h
+++ b/parse/parse.h
@@ -97,6 +97,7 @@
     size_t nmemb;     /* for aggregate types (struct, union) */
     Type **sub;       /* sub-types; shared by all composite types */
     union {
+        Node *aname;   /* Tyalias: alias name */
         Node *name;    /* Tyname: unresolved name */
         Node *asize;   /* array size */
         char *pname;   /* Typaram: name of type parameter */
@@ -290,6 +291,7 @@
 Type *tydup(Type *t); /* shallow duplicate; all subtypes/members/... kept */
 Type *mktyvar(int line);
 Type *mktyparam(int line, char *name);
+Type *mktyalias(int line, Node *name, Type *base);
 Type *mktynamed(int line, Node *name);
 Type *mktyarray(int line, Type *base, Node *sz);
 Type *mktyslice(int line, Type *base);
@@ -303,6 +305,7 @@
 int   istysigned(Type *t);
 
 /* type manipulation */
+Type *tybase(Type *t);
 int hascstr(Type *t, Cstr *c);
 int cstreq(Type *t, Cstr **cstrs, size_t len);
 int setcstr(Type *t, Cstr *c);
--- a/parse/type.c
+++ b/parse/type.c
@@ -117,6 +117,19 @@
     return t;
 }
 
+Type *mktyalias(int line, Node *name, Type *base)
+{
+    Type *t;
+
+    t = mkty(line, Tyalias);
+    t->name = name;
+    t->nsub = 1;
+    t->cstrs = bsdup(base->cstrs);
+    t->sub = xalloc(sizeof(Type*));
+    t->sub[0] = base;
+    return t;
+}
+
 Type *mktyarray(int line, Type *base, Node *sz)
 {
     Type *t;
@@ -210,6 +223,25 @@
     }
 }
 
+Type *tybase(Type *t)
+{
+    while (t->type == Tyalias)
+        t = t->sub[0];
+    return t;
+}
+
+Node **aggrmemb(Type *t, size_t *n)
+{
+    t = tybase(t);
+    *n = t->nmemb;
+    switch (t->type) {
+        case Tystruct:  return t->sdecls;               break;
+        case Tyunion:   return t->udecls;               break;
+        case Tyarray:   return &t->asize;               break;
+        default: return NULL;
+    }
+}
+
 static int namefmt(char *buf, size_t len, Node *n)
 {
     char *p;
@@ -374,6 +406,9 @@
         case Tyname:
             p += snprintf(p, end - p, "?"); /* indicate unresolved name. should not be seen by user. */
             p += namefmt(p, end - p, t->name);
+            break;
+        case Tyalias:  
+            p += snprintf(p, end - p, "%s", namestr(t->aname));
             break;
         case Tystruct:  p += fmtstruct(p, end - p, t);  break;
         case Tyunion:   p += fmtunion(p, end - p, t);   break;
--- a/parse/types.def
+++ b/parse/types.def
@@ -38,4 +38,5 @@
 Ty(Tyname, NULL)
 Ty(Tystruct, NULL)
 Ty(Tyunion, NULL)
+Ty(Tyalias, NULL)
 Ty(Ntypes, NULL)