shithub: mc

Download patch

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;
 }