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)