diff options
| author | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-17 12:14:26 +0000 |
|---|---|---|
| committer | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-17 12:14:26 +0000 |
| commit | d15dbaf025df9265dce417faaa5ccf33ae04d4b5 (patch) | |
| tree | 57201674789a305c0bc7b82632fa906534dbf37d /src/codegen | |
| parent | 91e763a600afc86e9630e4db592d8108f65def16 (diff) | |
Fix for #31
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/codegen.c | 33 |
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, ")"); |
