commit 31e2894e2471294731023653f74bd9c3aa076fe6
parent 48a743e93ef92d5aba6f4291f36f14f0af50a42e
Author: Nihal Jere <nihal@nihaljere.xyz>
Date: Thu, 3 Feb 2022 12:22:06 -0600
main: remove decl_alloc
It was only used in one place, so just put it there.
Diffstat:
M | main.c | | | 38 | ++++++++++++++++---------------------- |
1 file changed, 16 insertions(+), 22 deletions(-)
diff --git a/main.c b/main.c
@@ -50,18 +50,6 @@ data_set(const uint64_t addr, const void *const ptr, const size_t len)
}
void
-decl_alloc(struct block *block, struct decl *decl)
-{
- const struct type *const type = &types.data[decl->type];
- if (type->class == TYPE_ARRAY) {
- const struct type *const subtype = &types.data[type->d.arr.subtype];
- decl->w.addr = data_pushzero(subtype->size * type->d.arr.len);
- } else {
- decl->w.addr = data_pushzero(type->size);
- }
-}
-
-void
evalexpr(struct decl *const decl)
{
struct expr *expr = &exprs.data[decl->val];
@@ -86,7 +74,7 @@ evalexpr(struct decl *const decl)
}
void
-gentoplevel(struct toplevel *toplevel, struct block *block)
+gentoplevel(struct toplevel *toplevel, const struct block *const block)
{
char syscallname[] = "syscall0";
stackpush(&blocks, block);
@@ -112,21 +100,20 @@ gentoplevel(struct toplevel *toplevel, struct block *block)
die("toplevel assignments are unimplemented");
case STMT_DECL: {
struct decl *const decl = &block->decls.data[statement->idx];
- struct expr *const expr = &exprs.data[decl->val];
-
- decl_alloc(block, decl);
+ const struct expr *const expr = &exprs.data[decl->val];
+ const struct type *const type = &types.data[decl->type];
- if (expr->class == C_PROC) {
+ if (type->class == TYPE_PROC) {
+ assert(expr->class == C_PROC);
+ assert(expr->kind == EXPR_PROC);
iproc = (struct iproc){
.s = decl->s,
.addr = curaddr
};
- if (slice_cmplit(&decl->s, "main") == 0) {
+ if (slice_cmplit(&decl->s, "main") == 0)
toplevel->entry = curaddr;
- }
- assert(expr->kind == EXPR_PROC);
stackpush(&blocks, &expr->d.proc.block);
typecheck(&blocks, &expr->d.proc.block);
genproc(&blocks, &iproc, &expr->d.proc);
@@ -134,9 +121,16 @@ gentoplevel(struct toplevel *toplevel, struct block *block)
curaddr += targ.emitproc(&toplevel->text, &iproc);
stackpop(&blocks);
} else {
- if (slice_cmplit(&decl->s, "main") == 0) {
+ if (slice_cmplit(&decl->s, "main") == 0)
die("global main must be procedure");
+
+ if (type->class == TYPE_ARRAY) {
+ const struct type *const subtype = &types.data[type->d.arr.subtype];
+ decl->w.addr = data_pushzero(subtype->size * type->d.arr.len);
+ } else {
+ decl->w.addr = data_pushzero(type->size);
}
+
evalexpr(decl);
}
break;
@@ -184,7 +178,7 @@ main(int argc, char *argv[])
typesmap = mkmap(16);
inittypes();
- struct block statements = parse(head);
+ const struct block statements = parse(head);
gentoplevel(&toplevel, &statements);