ref: be5f7b2fc3ff72a7e0b664ff7ad0413375c58392
parent: 9feb475b50b7fc4f35896a68a00d71dc19b086d8
author: Ori Bernstein <[email protected]>
date: Sun Jun 17 00:04:42 EDT 2012
Make namespaced names compile correctly. Generate namespaced assembly names for them in the symbol tables as we should.
--- a/parse/gram.y
+++ b/parse/gram.y
@@ -198,7 +198,11 @@
;
package : Tpkg Tident Tasn pkgbody Tendblk
- {file->file.exports->name = mkname($2->line, $2->str);}
+ {if (file->file.exports->name)
+ fatal($1->line, "Package already declared\n");
+ updatens(file->file.exports, $2->str);
+ updatens(file->file.globls, $2->str);
+ }
;
--- a/parse/parse.h
+++ b/parse/parse.h
@@ -347,6 +347,7 @@
Type *nodetype(Node *n);
void addstmt(Node *file, Node *stmt);
void setns(Node *n, char *ns);
+void updatens(Stab *st, char *ns);
Op exprop(Node *n);
Node **aggrmemb(Type *t, size_t *n);
--- a/parse/stab.c
+++ b/parse/stab.c
@@ -162,3 +162,25 @@
fatal(scope->name->line, "Ns %s already defined", namestr(s->name));
htput(st->ns, scope->name, scope);
}
+
+void updatens(Stab *st, char *name)
+{
+ void **k;
+ size_t i, nk;
+
+ if (st->name)
+ die("Stab %s already has namespace; Can't set to %s", namestr(st->name), name);
+ st->name = mkname(-1, name);
+ k = htkeys(st->dcl, &nk);
+ for (i = 0; i < nk; i++)
+ setns(k[i], name);
+ free(k);
+ k = htkeys(st->ty, &nk);
+ for (i = 0; i < nk; i++)
+ setns(k[i], name);
+ free(k);
+ k = htkeys(st->ns, &nk);
+ for (i = 0; i < nk; i++)
+ setns(k[i], name);
+ free(k);
+}