commit b8ecba974bf631cdb7814419a2c588a24232f9b1
parent 40ec4f670212682fb942a2110b5de43d3cbf8725
Author: citbl <citbl@citbl.org>
Date: Sun, 16 Nov 2025 23:10:26 +1000
"closures" although not shareable via ptr
Diffstat:
4 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/.zed/debug.json b/.zed/debug.json
@@ -11,7 +11,7 @@
"cwd": "$ZED_WORKTREE_ROOT"
},
"program": "$ZED_WORKTREE_ROOT/oxc",
- "args": ["$ZED_WORKTREE_ROOT/tests/ex-blocks-inner.ox"],
+ "args": ["$ZED_WORKTREE_ROOT/tests/ex-closure-args.ox"],
"request": "launch",
"adapter": "CodeLLDB"
}
diff --git a/src/gen/gen.c b/src/gen/gen.c
@@ -593,7 +593,16 @@ handle_func_call(Gen* gen, Node* node)
// args handling
size_t argc = node->data.call_expr.len;
- gcc_jit_rvalue* args[argc];
+
+ // alloc args
+ gcc_jit_rvalue** args = NULL;
+
+ if (argc > 0) {
+ args = calloc(argc, sizeof *args); // or alloca, or a fixed upper bound
+ for (size_t i = 0; i < argc; ++i) {
+ args[i] = handle_expr(gen, node->data.call_expr.args[i]);
+ }
+ }
for (size_t i = 0; i < argc; i++) {
args[i] = handle_expr(gen, node->data.call_expr.args[i]);
@@ -913,6 +922,8 @@ build_var_decl_statement(Gen* gen, Node* node)
return false;
}
+static void build_func_decl(Gen*, Node*);
+
static bool
build_statement(Gen* gen, Node* node)
{
@@ -999,6 +1010,10 @@ build_statement(Gen* gen, Node* node)
return build_if_statement(gen, node);
case NODE_FOR:
return build_for_statement(gen, node);
+ case NODE_FUNCTION_DECL:
+ // "closure"
+ build_func_decl(gen, node);
+ return false;
default:
printf("build_statement unhandled, %s\n", node_type_str(node->type));
break;
diff --git a/tests/ex-closure-args.ox b/tests/ex-closure-args.ox
@@ -0,0 +1,9 @@
+void main() {
+
+ int add(int a, int b) {
+ return a + b;
+ }
+
+ print(add(5, 5));
+
+}
diff --git a/tests/ex-closure.ox b/tests/ex-closure.ox
@@ -0,0 +1,8 @@
+void main() {
+
+ void hello() {
+ print("hello");
+ }
+
+ hello();
+}