ref: bce1f474989cde90cf2e874776d618e11a87f97d
parent: a2207af9fb5f49a2663e058658571638a509a3e6
author: Ori Bernstein <[email protected]>
date: Fri Jun 22 17:29:25 EDT 2012
Rename specialized generics.
--- a/parse/infer.c
+++ b/parse/infer.c
@@ -877,12 +877,12 @@
void specialize(Node *f)
{
- Node *n;
+ Node *d, *name;
size_t i;
for (i = 0; i < nspecializations; i++) {
- n = specializedcl(genericdecls[i], specializations[i]->expr.type, NULL);
- dump(n, stdout);
+ d = specializedcl(genericdecls[i], specializations[i]->expr.type, &name);
+ specializations[i]->expr.args[0] = name;
}
}
--- a/parse/parse.h
+++ b/parse/parse.h
@@ -346,7 +346,7 @@
Node **aggrmemb(Type *t, size_t *n);
/* specialize generics */
-Node *specializedcl(Node *n, Type *to, Node **dcl);
+Node *specializedcl(Node *n, Type *to, Node **name);
/* usefiles */
void readuse(Node *use, Stab *into);
--- a/parse/specialize.c
+++ b/parse/specialize.c
@@ -165,14 +165,46 @@
return r;
}
-Node *specializedcl(Node *n, Type *to, Node **dcl)
+size_t tidappend(char *buf, size_t sz, Type *t)
{
+ char *p;
+ char *end;
+ size_t i;
+
+ p = buf;
+ end = buf + sz;
+ p += snprintf(buf, end - p, "$%d", t->tid);
+ for (i = 0; i < t->nsub; i++)
+ p += tidappend(buf, end - p, t->sub[i]);
+ return end - p;
+}
+
+Node *genericname(Node *n, Type *t)
+{
+ char buf[1024];
+ char *p;
+ char *end;
+
+ p = buf;
+ end = buf + 1024;
+ p += snprintf(p, end - p, "%s", n->decl.name->name.name);
+ tidappend(p, end - p, t);
+ return mkname(n->line, buf);
+}
+
+Node *specializedcl(Node *n, Type *to, Node **name)
+{
Htab *tsmap;
+ Node *d;
assert(n->type == Ndecl);
assert(n->decl.isgeneric);
+ *name = genericname(n, to);
tsmap = mkht(tidhash, tideq);
fillsubst(tsmap, to, n->decl.type);
- return specializenode(n, tsmap);
+ d = specializenode(n, tsmap);
+ d->decl.name = *name;
+ dump(d, stdout);
+ return d;
}