summaryrefslogtreecommitdiff
path: root/typedefs_cgen.c
diff options
context:
space:
mode:
authorLeo Tenenbaum <pommicket@gmail.com>2019-11-03 19:33:48 -0500
committerLeo Tenenbaum <pommicket@gmail.com>2019-11-03 19:33:48 -0500
commitdb354b0994e4606d8f27e17dc24dbc81f0113c7a (patch)
treeebc727cf2298ecd13052f000ad0fb49cc0aa5cf1 /typedefs_cgen.c
parent7a135cb2d258fee49880d3dd9f5f43096bd73331 (diff)
started to get user-defined types to work with pointers to future types
Diffstat (limited to 'typedefs_cgen.c')
-rw-r--r--typedefs_cgen.c35
1 files changed, 31 insertions, 4 deletions
diff --git a/typedefs_cgen.c b/typedefs_cgen.c
index 8228a24..f652ca1 100644
--- a/typedefs_cgen.c
+++ b/typedefs_cgen.c
@@ -72,11 +72,14 @@ static bool typedefs_expr(CGenerator *g, Expression *e) {
return false;
fn_exit(&e->fn);
break;
+ case EXPR_NEW:
+ if (e->new.n && !typedefs_expr(g, e->new.n))
+ return false;
+ break;
case EXPR_TYPE:
case EXPR_C:
case EXPR_DSIZEOF:
case EXPR_DALIGNOF:
- case EXPR_NEW:
case EXPR_IDENT:
case EXPR_LITERAL_BOOL:
case EXPR_LITERAL_INT:
@@ -90,17 +93,41 @@ static bool typedefs_expr(CGenerator *g, Expression *e) {
}
static bool typedefs_decl(CGenerator *g, Declaration *d) {
+ d->c.ids = NULL;
for (int idx = 0; idx < (int)arr_len(d->idents); idx++) {
Identifier i = d->idents[idx];
Type *type = decl_type_at_index(d, idx);
Value *val = decl_val_at_index(d, idx);
if (type->kind == TYPE_TYPE) {
+ if (d->c.ids == NULL)
+ d->c.ids = calloc(arr_len(d->idents), sizeof *d->c.ids);
/* generate typedef */
+ IdentID id;
+ if (g->block != NULL) id = d->c.ids[idx] = g->ident_counter++;
cgen_write(g, "typedef ");
- if (!cgen_type_pre(g, val->type, d->where)) return false;
+ if (val->type->kind == TYPE_STRUCT) {
+ cgen_write(g, "struct ");
+ if (g->block == NULL) {
+ /* we can refer to this by its name */
+ cgen_ident(g, i);
+ } else {
+ /* we need to use an ID ): */
+ cgen_ident_id(g, id);
+ }
+ } else {
+ if (!cgen_type_pre(g, val->type, d->where)) return false;
+ }
cgen_write(g, " ");
- cgen_ident(g, i);
- if (!cgen_type_post(g, val->type, d->where)) return false;
+ if (g->block == NULL) {
+ /* we can refer to this by its name */
+ cgen_ident(g, i);
+ } else {
+ /* we need to use an ID ): */
+ cgen_ident_id(g, id);
+ }
+ if (val->type->kind != TYPE_STRUCT) {
+ if (!cgen_type_post(g, val->type, d->where)) return false;
+ }
cgen_write(g, ";");
cgen_nl(g);
}