summaryrefslogtreecommitdiff
path: root/cgen.c
diff options
context:
space:
mode:
authorLeo Tenenbaum <pommicket@gmail.com>2019-10-25 09:57:28 -0400
committerLeo Tenenbaum <pommicket@gmail.com>2019-10-25 09:57:52 -0400
commit7352f2c357619e23ed348bdadd48f38f9acd4d86 (patch)
tree39ac2440fb5d58866bc1ac9e57ff58424c235640 /cgen.c
parente278a73bbe573b45f67794301746b08b8fa5c4b2 (diff)
compile time arrays and slices!
Diffstat (limited to 'cgen.c')
-rw-r--r--cgen.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/cgen.c b/cgen.c
index f8e35ff..ab2f370 100644
--- a/cgen.c
+++ b/cgen.c
@@ -1043,7 +1043,7 @@ static bool cgen_val_ptr_pre(CGenerator *g, void *v, Type *t, Location where) {
return false;
}
if (!cgen_type_pre(g, t->slice, where)) return false;
- cgen_write(g, "(d%p_[])", where.code); /* TODO: improve this somehow? */
+ cgen_write(g, "(d%p_[])", v); /* TODO: improve this somehow? */
if (!cgen_type_post(g, t->slice, where)) return false;
cgen_write(g, " = {");
for (U64 i = 0; i < s->n; i++) {
@@ -1051,11 +1051,12 @@ static bool cgen_val_ptr_pre(CGenerator *g, void *v, Type *t, Location where) {
if (!cgen_val_ptr(g, (char *)s->data + i * compiler_sizeof(t->slice), t->slice, where))
return false;
}
- cgen_write(g, "}");
+ cgen_write(g, "};");
+ cgen_nl(g);
} break;
case TYPE_ARR:
for (size_t i = 0; i < t->arr.n; i++) {
- if (!cgen_val_ptr_pre(g, (char *)v + i * compiler_sizeof(t->arr.of), t->arr.of, where))
+ if (!cgen_val_ptr_pre(g, (char *)*(void **)v + i * compiler_sizeof(t->arr.of), t->arr.of, where))
return false;
}
break;
@@ -1083,13 +1084,13 @@ static bool cgen_val_ptr(CGenerator *g, void *v, Type *t, Location where) {
cgen_write(g, "{");
for (size_t i = 0; i < t->arr.n; i++) {
if (i) cgen_write(g, ", ");
- if (!cgen_val_ptr(g, (char *)v + i * compiler_sizeof(t->arr.of), t->arr.of, where))
+ if (!cgen_val_ptr(g, *(char **)v + i * compiler_sizeof(t->arr.of), t->arr.of, where))
return false;
}
cgen_write(g, "}");
break;
case TYPE_SLICE:
- cgen_write(g, "{d%p_, %lu}", where.code, ((Slice *)v)->n);
+ cgen_write(g, "{d%p_, %lu}", v, ((Slice *)v)->n);
break;
case TYPE_FN:
cgen_fn_name(g, *(FnExpr **)v);
@@ -1117,6 +1118,10 @@ static bool cgen_val_ptr(CGenerator *g, void *v, Type *t, Location where) {
return true;
}
+static bool cgen_val_pre(CGenerator *g, Value *v, Type *t, Location where) {
+ return cgen_val_ptr_pre(g, v, t, where);
+}
+
/* generates a value fit for use as an initializer */
static bool cgen_val(CGenerator *g, Value *v, Type *t, Location where) {
/*
@@ -1126,6 +1131,7 @@ static bool cgen_val(CGenerator *g, Value *v, Type *t, Location where) {
return cgen_val_ptr(g, v, t, where);
}
+
static bool cgen_decl(CGenerator *g, Declaration *d) {
if (cgen_fn_is_direct(g, d)) {
if (!cgen_fn(g, &d->expr.fn, d->where))
@@ -1134,6 +1140,8 @@ static bool cgen_decl(CGenerator *g, Declaration *d) {
if (d->type.kind == TYPE_TUPLE) {
long idx = 0;
arr_foreach(d->idents, Identifier, i) {
+ if (!cgen_val_pre(g, &d->val.tuple[idx], &d->type.tuple[idx], d->where))
+ return false;
if (!cgen_type_pre(g, &d->type.tuple[idx], d->where)) return false;
cgen_write(g, " ");
cgen_ident(g, *i);
@@ -1142,20 +1150,17 @@ static bool cgen_decl(CGenerator *g, Declaration *d) {
if (!cgen_val(g, &d->val.tuple[idx], &d->type.tuple[idx], d->where))
return false;
idx++;
+ cgen_write(g, ";");
+ cgen_nl(g);
}
- cgen_write(g, ";");
- cgen_nl(g);
} else {
+ if (!cgen_val_pre(g, &d->val, &d->type, d->where))
+ return false;
if (!cgen_type_pre(g, &d->type, d->where)) return false;
cgen_write(g, " ");
cgen_ident(g, d->idents[0]);
if (!cgen_type_post(g, &d->type, d->where)) return false;
cgen_write(g, " = ");
- if (d->type.kind == TYPE_ARR) {
- I64 *nums = d->val.arr;
- printf("%ld\n",nums[0]);
- }
- return true;
if (!cgen_val(g, &d->val, &d->type, d->where))
return false;
cgen_write(g, ";");