diff options
author | Thomas Voss <mail@thomasvoss.com> | 2024-06-22 01:24:37 +0200 |
---|---|---|
committer | Thomas Voss <mail@thomasvoss.com> | 2024-06-22 01:24:37 +0200 |
commit | f75e2f8b54ea9d77e94aca6e387556981a7795d3 (patch) | |
tree | 2ae007a4fcf1e586bef57f842a997b19704a3d1a /src/analyzer.c | |
parent | 3d771ae059fde300345158d74a7e602ab45399db (diff) |
Do some work on basic basic codegen
Diffstat (limited to 'src/analyzer.c')
-rw-r--r-- | src/analyzer.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/src/analyzer.c b/src/analyzer.c index eaf0ab2..798b34c 100644 --- a/src/analyzer.c +++ b/src/analyzer.c @@ -108,6 +108,7 @@ analyzeprog(struct ast ast, struct lexemes toks, arena *a, struct type **types, analyzeast(*scps, *types, ast, toks, a); *folds = bufalloc(NULL, ast.len, sizeof(**folds)); + memset(*folds, 0, ast.len * sizeof(**folds)); constfold(*folds, *scps, *types, ast, toks, a); } @@ -401,7 +402,8 @@ constfoldexpr(struct cfctx ctx, mpq_t *folds, struct scope *scps, } buf[len] = 0; - (void)mpq_set_str(folds[i], buf, 10); + int ret = mpq_set_str(folds[i], buf, 10); + assert(ret == 0); free(buf); return fwdnode(ast, i); @@ -427,12 +429,24 @@ constfoldexpr(struct cfctx ctx, mpq_t *folds, struct scope *scps, break; case ASTCDECL: case ASTPCDECL: { - *folds[i] = *folds[*ip]; + idx_t_ expr = ast.kids[*ip].rhs; + assert(expr != AST_EMPTY); +#if DEBUG + mpq_init(folds[i]); + mpq_set(folds[i], folds[expr]); +#else + *folds[i] = *folds[expr]; +#endif if ((*folds[i])._mp_den._mp_d == NULL) { ctx.si = lvl; (void)constfolddecl(ctx, folds, scps, types, ast, toks, *ip); - *folds[i] = *folds[*ip]; +#if DEBUG + mpq_init(folds[i]); + mpq_set(folds[i], folds[expr]); +#else + *folds[i] = *folds[expr]; +#endif assert((*folds[i])._mp_den._mp_d != NULL); } break; |