commit b4df549b3d60fcbb55edcbc926e02b4d23be3447
parent e33fd2345f8a8d0775d761041c65256e4cfc81e0
Author: m21c <ho*******@gmail.com>
Date: Tue, 16 Jun 2026 23:06:23 +0200
worked on mem management
Diffstat:
| M | compiler.c | | | 190 | ++++++++++++++++++++++++++++++++++++++++++++----------------------------------- |
1 file changed, 106 insertions(+), 84 deletions(-)
diff --git a/compiler.c b/compiler.c
@@ -604,6 +604,9 @@ struct Env {
bool pending;
Env *pendingnext, *pendingprev;
+
+ /* carry on source for memory management*/
+ SourceArenas *arenas;
};
typedef
@@ -643,6 +646,7 @@ struct Source {
Node *lastis;
/* stack-alloc save state */
+ SourceArenas arenas;
} Source;
struct AnnotParam {
@@ -808,7 +812,6 @@ struct Analysis {
// @section global-vars {{{
Source testsource;
-SourceArenas sourcearenas;
SourceArenas *arenas;
@@ -1983,10 +1986,10 @@ getunarysuffix(Source *source)
Node *poolednodes;
int poolednodecount, totalnodecount;
-#define tokennode(source, lhs) makenode(&(source)->tok, (lhs))
+#define tokennode(source, lhs) makenode(&(source)->arenas, &(source)->tok, (lhs))
static Node *
-makenode(Node *orig, Node *lhs)
+makenode(SourceArenas *arenas, Node *orig, Node *lhs)
{
Node *node;
@@ -2063,7 +2066,7 @@ deletenode(Node *node)
// @section type-struct {{{
static Type *
-maketype(SrcLoc *loc, Type *orig, Type *target)
+maketype(SourceArenas *arenas, SrcLoc *loc, Type *orig, Type *target)
{
Type *ty = myalloc(&arenas->type, Type);
@@ -2081,7 +2084,7 @@ maketype(SrcLoc *loc, Type *orig, Type *target)
// @section annotation {{{
static Annot *
-makeannot(SrcLoc *loc, int key)
+makeannot(SourceArenas *arenas, SrcLoc *loc, int key)
{
Annot *annot = myalloc(&arenas->annot, Annot);
@@ -2094,7 +2097,7 @@ makeannot(SrcLoc *loc, int key)
}
static Docket *
-makedocket(Node *node)
+makedocket(SourceArenas *arenas, Node *node)
{
Docket *docket = myalloc(&arenas->docket, Docket);
@@ -2183,7 +2186,7 @@ setheadenv(Source *source, EnvKind kind)
{
/* @note this might only be useful for parameter => function env
* translation */
- Env *env = myalloc(&arenas->env, Env);
+ Env *env = myalloc(&source->arenas.env, Env);
env->kind = kind;
@@ -2196,6 +2199,7 @@ setheadenv(Source *source, EnvKind kind)
env->below = source->currenv;
assert(source->headenv == NULL);
+ env->arenas = &source->arenas;
source->currenv = source->headenv = env;
return env;
@@ -2216,7 +2220,7 @@ pushenv(Source *source, EnvKind kind)
return source->currenv;
}
- env = myalloc(&arenas->env, Env);
+ env = myalloc(&source->arenas.env, Env);
env->kind = kind;
/* @todo make sure that source->tok.loc is the correct
* source-location. */
@@ -2226,6 +2230,7 @@ pushenv(Source *source, EnvKind kind)
env->loc = source->tok.loc;
env->below = source->currenv;
+ env->arenas = &source->arenas;
source->currenv = env;
return env;
@@ -2292,7 +2297,7 @@ deferfuncenv(Source *source, int keydeclinfunc)
static Node *
wrapenv(Node *node, Env *env)
{
- Node *aenv = makenode(node, node);
+ Node *aenv = makenode(env->arenas, node, node);
aenv->kind = AENV;
aenv->u.env = env;
@@ -2385,7 +2390,7 @@ makedecl(Source *source, int key, DeclKind kind)
);
}
- decl = myalloc(&arenas->decl, Decl);
+ decl = myalloc(&source->arenas.decl, Decl);
decl->kind = kind;
/* @todo make sure that source->tok.loc is the correct
@@ -2412,7 +2417,7 @@ makebundle(Source *source, int key, Decl *parentbundle)
/* assert(currenv); */
- decl = myalloc(&arenas->decl, Decl);
+ decl = myalloc(&source->arenas.decl, Decl);
decl->kind = DBUNDLE;
/* @todo make sure that source->tok.loc is the correct
@@ -2449,7 +2454,7 @@ makedecl2(SrcLoc *loc, Env *env, int key, DeclKind kind)
error(loc, "'%s' already declared", getstring(idents, key));
}
- decl = myalloc(&arenas->decl, Decl);
+ decl = myalloc(&env->arenas->decl, Decl);
decl->kind = kind;
/* @todo make sure that source->tok.loc is the correct
@@ -2478,7 +2483,7 @@ defertypedeclaration(Source *source, int key)
/* FIXME(m21c): type may be overwritten, when the declaration
* is completed */
- decl->type = maketype(&source->tok.loc, primitive(TVOID), NULL);
+ decl->type = maketype(&source->arenas, &source->tok.loc, primitive(TVOID), NULL);
decl->type->module = decl;
source->currenv = savedcurrenv;
@@ -2630,7 +2635,7 @@ readannots(Source *source)
if (!expect(source, IDENT, "expected annotation-identifier."))
return;
- annot = makeannot(&loc, key);
+ annot = makeannot(&source->arenas, &loc, key);
if (getkind(source) == LPARDELIM) {
int count;
@@ -2659,7 +2664,7 @@ readannots(Source *source)
}
if (docket == NULL) {
- docket = makedocket(NULL);
+ docket = makedocket(&source->arenas, NULL);
/* @todo add docket to source */
}
@@ -2872,7 +2877,7 @@ advance:
(void) flags;
if (getkind(source) == LSQRDELIM) {
- Type *tmp = maketype(getloc(source), primitive(TARRAY), basetype);
+ Type *tmp = maketype(&source->arenas, getloc(source), primitive(TARRAY), basetype);
basetype = tmp;
gettok(source);
@@ -2884,7 +2889,7 @@ advance:
}
if (getkind(source) == OMUL) {
- Type *tmp = maketype(getloc(source), primitive(TPTR), basetype);
+ Type *tmp = maketype(&source->arenas, getloc(source), primitive(TPTR), basetype);
basetype = tmp;
gettok(source);
@@ -3039,7 +3044,7 @@ redodeclaration:
if (selfparam) {
param = makedecl(source, auxself, DVAR);
- param->type = maketype(¶m->loc,
+ param->type = maketype(&source->arenas, ¶m->loc,
prim + TPTR, module);
param->flags |= MSPECIAL;
/* @note param doesn't need to be added to
@@ -3061,7 +3066,7 @@ redodeclaration:
param->kind = DPARAM;
}
} else if (selfparam) {
- Type *selftype = maketype(&decl->loc,
+ Type *selftype = maketype(&source->arenas, &decl->loc,
primitive(TPTR), module);
Decl *selfdecl;
@@ -3081,7 +3086,7 @@ redodeclaration:
"cannot infer return type of function");
}
- decl->type = maketype(&decl->loc, primitive(TFUNCTION), paramtype);
+ decl->type = maketype(&source->arenas, &decl->loc, primitive(TFUNCTION), paramtype);
decl->kind = DFUNCTION;
decl->type->u.rtarget = ty;
ty = decl->type;
@@ -3313,7 +3318,7 @@ readrecord(Source *source, bool isunion)
if (module->type->module == module) {
*module->type = prim[TSTRUCT];
} else {
- module->type = maketype(&recordnode->loc, prim + typekind, NULL);
+ module->type = maketype(&source->arenas, &recordnode->loc, prim + typekind, NULL);
}
module->type->module = module;
@@ -3387,7 +3392,7 @@ readrecordinitfield(Source *source, Type *recordtype)
if (getkind(source) == COLONDELIM) {
gettok(source);
/* @todo associate field name with field in record type */
- fieldinit->lhs = makenode(&savedtok, NULL);
+ fieldinit->lhs = makenode(&source->arenas, &savedtok, NULL);
} else {
pushbacktok(source, &savedtok);
}
@@ -3506,7 +3511,7 @@ readatom(Source *source, int flags)
lhs->lhs->kind == TYPE &&
lhs->rhs->kind == TYPE)
{
- Type *ty = maketype(&lhs->loc, primitive(TTUPLE), NULL);
+ Type *ty = maketype(&source->arenas, &lhs->loc, primitive(TTUPLE), NULL);
ty->target = lhs->lhs->type;
ty->u.rtarget = lhs->rhs->type;
deletenode(lhs);
@@ -3569,7 +3574,7 @@ readatom(Source *source, int flags)
case KNULL:
lhs = tokennode(source, NULL);
lhs->kind = NUMBER;
- lhs->type = maketype(&source->tok.loc, primitive(TPTR), primitive(TVOID));
+ lhs->type = maketype(&source->arenas, &source->tok.loc, primitive(TPTR), primitive(TVOID));
lhs->u.u = (uintmax_t) (getkind(source) == KTRUE);
gettok(source);
break;
@@ -3982,7 +3987,7 @@ exprlist(Source *source, bool isparam, Type *paramtype)
lhs->lhs->kind == TYPE &&
lhs->rhs->kind == TYPE)
{
- lhs->type = maketype(&lhs->loc, primitive(TTUPLE),
+ lhs->type = maketype(&source->arenas, &lhs->loc, primitive(TTUPLE),
lhs->lhs->type);
lhs->type->u.rtarget = lhs->rhs->type;
@@ -4207,10 +4212,10 @@ convint(int srcsize, bool srcsigned, uintmax_t value)
}
static Node *
-conv(Node *node);
+conv(Env *env, Node *node);
static Node *
-wrap(Type *type, Node *node)
+wrap(Env *env, Type *type, Node *node)
{
Type *nodetype = node->type;
@@ -4277,7 +4282,7 @@ wrap(Type *type, Node *node)
/* implicit referencing: */
if (type->kind == TPTR && type->target->kind == nodetype->kind) {
- node = makenode(node, node);
+ node = makenode(env->arenas, node, node);
node->kind = OADDR;
node->type = type->target;
@@ -4288,7 +4293,7 @@ wrap(Type *type, Node *node)
/* implicit de-referencing: */
if (nodetype->kind == TPTR && nodetype->target->kind == type->kind) {
- node = makenode(node, node);
+ node = makenode(env->arenas, node, node);
node->kind = ODEREF;
node->type = type;
@@ -4297,7 +4302,7 @@ wrap(Type *type, Node *node)
}
doconversion:
- node = makenode(node, node);
+ node = makenode(env->arenas, node, node);
node->kind = ACONV;
node->type = type;
@@ -4305,17 +4310,17 @@ doconversion:
}
static Node *
-conv(Node *node)
+conv(Env *env, Node *node)
{
Type *ty = node->type;
assert(ty);
if (ty->kind == TINFER)
- return wrap(primitive(TINT), node);
+ return wrap(env, primitive(TINT), node);
if (ty->kind == TUINFER)
- return wrap(primitive(TUINT), node);
+ return wrap(env, primitive(TUINT), node);
return node;
}
@@ -4355,7 +4360,7 @@ arithtuplereorder(Env *env, Node *expr, int numops)
expr->lhs->kind = expr->kind;
tmp = expr->rhs;
- expr->rhs = makenode(expr, expr->lhs->rhs);
+ expr->rhs = makenode(env->arenas, expr, expr->lhs->rhs);
expr->lhs->rhs = tmp; /* @note some unary nodes may have a rhs? */
expr->rhs->rhs = tmp; /* @todo make a copy */
expr->kind = ACOMMA;
@@ -4376,10 +4381,10 @@ typecheckdecl(Env *env, Decl *decl)
decl->u.content = typecheck(env, decl->u.content);
if (decl->type->kind == TINFER) {
- decl->u.content = conv(decl->u.content);
+ decl->u.content = conv(env, decl->u.content);
decl->type = decl->u.content->type;
} else {
- decl->u.content = wrap(decl->type, decl->u.content);
+ decl->u.content = wrap(env, decl->type, decl->u.content);
}
} else if (decl->kind == DFUNCTION) {
if (!decl->u.content)
@@ -4413,7 +4418,7 @@ substitutedispatch(Env *env, Node *expr)
expr->type->u.rtarget = expr->lhs->type;
return expr;
#else
- Node *result = makenode(expr, NULL);
+ Node *result = makenode(env->arenas, expr, NULL);
result->kind = ADECLREF;
result->u.declref = expr->u.declref;
result->type = expr->type;
@@ -4447,9 +4452,9 @@ selfdispatchcall(Env *env, Node *expr)
assert(self->type);
if (self->type->kind == TSTRUCT || self->type->kind == TUNION) {
- self = makenode(self, self);
+ self = makenode(env->arenas, self, self);
self->kind = OADDR;
- self->type = maketype(&self->loc, primitive(TINT), self->type);
+ self->type = maketype(env->arenas, &self->loc, primitive(TINT), self->type);
} else if (self->type->kind != TPTR) {
error(&self->loc, "expected struct or union or pointer type");
} else if (self->type->target->kind != TSTRUCT &&
@@ -4463,7 +4468,7 @@ selfdispatchcall(Env *env, Node *expr)
}
if (expr->rhs->kind != ACOMMA) {
- insert = makenode(expr->rhs, self);
+ insert = makenode(env->arenas, expr->rhs, self);
insert->kind = ACOMMA;
insert->rhs = expr->rhs;
expr->rhs = insert;
@@ -4475,7 +4480,7 @@ selfdispatchcall(Env *env, Node *expr)
while (probe->lhs && probe->lhs->kind == ACOMMA)
probe = probe->lhs;
- insert = makenode(probe, self);
+ insert = makenode(env->arenas, probe, self);
insert->rhs = probe->lhs;
probe->lhs = insert;
@@ -4513,7 +4518,7 @@ resolvepending(Env *env, Node *expr)
}
static Node *
-dispatch(Node *expr, Node *parent)
+dispatch(Env *env, Node *expr, Node *parent)
{
Type *type;
Decl *field;
@@ -4525,7 +4530,7 @@ dispatch(Node *expr, Node *parent)
/* @todo maybe do implicit dereference */
if (type->kind == TPTR) {
- Node *lhs = makenode(expr->lhs, expr->lhs);
+ Node *lhs = makenode(env->arenas, expr->lhs, expr->lhs);
lhs->kind = ADEREF;
lhs->type = type->target;
@@ -4574,18 +4579,18 @@ forloop(Env *env, Node *expr, Node *header)
error(&it->loc, "for loop variable must be initialized");
return;
}
- it->u.content = makenode(header, NULL);
+ it->u.content = makenode(env->arenas, header, NULL);
it->u.content->kind = NUMBER;
it->u.content->type = it->type;
it->u.content->u.u = 0;
}
- header->lhs = conv(typecheck(env, header->lhs));
+ header->lhs = conv(env, typecheck(env, header->lhs));
}
/* @todo do proper typechecking */
- header->rhs = wrap(header->lhs->type, typecheck(env, header->rhs));
- header->u.payload = wrap(header->lhs->type, typecheck(env, header->u.payload));
+ header->rhs = wrap(env, header->lhs->type, typecheck(env, header->rhs));
+ header->u.payload = wrap(env, header->lhs->type, typecheck(env, header->u.payload));
return;
}
@@ -4594,7 +4599,7 @@ forloop(Env *env, Node *expr, Node *header)
return;
}
- header = expr->u.payload = conv(typecheck(env, header));
+ header = expr->u.payload = conv(env, typecheck(env, header));
if (isarithtype(header->type)) {
Decl *it;
@@ -4604,22 +4609,22 @@ forloop(Env *env, Node *expr, Node *header)
it = makedecl2(&header->loc, env,
getstringkey(&idents, "it", 2), DVAR);
it->type = header->type;
- it->u.content = makenode(header, NULL);
+ it->u.content = makenode(env->arenas, header, NULL);
it->u.content->kind = NUMBER;
it->u.content->type = header->type;
it->u.content->u.u = 0;
- forstep = makenode(header, NULL);
+ forstep = makenode(env->arenas, header, NULL);
forstep->kind = AFORSTEP;
forstep->type = header->type;
- forstep->lhs = makenode(header, NULL);
+ forstep->lhs = makenode(env->arenas, header, NULL);
forstep->lhs->kind = ADECL;
forstep->lhs->u.declref = it;
forstep->rhs = header;
- forstep->u.payload = makenode(header, NULL);
+ forstep->u.payload = makenode(env->arenas, header, NULL);
forstep->u.payload->kind = NUMBER;
forstep->u.payload->type = header->type;
/* @todo handle negative step when possible
@@ -4686,12 +4691,12 @@ typecheck(Env *env, Node *expr)
case ODISP:
case ASELFDISP:
lhs = typecheck(env, lhs);
- expr->lhs = conv(lhs);
+ expr->lhs = conv(env, lhs);
if (parenttop > 1)
- return dispatch(expr, parentnodes[parenttop - 2]);
+ return dispatch(env, expr, parentnodes[parenttop - 2]);
- return dispatch(expr, NULL);
+ return dispatch(env, expr, NULL);
case OCALL:
reporton(lhs->type->kind == TPTR && lhs->type->target->kind != TFUNCTION,
@@ -4710,7 +4715,7 @@ typecheck(Env *env, Node *expr)
return expr;
case OARRAY:
- expr->lhs = conv(lhs);
+ expr->lhs = conv(env, lhs);
reporton(lhs->type->kind != TARRAY && lhs->type->kind != TPTR,
&expr->loc, "operand is not an array or pointer");
@@ -4720,7 +4725,7 @@ typecheck(Env *env, Node *expr)
reporton(!isinttype(rhs->type),
&rhs->loc, "array index is not an integer");
- expr->rhs = wrap(primitive(TUSIZE), expr->rhs);
+ expr->rhs = wrap(env, primitive(TUSIZE), expr->rhs);
expr->type = lhs->type->target;
return expr;
@@ -4729,7 +4734,7 @@ typecheck(Env *env, Node *expr)
reporton(!islvalue(lhs),
&expr->loc, "operand is not an lvalue");
- expr->lhs = conv(lhs);
+ expr->lhs = conv(env, lhs);
expr->type = lhs->type;
return expr;
@@ -4746,7 +4751,7 @@ typecheck(Env *env, Node *expr)
reporton(!islvalue(lhs),
&expr->loc, "operand is not an lvalue");
- expr->type = maketype(&expr->loc, primitive(TPTR), lhs->type);
+ expr->type = maketype(env->arenas, &expr->loc, primitive(TPTR), lhs->type);
return expr;
case OPLUS: case OMINUS:
@@ -4755,7 +4760,7 @@ typecheck(Env *env, Node *expr)
&lhs->loc, "expression is not of arithmetic type");
*/
- expr->lhs = conv(lhs);
+ expr->lhs = conv(env, lhs);
expr->type = lhs->type;
return expr;
@@ -4763,7 +4768,7 @@ typecheck(Env *env, Node *expr)
reporton(!isintorbooltype(lhs->type),
&lhs->loc, "expression is not of integer type");
- expr->lhs = conv(lhs);
+ expr->lhs = conv(env, lhs);
expr->type = lhs->type;
return expr;
@@ -4772,7 +4777,7 @@ typecheck(Env *env, Node *expr)
&lhs->loc, "expression is not of arithmetic type");
expr->type = primitive(TBOOL);
- expr->lhs = conv(lhs); /* cannot be wrap(expr->type, lhs) */
+ expr->lhs = conv(env, lhs); /* cannot be wrap(expr->type, lhs) */
return expr;
case OCAST:
@@ -4798,8 +4803,8 @@ typecheck(Env *env, Node *expr)
else
expr->type = lhs->type;
- expr->lhs = wrap(expr->type, lhs);
- expr->rhs = wrap(expr->type, rhs);
+ expr->lhs = wrap(env, expr->type, lhs);
+ expr->rhs = wrap(env, expr->type, rhs);
return expr;
case OBAND: case OBOR: case OXOR:
@@ -4812,16 +4817,16 @@ typecheck(Env *env, Node *expr)
else
expr->type = lhs->type;
- expr->lhs = wrap(expr->type, lhs);
- expr->rhs = wrap(expr->type, rhs);
+ expr->lhs = wrap(env, expr->type, lhs);
+ expr->rhs = wrap(env, expr->type, rhs);
return expr;
case OLSH: case ORSH: case OARSH:
reporton(!isinttype(lhs->type) || !isinttype(rhs->type),
&expr->loc, "expression is not of integer type");
- expr->lhs = conv(lhs);
- expr->rhs = wrap(primitive(TINT), rhs);
+ expr->lhs = conv(env, lhs);
+ expr->rhs = wrap(env, primitive(TINT), rhs);
expr->type = lhs->type;
return expr;
@@ -4831,8 +4836,8 @@ typecheck(Env *env, Node *expr)
reporton(!isarithtype(lhs->type) || !isarithtype(rhs->type),
&expr->loc, "expression is not of arithmetic type");
- expr->lhs = conv(lhs);
- expr->rhs = conv(rhs);
+ expr->lhs = conv(env, lhs);
+ expr->rhs = conv(env, rhs);
expr->type = primitive(TBOOL);
return expr;
@@ -4841,8 +4846,8 @@ typecheck(Env *env, Node *expr)
&expr->loc, "expression is not of arithmetic type");
expr->type = primitive(TBOOL);
- expr->lhs = wrap(expr->type, lhs);
- expr->rhs = wrap(expr->type, rhs);
+ expr->lhs = wrap(env, expr->type, lhs);
+ expr->rhs = wrap(env, expr->type, rhs);
return expr;
case OMULA: case ODIVA: case OMODA:
@@ -4863,9 +4868,9 @@ typecheck(Env *env, Node *expr)
reporton(!islvalue(lhs),
&expr->loc, "left-hand-side is not an lvalue");
- expr->lhs = conv(lhs);
+ expr->lhs = conv(env, lhs);
expr->type = lhs->type;
- expr->rhs = wrap(expr->type, rhs);
+ expr->rhs = wrap(env, expr->type, rhs);
return expr;
case KIF:
@@ -4873,7 +4878,7 @@ typecheck(Env *env, Node *expr)
case KUNTIL:
assert(expr->u.payload);
expr->u.payload = typecheck(env, expr->u.payload);
- expr->u.payload = wrap(primitive(TBOOL), expr->u.payload);
+ expr->u.payload = wrap(env, primitive(TBOOL), expr->u.payload);
if (lhs)
expr->lhs = typecheck(env, lhs);
@@ -4939,7 +4944,7 @@ typecheck(Env *env, Node *expr)
assert(lhs);
lhs = typecheck(env, lhs);
- expr->lhs = conv(lhs);
+ expr->lhs = conv(env, lhs);
return expr;
case ACOMPOUND:
@@ -4982,10 +4987,10 @@ typecheck(Env *env, Node *expr)
rhs = typecheck(env, rhs);
/* @note converting nodes may be uneccessary */
- expr->lhs = conv(lhs);
- expr->rhs = conv(rhs);
+ expr->lhs = conv(env, lhs);
+ expr->rhs = conv(env, rhs);
- expr->type = maketype(&expr->loc, primitive(TTUPLE), lhs->type);
+ expr->type = maketype(env->arenas, &expr->loc, primitive(TTUPLE), lhs->type);
expr->type->u.rtarget = rhs->type;
return expr;
@@ -5048,7 +5053,7 @@ typecheck(Env *env, Node *expr)
&expr->loc, "expected return value");
if (rhs)
- expr->lhs = wrap(expr->type, rhs);
+ expr->lhs = wrap(env, expr->type, rhs);
return expr;
@@ -5812,7 +5817,7 @@ substituenfs(Env *env, Node *expr)
}
if (decl->kind == DFUNCTION && isnestedfunction(decl->contentenv)) {
- enlist = makenode(expr, NULL);
+ enlist = makenode(env->arenas, expr, NULL);
expr->kind = ADECLREF;
assert(extractedtop < lengthof(extracted));
@@ -8372,7 +8377,8 @@ processfile(Source *source)
appendconduct(block, CSCOPE, NULL);
intrinsic = makedecl(source, getstringkey(&idents, "printf", 6), DFUNCTION);
- intrinsic->type = maketype(&source->tok.loc, primitive(TFUNCTION), NULL);
+ intrinsic->type = maketype(&source->arenas, &source->tok.loc,
+ primitive(TFUNCTION), NULL);
intrinsic->type->u.rtarget = primitive(TINT);
cginit(&cg, source->currenv, fopen("out.c", "wb"));
@@ -8416,8 +8422,9 @@ processfile(Source *source)
popenv(source);
highlight(stdout, HLINFO);
- printf("exiting with %u errors and %u warnings ...\x1b[0m\n",
+ printf("exiting with %u errors and %u warnings ...\n",
errorcount, warningcount);
+ highlight(stdout, HLNONE);
fclose(cg.out);
}
@@ -8426,7 +8433,7 @@ int
main(int argc, char **argv)
{
Source *source = &testsource;
- arenas = &sourcearenas;
+ arenas = &source->arenas;
initkeywords();
initstrmap(&idents);
@@ -8451,6 +8458,21 @@ main(int argc, char **argv)
processfile(source);
+ highlight(stdout, HLINFO);
+ printf("number of nodes: % 6zu\n", arenas->node.top);
+ printf("number of types: % 6zu\n", arenas->type.top);
+ printf("number of environments: % 6zu\n", arenas->env.top);
+ printf("number of declarations: % 6zu\n", arenas->decl.top);
+ printf("number of annotations: % 6zu\n", arenas->annot.top);
+ printf("number of dockets: % 6zu\n", arenas->docket.top);
+ printf("number of records: % 6zu\n", arenas->record.top);
+ printf("number of fields: % 6zu\n", arenas->field.top);
+ printf("number of blocks: % 6zu\n", arenas->block.top);
+ printf("number of conducts: % 6zu\n", arenas->conduct.top);
+ printf("number of gists: % 6zu\n", arenas->gist.top);
+ highlight(stdout, HLNONE);
+ printf("\x1b[0m");
+
/* fclose(source->filein); */
/* disposestrmap(&strings); */
/* disposestrmap(&idents); */