shithub: mc

Download patch

ref: c3385258255b61bdfc24f194c8d7104b57a33102
parent: deb278d26087e1393e1ef1f9bfe0592b4df16298
author: Ori Bernstein <[email protected]>
date: Mon Oct 1 08:09:17 EDT 2012

Collect generic types correctly.

--- a/6/simp.c
+++ b/6/simp.c
@@ -280,7 +280,7 @@
                     sz = max(sz, tysize(t->udecls[i]->etype) + Ptrsz);
             return align(sz, Ptrsz);
             break;
-        case Tybad: case Tyvar: case Typaram: case Tyunres: case Ntypes:
+        case Tybad: case Tyvar: case Typaram: case Tyunres: case Tygeneric: case Ntypes:
             die("Type %s does not have size; why did it get down to here?", tystr(t));
             break;
     }
@@ -463,7 +463,7 @@
 #endif
     switch (t->type) {
         case Tyvoid: case Tybad: case Tyvalist: case Tyvar:
-        case Typaram: case Tyunres: case Tyname: case Ntypes:
+        case Tygeneric: case Typaram: case Tyunres: case Tyname: case Ntypes:
         case Tyint64: case Tyuint64: case Tylong:  case Tyulong:
         case Tyfloat32: case Tyfloat64:
         case Tyslice: case Tyarray: case Tytuple: case Tystruct:
--- a/parse/gram.y
+++ b/parse/gram.y
@@ -122,7 +122,7 @@
 
 %type <ty> type structdef uniondef tupledef compoundtype functype funcsig
 %type <ty> generictype
-%type <tylist> typelist
+%type <tylist> typelist typarams
 %type <nodelist> typaramlist
 
 %type <tok> asnop cmpop addop mulop shiftop
@@ -260,7 +260,10 @@
 
 tydef   : Ttype typeid Tasn type
             {$$ = $2;
-             $$.type = mktytmpl($2.line, mkname($2.line, $2.name), $2.params, $2.nparams, $4);}
+             if ($2.params)
+                 $$.type = mktygeneric($2.line, mkname($2.line, $2.name), $2.params, $2.nparams, $4);
+             else
+                 $$.type = mktyname($2.line, mkname($2.line, $2.name), $4);}
         | Ttype typeid
             {$$ = $2;}
         ;
@@ -273,12 +276,16 @@
         | Tident Toparen typarams Tcparen
             {$$.line = $1->line;
              $$.name = $1->str;
-             $$.params = NULL;
+             $$.params = $3.types;
+             $$.nparams = $3.ntypes;
              $$.type = NULL;}
         ;
 
 typarams: generictype
+            {$$.types = NULL; $$.ntypes = 0;
+             lappend(&$$.types, &$$.ntypes, $1);}
         | typarams Tcomma generictype
+            {lappend(&$$.types, &$$.ntypes, $3);}
         ;
 
 type    : structdef
--- a/parse/parse.h
+++ b/parse/parse.h
@@ -105,8 +105,10 @@
     Node **cstrlist;    /* The names of the constraints on the type. Used to fill the bitset */
     size_t ncstrlist;   /* The length of the constraint list above */
 
-    Type **param;       /* Tyname: the type parameters captured */
-    size_t nparam;      /* Tyname: the number of type parameters */
+    Type **param;       /* Tygeneric: the type parameters captured */
+    size_t nparam;      /* Tygeneric: count of type parameters */
+    Type **inst;        /* Tygeneric: instances created */
+    size_t ninst;       /* Tygeneric: count of instances created */
 
     Type **sub;         /* sub-types; shared by all composite types */
     size_t nsub;        /* For compound types */
@@ -342,7 +344,7 @@
 Type *mktyvar(int line);
 Type *mktyparam(int line, char *name);
 Type *mktyname(int line, Node *name, Type *base);
-Type *mktytmpl(int line, Node *name, Type **params, size_t nparams, Type *base);
+Type *mktygeneric(int line, Node *name, Type **params, size_t nparams, Type *base);
 Type *mktyunres(int line, Node *name);
 Type *mktyarray(int line, Type *base, Node *sz);
 Type *mktyslice(int line, Type *base);
--- a/parse/type.c
+++ b/parse/type.c
@@ -128,11 +128,11 @@
     return t;
 }
 
-Type *mktytmpl(int line, Node *name, Type **param, size_t nparam, Type *base)
+Type *mktygeneric(int line, Node *name, Type **param, size_t nparam, Type *base)
 {
     Type *t;
 
-    t = mktype(line, Tyname);
+    t = mktype(line, Tygeneric);
     t->name = name;
     t->nsub = 1;
     t->cstrs = bsdup(base->cstrs);
@@ -145,7 +145,15 @@
 
 Type *mktyname(int line, Node *name, Type *base)
 {
-    return mktytmpl(line, name, NULL, 0, base);
+    Type *t;
+
+    t = mktype(line, Tyname);
+    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)
@@ -439,15 +447,16 @@
             break;
         case Tyname:  
             p += snprintf(p, end - p, "%s", namestr(t->name));
-            if (t->nparam) {
-                p += snprintf(p, end - p, "(");
-                for (i = 0; i < t->nparam; i++)  {
-                    p += snprintf(p, end - p, "%s", sep);
-                    p += tybfmt(p, end - p, t->param[i]);
-                    sep = ", ";
-                }
-                p += snprintf(p, end - p, ")");
+            break;
+        case Tygeneric:  
+            p += snprintf(p, end - p, "%s", namestr(t->name));
+            p += snprintf(p, end - p, "(");
+            for (i = 0; i < t->nparam; i++)  {
+                p += snprintf(p, end - p, "%s", sep);
+                p += tybfmt(p, end - p, t->param[i]);
+                sep = ", ";
             }
+            p += snprintf(p, end - p, ")");
             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
@@ -43,3 +43,4 @@
 Ty(Typaram, NULL)
 Ty(Tyunres, NULL) /* unresolved */
 Ty(Tyname, NULL)
+Ty(Tygeneric, NULL)