diff options
| author | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-17 00:10:30 +0000 |
|---|---|---|
| committer | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-17 00:10:30 +0000 |
| commit | ea160abc678e9578b5e140121a6d7c59a3b9dd06 (patch) | |
| tree | 0ae4d0ed1449f74d6cc361a5f8787892c0789168 /src/codegen/codegen.c | |
| parent | a5d5a97818fb4fbd26c4fb25a5c410b1a60a1b18 (diff) | |
Improved struct pointer codegen, template instantiation and docs...
Diffstat (limited to 'src/codegen/codegen.c')
| -rw-r--r-- | src/codegen/codegen.c | 91 |
1 files changed, 49 insertions, 42 deletions
diff --git a/src/codegen/codegen.c b/src/codegen/codegen.c index d308662..62f3126 100644 --- a/src/codegen/codegen.c +++ b/src/codegen/codegen.c @@ -596,7 +596,7 @@ void codegen_expression(ParserContext *ctx, ASTNode *node, FILE *out) fprintf(out, "; "); Type *ft = node->call.callee->type_info; - char *ret = type_to_string(ft->inner); + char *ret = codegen_type_to_string(ft->inner); if (strcmp(ret, "string") == 0) { free(ret); @@ -606,7 +606,7 @@ void codegen_expression(ParserContext *ctx, ASTNode *node, FILE *out) fprintf(out, "((%s (*)(void*", ret); for (int i = 0; i < ft->arg_count; i++) { - char *as = type_to_string(ft->args[i]); + char *as = codegen_type_to_string(ft->args[i]); fprintf(out, ", %s", as); free(as); } @@ -792,7 +792,7 @@ void codegen_expression(ParserContext *ctx, ASTNode *node, FILE *out) char *tname = "unknown"; if (node->type_info && node->type_info->inner) { - tname = type_to_string(node->type_info->inner); + tname = codegen_type_to_string(node->type_info->inner); } fprintf(out, "({ "); @@ -1021,7 +1021,7 @@ void codegen_expression(ParserContext *ctx, ASTNode *node, FILE *out) Type *t = node->reflection.target_type; if (node->reflection.kind == 0) { // @type_name - char *s = type_to_string(t); + char *s = codegen_type_to_string(t); fprintf(out, "\"%s\"", s); free(s); } @@ -1112,7 +1112,7 @@ void codegen_expression(ParserContext *ctx, ASTNode *node, FILE *out) int free_ret = 0; if (node->type_info) { - char *t = type_to_string(node->type_info); + char *t = codegen_type_to_string(node->type_info); if (t) { ret_type = t; @@ -1378,7 +1378,8 @@ void codegen_node_single(ParserContext *ctx, ASTNode *node, FILE *out) { fprintf(out, "inline "); } - fprintf(out, "%s %s(%s)\n", node->func.ret_type, node->func.name, node->func.args); + emit_func_signature(out, node, NULL); + fprintf(out, "\n"); fprintf(out, "{\n"); char *prev_ret = g_current_func_ret_type; g_current_func_ret_type = node->func.ret_type; @@ -1527,10 +1528,10 @@ void codegen_node_single(ParserContext *ctx, ASTNode *node, FILE *out) } { char *tname = NULL; - Type *tinfo = node->var_decl.type_info; - if (tinfo && tinfo->name) + // Use type_info with codegen_type_to_string if available + if (node->type_info) { - tname = tinfo->name; + tname = codegen_type_to_string(node->type_info); } else if (node->var_decl.type_str && strcmp(node->var_decl.type_str, "__auto_type") != 0) { @@ -1539,55 +1540,61 @@ void codegen_node_single(ParserContext *ctx, ASTNode *node, FILE *out) if (tname) { + // Cleanup attribute ASTNode *def = find_struct_def(ctx, tname); if (def && def->type_info && def->type_info->has_drop) { fprintf(out, "__attribute__((cleanup(%s__Drop_glue))) ", tname); } - } - } - if (node->var_decl.type_str && strcmp(node->var_decl.type_str, "__auto_type") != 0) - { - emit_var_decl_type(ctx, out, node->var_decl.type_str, node->var_decl.name); - add_symbol(ctx, node->var_decl.name, node->var_decl.type_str, node->var_decl.type_info); - if (node->var_decl.init_expr) - { - fprintf(out, " = "); - codegen_expression(ctx, node->var_decl.init_expr, out); - } - fprintf(out, ";\n"); - } - else - { - char *inferred = NULL; - if (node->var_decl.init_expr) - { - inferred = infer_type(ctx, node->var_decl.init_expr); - } - if (inferred && strcmp(inferred, "__auto_type") != 0) - { - emit_var_decl_type(ctx, out, inferred, node->var_decl.name); - add_symbol(ctx, node->var_decl.name, inferred, NULL); + // Emit Variable with Type + emit_var_decl_type(ctx, out, tname, node->var_decl.name); + add_symbol(ctx, node->var_decl.name, tname, node->type_info); + + if (node->var_decl.init_expr) + { + fprintf(out, " = "); + codegen_expression(ctx, node->var_decl.init_expr, out); + } + fprintf(out, ";\n"); + + if (node->type_info) + { + free(tname); // Free if allocated by codegen_type_to_string + } } else { - emit_auto_type(ctx, node->var_decl.init_expr, node->token, out); - fprintf(out, " %s", node->var_decl.name); + // Inference Fallback + char *inferred = NULL; + if (node->var_decl.init_expr) + { + inferred = infer_type(ctx, node->var_decl.init_expr); + } - if (inferred) + if (inferred && strcmp(inferred, "__auto_type") != 0) { + emit_var_decl_type(ctx, out, inferred, node->var_decl.name); add_symbol(ctx, node->var_decl.name, inferred, NULL); + fprintf(out, " = "); + codegen_expression(ctx, node->var_decl.init_expr, out); + fprintf(out, ";\n"); } else { - // Here we are cooked. + emit_auto_type(ctx, node->var_decl.init_expr, node->token, out); + fprintf(out, " %s", node->var_decl.name); + + if (inferred) + { + add_symbol(ctx, node->var_decl.name, inferred, NULL); + } + + fprintf(out, " = "); + codegen_expression(ctx, node->var_decl.init_expr, out); + fprintf(out, ";\n"); } } - - fprintf(out, " = "); - codegen_expression(ctx, node->var_decl.init_expr, out); - fprintf(out, ";\n"); } break; case NODE_CONST: @@ -1981,7 +1988,7 @@ void codegen_node_single(ParserContext *ctx, ASTNode *node, FILE *out) int free_ret = 0; if (node->type_info) { - char *t = type_to_string(node->type_info); + char *t = codegen_type_to_string(node->type_info); if (t) { ret_type = t; |
