summaryrefslogtreecommitdiff
path: root/src/codegen/codegen.c
diff options
context:
space:
mode:
authorZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-17 00:10:30 +0000
committerZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-17 00:10:30 +0000
commitea160abc678e9578b5e140121a6d7c59a3b9dd06 (patch)
tree0ae4d0ed1449f74d6cc361a5f8787892c0789168 /src/codegen/codegen.c
parenta5d5a97818fb4fbd26c4fb25a5c410b1a60a1b18 (diff)
Improved struct pointer codegen, template instantiation and docs...
Diffstat (limited to 'src/codegen/codegen.c')
-rw-r--r--src/codegen/codegen.c91
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;