ref: 8e8131e3e7dbc21f60631a80ad3e638df80661ae
parent: c798301cfa0f19e9d044f2afd0886afd6ac2a298
author: Ori Bernstein <[email protected]>
date: Sun Jun 17 12:17:19 EDT 2012
Get rid of the 'Sym' struct. It just got in the way, in the end, even though it seemed like a good idea when it was put in.
--- a/8/reduce.c
+++ b/8/reduce.c
@@ -62,9 +62,9 @@
return ispureop[exprop(n)];
}
-static int isconstfn(Sym *s)
+static int isconstfn(Node *s)
{
- return s->isconst && s->type->type == Tyfunc;
+ return s->decl.isconst && decltype(s)->type == Tyfunc;
}
static char *asmname(Node *n)
@@ -146,7 +146,7 @@
if (n->type == Nexpr)
t = n->expr.type;
else
- t = n->decl.sym->type;
+ t = n->decl.type;
return tysize(t);
}
@@ -165,16 +165,14 @@
char buf[128];
static int nexttmp;
Node *t, *r, *n;
- Sym *s;
assert(e->type == Nexpr);
snprintf(buf, 128, ".t%d", nexttmp++);
n = mkname(e->line, buf);
- s = mksym(e->line, n, e->expr.type);
- t = mkdecl(e->line, s);
+ t = mkdecl(e->line, n, e->expr.type);
declarelocal(simp, t);
r = mkexpr(e->line, Ovar, t, NULL);
- r->expr.did = s->id;
+ r->expr.did = t->decl.did;
return r;
}
@@ -540,8 +538,8 @@
assert(n->type == Ndecl);
s->stksz += size(n);
if (debug)
- printf("DECLARE %s(%ld) at %zd\n", declname(n), n->decl.sym->id, s->stksz);
- htput(s->locs, (void*)n->decl.sym->id, (void*)s->stksz);
+ printf("DECLARE %s(%ld) at %zd\n", declname(n), n->decl.did, s->stksz);
+ htput(s->locs, (void*)n->decl.did, (void*)s->stksz);
}
static void declarearg(Simp *s, Node *n)
@@ -548,8 +546,8 @@
{
assert(n->type == Ndecl);
if (debug)
- printf("DECLARE %s(%ld) at %zd\n", declname(n), n->decl.sym->id, -(s->argsz + 8));
- htput(s->locs, (void*)n->decl.sym->id, (void*)-(s->argsz + 8));
+ printf("DECLARE %s(%ld) at %zd\n", declname(n), n->decl.did, -(s->argsz + 8));
+ htput(s->locs, (void*)n->decl.did, (void*)-(s->argsz + 8));
s->argsz += size(n);
}
@@ -589,7 +587,7 @@
if (n->decl.init) {
v = rval(s, n->decl.init);
r = mkexpr(n->line, Ovar, n, NULL);
- r->expr.did = n->decl.sym->id;
+ r->expr.did = n->decl.did;
append(s, store(r, v));
}
break;
@@ -692,12 +690,12 @@
void **k;
size_t i, nk;
Stab *stab;
- Sym *s;
+ Node *s;
k = htkeys(st->dcl, &nk);
for (i = 0; i < nk; i++) {
s = htget(st->dcl, k[i]);
- htput(globls, (void*)s->id, asmname(s->name));
+ htput(globls, (void*)s->decl.did, asmname(s->decl.name));
}
free(k);
@@ -716,7 +714,6 @@
char *name;
FILE *fd;
Node **n;
- Sym *s;
/* declrae useful constants */
one = mkintlit(-1, 1);
@@ -737,9 +734,8 @@
case Nuse: /* nothing to do */
break;
case Ndecl:
- s = n[i]->decl.sym;
- name = asmname(s->name);
- if (isconstfn(s)) {
+ name = asmname(n[i]->decl.name);
+ if (isconstfn(n[i])) {
lowerfn(name, n[i]->decl.init, globls, fd);
free(name);
} else {
--- a/parse/dump.c
+++ b/parse/dump.c
@@ -25,20 +25,20 @@
fprintf(fd, "%s", n->name.name);
}
-static void outsym(Sym *s, FILE *fd, int depth)
+static void outsym(Node *s, FILE *fd, int depth)
{
char buf[1024];
indent(fd, depth);
- if (s->isconst)
+ if (s->decl.isconst)
fprintf(fd, "const ");
else
fprintf(fd, "var ");
- outname(s->name, fd);
- fprintf(fd, " : %s\n", tyfmt(buf, 1024, s->type));
+ outname(s->decl.name, fd);
+ fprintf(fd, " : %s\n", tyfmt(buf, 1024, s->decl.type));
}
-void dumpsym(Sym *s, FILE *fd)
+void dumpsym(Node *s, FILE *fd)
{
outsym(s, fd, 0);
}
@@ -117,7 +117,7 @@
break;
case Ndecl:
fprintf(fd, "\n");
- outsym(n->decl.sym, fd, depth + 1);
+ outsym(n, fd, depth + 1);
outnode(n->decl.init, fd, depth + 1);
break;
case Nblock:
--- a/parse/gram.y
+++ b/parse/gram.y
@@ -163,7 +163,7 @@
toplev
: decl
{lappend(&file->file.stmts, &file->file.nstmts, $1);
- putdcl(file->file.globls, $1->decl.sym);}
+ putdcl(file->file.globls, $1);}
| use
{lappend(&file->file.uses, &file->file.nuses, $1);}
| package
@@ -173,21 +173,19 @@
;
decl : Tvar declbody Tendln
- {$2->decl.flags = 0;
- $$ = $2;}
+ {$$ = $2;}
| Tconst declbody Tendln
- {$2->decl.sym->isconst = 1;
- $2->decl.flags = 0;
+ {$2->decl.isconst = 1;
$$ = $2;}
| Tgeneric declbody Tendln
- {$2->decl.sym->isconst = 1;
- $2->decl.flags = 0;
+ {$2->decl.isconst = 1;
$$ = $2;}
| Textern Tvar declbody Tendln
- {$3->decl.flags = Dclextern;
+ {$3->decl.isextern = 1;
$$ = $3;}
| Textern Tconst declbody Tendln
- {$3->decl.flags = Dclconst | Dclextern;
+ {$3->decl.isconst = 1;
+ $3->decl.isextern = 1;
$$ = $3;}
;
@@ -209,7 +207,7 @@
| pkgbody pkgitem
;
-pkgitem : decl {putdcl(file->file.exports, $1->decl.sym);}
+pkgitem : decl {putdcl(file->file.exports, $1);}
| tydef {puttype(file->file.exports,
mkname($1.line, $1.name),
$1.type);}
@@ -227,9 +225,9 @@
;
declcore: name
- {$$ = mkdecl($1->line, mksym($1->line, $1, mktyvar($1->line)));}
+ {$$ = mkdecl($1->line, $1, mktyvar($1->line));}
| name Tcolon type
- {$$ = mkdecl($1->line, mksym($1->line, $1, $3));}
+ {$$ = mkdecl($1->line, $1, $3);}
;
name : Tident
@@ -558,12 +556,12 @@
if ($1)
lappend(&$$->block.stmts, &$$->block.nstmts, $1);
if ($1 && $1->type == Ndecl)
- putdcl($$->block.scope, $1->decl.sym);}
+ putdcl($$->block.scope, $1);}
| blockbody stmt
{if ($2)
lappend(&$1->block.stmts, &$1->block.nstmts, $2);
if ($2 && $2->type == Ndecl)
- putdcl($1->block.scope, $2->decl.sym);
+ putdcl($1->block.scope, $2);
$$ = $1;}
;
--- a/parse/infer.c
+++ b/parse/infer.c
@@ -95,7 +95,7 @@
t = tf(t);
switch (n->type) {
case Nexpr: n->expr.type = t; break;
- case Ndecl: n->decl.sym->type = t; break;
+ case Ndecl: n->decl.type = t; break;
case Nlit: n->lit.type = t; break;
case Nfunc: n->func.type = t; break;
default:
@@ -247,7 +247,7 @@
Node *var, *name, *nsname;
Node **args;
Stab *st;
- Sym *s;
+ Node *s;
if (n->type != Nexpr)
return;
@@ -263,8 +263,8 @@
if (!s)
fatal(n->line, "Undeclared var %s.%s", nsname->name.ns, nsname->name.name);
var = mkexpr(n->line, Ovar, nsname, NULL);
- var->expr.did = s->id;
- settype(var, s->type);
+ var->expr.did = s->decl.did;
+ settype(var, s->decl.type);
*ret = var;
}
@@ -272,8 +272,8 @@
{
Node **args;
int nargs;
+ Node *s;
Type *t;
- Sym *s;
int i;
assert(n->type == Nexpr);
@@ -397,8 +397,8 @@
if (!s)
fatal(n->line, "Undeclared var %s", ctxstr(args[0]));
else
- settype(n, s->type);
- n->expr.did = s->id;
+ settype(n, s->decl.type);
+ n->expr.did = s->decl.did;
break;
case Olit: /* <lit>:@a::tyclass -> @a */
switch (args[0]->lit.littype) {
@@ -463,9 +463,9 @@
{
void **k;
size_t i, nk;
- Node *d;
Type *ty;
- Sym *s;
+ Node *d;
+ Node *s;
if (!n)
return;
@@ -488,9 +488,9 @@
d = n->file.stmts[i];
infernode(d, NULL, sawret);
if (d->type == Ndecl) {
- s = getdcl(file->file.exports, d->decl.sym->name);
+ s = getdcl(file->file.exports, d->decl.name);
if (s)
- unify(d, type(d), s->type);
+ unify(d, type(d), s->decl.type);
}
}
popstab();
@@ -621,7 +621,7 @@
void **k;
size_t n, i;
Type *t;
- Sym *d;
+ Node *d;
k = htkeys(s->ty, &n);
for (i = 0; i < n; i++) {
@@ -633,7 +633,7 @@
k = htkeys(s->dcl, &n);
for (i = 0; i < n; i++) {
d = getdcl(s, k[i]);
- d->type = tyfix(d->name, d->type);
+ d->decl.type = tyfix(d->decl.name, d->decl.type);
}
free(k);
}
--- a/parse/node.c
+++ b/parse/node.c
@@ -111,7 +111,7 @@
f->func.type = mktyfunc(line, args, nargs, ret);
for (i = 0; i < nargs; i++)
- putdcl(f->func.scope, args[i]->decl.sym);
+ putdcl(f->func.scope, args[i]);
n = mknode(line, Nlit);
n->lit.littype = Lfunc;
@@ -207,12 +207,15 @@
return n;
}
-Node *mkdecl(int line, Sym *sym)
+Node *mkdecl(int line, Node *name, Type *ty)
{
+ static int nextdid;
Node *n;
n = mknode(line, Ndecl);
- n->decl.sym = sym;
+ n->decl.did = nextdid++;
+ n->decl.name = name;
+ n->decl.type = ty;
return n;
}
@@ -231,7 +234,7 @@
{
Node *name;
assert(n->type == Ndecl);
- name = n->decl.sym->name;
+ name = n->decl.name;
return name->name.name;
}
@@ -250,7 +253,7 @@
Type *nodetype(Node *n)
{
switch (n->type) {
- case Ndecl: return n->decl.sym->type; break;
+ case Ndecl: return n->decl.type; break;
case Nexpr: return n->expr.type; break;
case Nlit: return n->lit.type; break;
default: die("Node %s has no type", nodestr(n->type)); break;
--- a/parse/parse.h
+++ b/parse/parse.h
@@ -11,7 +11,6 @@
typedef struct Tok Tok;
typedef struct Node Node;
typedef struct Stab Stab;
-typedef struct Sym Sym;
typedef struct Type Type;
typedef struct Cstr Cstr;
@@ -86,12 +85,6 @@
};
struct Sym {
- long id;
- int line;
- int isconst;
- int isgeneric;
- Node *name;
- Type *type;
};
struct Type {
@@ -194,8 +187,12 @@
} lbl;
struct {
- Sym *sym;
- int flags;
+ long did;
+ int isconst;
+ int isgeneric;
+ int isextern;
+ Node *name;
+ Type *type;
Node *init;
} decl;
@@ -275,10 +272,10 @@
void putns(Stab *st, Stab *scope);
void puttype(Stab *st, Node *n, Type *ty);
void updatetype(Stab *st, Node *n, Type *t);
-void putdcl(Stab *st, Sym *s);
+void putdcl(Stab *st, Node *s);
Stab *getns(Stab *st, Node *n);
-Sym *getdcl(Stab *st, Node *n);
+Node *getdcl(Stab *st, Node *n);
Type *gettype(Stab *st, Node *n);
Stab *curstab(void);
@@ -285,7 +282,6 @@
void pushstab(Stab *st);
void popstab(void);
-Sym *mksym(int line, Node *name, Type *ty);
/* type creation */
void tyinit(Stab *st); /* sets up built in types */
@@ -333,7 +329,7 @@
Node *mkarray(int line, Node **vals);
Node *mkname(int line, char *name);
Node *mknsname(int line, char *ns, char *name);
-Node *mkdecl(int line, Sym *sym);
+Node *mkdecl(int line, Node *name, Type *ty);
Node *mklbl(int line, char *lbl);
Node *mkslice(int line, Node *base, Node *off);
@@ -358,7 +354,7 @@
/* debug */
void dump(Node *t, FILE *fd);
-void dumpsym(Sym *s, FILE *fd);
+void dumpsym(Node *s, FILE *fd);
void dumpstab(Stab *st, FILE *fd);
char *opstr(Op o);
char *nodestr(Ntype nt);
@@ -373,10 +369,10 @@
/* serialization/usefiles */
void typickle(Type *t, FILE *fd);
-void sympickle(Sym *s, FILE *fd);
+void sympickle(Node *s, FILE *fd);
void pickle(Node *n, FILE *fd);
Type *tyunpickle(FILE *fd);
-Sym *symunpickle(FILE *fd);
+Node *symunpickle(FILE *fd);
Node *unpickle(FILE *fd);
/* serializing/unserializing */
--- a/parse/pickle.c
+++ b/parse/pickle.c
@@ -17,8 +17,8 @@
static Type *rdtype(FILE *fd);
static void wrstab(FILE *fd, Stab *val);
static Stab *rdstab(FILE *fd);
-static void wrsym(FILE *fd, Sym *val);
-static Sym *rdsym(FILE *fd);
+static void wrsym(FILE *fd, Node *val);
+static Node *rdsym(FILE *fd);
static void wrstab(FILE *fd, Stab *val)
{
@@ -82,23 +82,35 @@
return st;
}
-static void wrsym(FILE *fd, Sym *val)
+static void wrsym(FILE *fd, Node *val)
{
+ /* sym */
wrint(fd, val->line);
- pickle(val->name, fd);
- wrtype(fd, val->type);
+ pickle(val->decl.name, fd);
+ wrtype(fd, val->decl.type);
+
+ /* symflags */
+ wrint(fd, val->decl.isconst);
+ wrint(fd, val->decl.isgeneric);
+ wrint(fd, val->decl.isextern);
}
-static Sym *rdsym(FILE *fd)
+static Node *rdsym(FILE *fd)
{
int line;
Node *name;
Type *type;
+ Node *n;
line = rdint(fd);
name = unpickle(fd);
type = rdtype(fd);
- return mksym(line, name, type);
+ n = mkdecl(line, name, type);
+
+ n->decl.isconst = rdint(fd);
+ n->decl.isgeneric = rdint(fd);
+ n->decl.isextern = rdint(fd);
+ return n;
}
Type *tyunpickle(FILE *fd)
@@ -106,7 +118,7 @@
return rdtype(fd);
}
-Sym *symunpickle(FILE *fd)
+Node *symunpickle(FILE *fd)
{
return rdsym(fd);
}
@@ -220,7 +232,7 @@
wrtype(fd, t);
}
-void sympickle(Sym *s, FILE *fd)
+void sympickle(Node *s, FILE *fd)
{
wrsym(fd, s);
}
@@ -307,8 +319,16 @@
wrstr(fd, n->lbl.name);
break;
case Ndecl:
- wrsym(fd, n->decl.sym);
- wrint(fd, n->decl.flags);
+ /* sym */
+ pickle(n->decl.name, fd);
+ wrtype(fd, n->decl.type);
+
+ /* symflags */
+ wrint(fd, n->decl.isconst);
+ wrint(fd, n->decl.isgeneric);
+ wrint(fd, n->decl.isextern);
+
+ /* init */
pickle(n->decl.init, fd);
break;
case Nfunc:
@@ -403,8 +423,16 @@
n->lbl.name = rdstr(fd);
break;
case Ndecl:
- n->decl.sym = rdsym(fd);
- n->decl.flags = rdint(fd);
+ /* sym */
+ n->decl.name = unpickle(fd);
+ n->decl.type = rdtype(fd);
+
+ /* symflags */
+ n->decl.isconst = rdint(fd);
+ n->decl.isgeneric = rdint(fd);
+ n->decl.isextern = rdint(fd);
+
+ /* init */
n->decl.init = unpickle(fd);
break;
case Nfunc:
--- a/parse/stab.c
+++ b/parse/stab.c
@@ -47,19 +47,6 @@
return a == b || !strcmp(namestr(a), namestr(b));
}
-Sym *mksym(int line, Node *name, Type *ty)
-{
- static int nextid;
- Sym *sym;
-
- sym = zalloc(sizeof(Sym));
- sym->id = nextid++;
- sym->name = name;
- sym->type = ty;
- sym->line = line;
- return sym;
-}
-
Stab *mkstab()
{
Stab *st;
@@ -72,9 +59,9 @@
}
/* FIXME: do namespaces */
-Sym *getdcl(Stab *st, Node *n)
+Node *getdcl(Stab *st, Node *n)
{
- Sym *s;
+ Node *s;
Stab *orig;
orig = st;
@@ -84,7 +71,7 @@
if (!st->closure)
st->closure = mkht(namehash, nameeq);
if (st != orig)
- htput(st->closure, s->name, s);
+ htput(st->closure, s->decl.name, s);
return s;
}
st = st->super;
@@ -115,16 +102,16 @@
return NULL;
}
-void putdcl(Stab *st, Sym *s)
+void putdcl(Stab *st, Node *s)
{
- Sym *d;
+ Node *d;
- d = getdcl(st, s->name);
+ d = getdcl(st, s->decl.name);
if (d)
- fatal(s->line, "%s already declared (line %d", namestr(s->name), d->line);
+ fatal(s->line, "%s already declared (line %d", namestr(s->decl.name), d->line);
if (st->name)
- setns(s->name, namestr(st->name));
- htput(st->dcl, s->name, s);
+ setns(s->decl.name, namestr(st->name));
+ htput(st->dcl, s->decl.name, s);
}
void updatetype(Stab *st, Node *n, Type *t)
--- a/parse/use.c
+++ b/parse/use.c
@@ -15,7 +15,7 @@
{
char *pkg;
Stab *s;
- Sym *dcl;
+ Node *dcl;
Type *t;
Node *n;
int c;
@@ -106,7 +106,7 @@
Stab *st;
void **k;
Type *t;
- Sym *s;
+ Node *s;
size_t i, n;
st = file->file.exports;
@@ -127,7 +127,7 @@
k = htkeys(st->dcl, &n);
for (i = 0; i < n; i++) {
s = getdcl(st, k[i]);
- if (s->isgeneric)
+ if (s->decl.isgeneric)
wrbyte(f, 'G');
else
wrbyte(f, 'D');
--- a/test/test.sh
+++ b/test/test.sh
@@ -1,8 +1,15 @@
#!/bin/bash
export PATH=.:$PATH
export MC=../8/8m
+export MU=../util/muse
export ASOPT="-g"
+function use {
+ rm -f $1
+ echo $MU $1.myr -o $1.use && \
+ $MU $1.myr -o $1.use && \
+}
+
function build {
rm -f $1
echo $MC $1.myr && \
@@ -34,6 +41,10 @@
for i in `awk '/^B/{print $2}' tests`; do
build $i
+done
+
+for i in `awk '/^U/{print $2}' tests`; do
+ use $i
done
for i in `awk '/^F/{print $2}' tests`; do