summaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
authorZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-17 12:14:26 +0000
committerZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-17 12:14:26 +0000
commitd15dbaf025df9265dce417faaa5ccf33ae04d4b5 (patch)
tree57201674789a305c0bc7b82632fa906534dbf37d /src/codegen
parent91e763a600afc86e9630e4db592d8108f65def16 (diff)
Fix for #31
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/codegen.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/src/codegen/codegen.c b/src/codegen/codegen.c
index 370bcec..f019a4b 100644
--- a/src/codegen/codegen.c
+++ b/src/codegen/codegen.c
@@ -668,15 +668,46 @@ void codegen_expression(ParserContext *ctx, ASTNode *node, FILE *out)
}
else
{
+ FuncSig *sig = NULL;
+ if (node->call.callee->type == NODE_EXPR_VAR)
+ {
+ sig = find_func(ctx, node->call.callee->var_ref.name);
+ }
+
ASTNode *arg = node->call.args;
+ int arg_idx = 0;
while (arg)
{
- codegen_expression(ctx, arg, out);
+ int handled = 0;
+ if (sig && arg_idx < sig->total_args)
+ {
+ Type *param_t = sig->arg_types[arg_idx];
+ Type *arg_t = arg->type_info;
+
+ if (param_t && param_t->kind == TYPE_ARRAY && param_t->array_size == 0 &&
+ arg_t && arg_t->kind == TYPE_ARRAY && arg_t->array_size > 0)
+ {
+ char *inner = type_to_string(param_t->inner);
+ fprintf(out, "(Slice_%s){.data = ", inner);
+ codegen_expression(ctx, arg, out);
+ fprintf(out, ", .len = %d, .cap = %d}", arg_t->array_size,
+ arg_t->array_size);
+ free(inner);
+ handled = 1;
+ }
+ }
+
+ if (!handled)
+ {
+ codegen_expression(ctx, arg, out);
+ }
+
if (arg->next)
{
fprintf(out, ", ");
}
arg = arg->next;
+ arg_idx++;
}
}
fprintf(out, ")");