summaryrefslogtreecommitdiff
path: root/decls_cgen.c
diff options
context:
space:
mode:
Diffstat (limited to 'decls_cgen.c')
-rw-r--r--decls_cgen.c94
1 files changed, 10 insertions, 84 deletions
diff --git a/decls_cgen.c b/decls_cgen.c
index ad0c552..7ac286d 100644
--- a/decls_cgen.c
+++ b/decls_cgen.c
@@ -3,72 +3,15 @@ static bool cgen_decls_block(CGenerator *g, Block *b);
static bool cgen_decls_expr(CGenerator *g, Expression *e) {
switch (e->kind) {
- case EXPR_UNARY_OP:
- if (!cgen_decls_expr(g, e->unary.of))
- return false;
- break;
- case EXPR_BINARY_OP:
- if (!cgen_decls_expr(g, e->binary.lhs))
- return false;
-
- if (e->binary.op != BINARY_DOT)
- if (!cgen_decls_expr(g, e->binary.rhs))
- return false;
- break;
- case EXPR_CAST:
- if (!cgen_decls_expr(g, e->cast.expr))
- return false;
- break;
case EXPR_CALL:
- if (!cgen_decls_expr(g, e->call.fn))
- return false;
- arr_foreach(e->call.arg_exprs, Expression, a)
- if (!cgen_decls_expr(g, a))
- return false;
- break;
- case EXPR_BLOCK:
- if (!cgen_decls_block(g, &e->block))
- return false;
- break;
- case EXPR_IF:
- if (e->if_.cond)
- if (!cgen_decls_expr(g, e->if_.cond))
- return false;
- if (!cgen_decls_block(g, &e->if_.body))
- return false;
- if (e->if_.next_elif)
- if (!cgen_decls_expr(g, e->if_.next_elif))
- return false;
- break;
- case EXPR_WHILE:
- if (e->while_.cond)
- if (!cgen_decls_expr(g, e->while_.cond))
- return false;
- if (!cgen_decls_block(g, &e->while_.body))
- return false;
- break;
- case EXPR_EACH: {
- EachExpr *ea = &e->each;
- if (ea->flags & EACH_IS_RANGE) {
- if (!cgen_decls_expr(g, ea->range.from))
- return false;
- if (ea->range.to && !cgen_decls_expr(g, ea->range.to))
- return false;
- /* step is a value, not an expression */
- } else {
- if (!cgen_decls_expr(g, ea->of))
- return false;
+ if (e->call.fn->kind == EXPR_IDENT) {
+ IdentDecl *idecl = ident_decl(e->call.fn->ident);
+ if (idecl->kind == IDECL_DECL &&
+ idecl->decl->expr.kind == EXPR_FN) {
+ /* directly calling a function; might need to generate a copy of this function */
+ /* TODO ASDF */
+ }
}
- } break;
- case EXPR_TUPLE:
- arr_foreach(e->tuple, Expression, x)
- if (!cgen_decls_expr(g, x))
- return false;
- break;
- case EXPR_SLICE:
- if (!cgen_decls_expr(g, e->slice.of)) return false;
- if (e->slice.from && !cgen_decls_expr(g, e->slice.from)) return false;
- if (e->slice.to && !cgen_decls_expr(g, e->slice.to)) return false;
break;
case EXPR_FN:
e->fn.c.name = NULL;
@@ -78,24 +21,13 @@ static bool cgen_decls_expr(CGenerator *g, Expression *e) {
return false;
cgen_write(g, ";");
cgen_nl(g);
- if (!cgen_decls_block(g, &e->fn.body))
- return false;
fn_exit(&e->fn);
break;
- case EXPR_TYPE:
- case EXPR_VAL:
- case EXPR_C:
- case EXPR_DSIZEOF:
- case EXPR_DALIGNOF:
- case EXPR_NEW:
- case EXPR_IDENT:
- case EXPR_LITERAL_BOOL:
- case EXPR_LITERAL_INT:
- case EXPR_LITERAL_STR:
- case EXPR_LITERAL_CHAR:
- case EXPR_LITERAL_FLOAT:
+ default:
break;
}
+ cgen_recurse_subexprs(g, e, cgen_decls_expr, cgen_decls_block);
+
return true;
}
@@ -149,12 +81,6 @@ static bool cgen_decls_stmt(CGenerator *g, Statement *s) {
static bool cgen_decls_file(CGenerator *g, ParsedFile *f) {
cgen_write(g, "/* declarations */\n");
arr_foreach(f->stmts, Statement, s) {
- /* if only (you need to recurse!) */
- /* OPTIM?? */
- if (s->kind == STMT_DECL) {
- }
- }
- arr_foreach(f->stmts, Statement, s) {
if (!cgen_decls_stmt(g, s))
return false;
}