aboutsummaryrefslogtreecommitdiff
path: root/src/analyzer.c
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2024-06-22 01:24:37 +0200
committerThomas Voss <mail@thomasvoss.com> 2024-06-22 01:24:37 +0200
commitf75e2f8b54ea9d77e94aca6e387556981a7795d3 (patch)
tree2ae007a4fcf1e586bef57f842a997b19704a3d1a /src/analyzer.c
parent3d771ae059fde300345158d74a7e602ab45399db (diff)
Do some work on basic basic codegen
Diffstat (limited to 'src/analyzer.c')
-rw-r--r--src/analyzer.c20
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;