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; |