ox

The Ox programming language, compiler and tools (WIP)
Log | Files | Refs | README | LICENSE

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:
M.zed/debug.json | 2+-
Msrc/gen/gen.c | 17++++++++++++++++-
Atests/ex-closure-args.ox | 9+++++++++
Atests/ex-closure.ox | 8++++++++
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(); +}