ffi issue-0048: bare $args slice loses .len across call — xfail lock-in
Bare `$args` evaluated inside a pack-fn body has the right `.len` / per-element types inline, but the moment the same slice is passed as an argument to another function, the callee silently reads length 0 and every element comes back as undef. Cause (per issue file): `lazyLowerFunction` saves/restores builder state but not `pack_arg_nodes` / `pack_param_count` / `pack_arg_types` / `inline_return_target`. When a regular fn like `describe(args: []Any)` is lazily lowered from inside a pack-fn mono, the outer pack maps are still active; `lowerFieldAccess`'s `<pack_name>.len` intercept fires on `describe`'s same-named param and bakes the outer mono's arity as a constant into describe's IR. Every subsequent shape's call to describe returns that constant. `examples/173-pack-bare-args-cross-call.sx` exercises four shapes (0, 1, 3, 5 elements) through the same `describe(args: []Any)` walker. The expected output holds the per-position type names (`[s64]`, `[s64, string, bool]`, etc); today's diff fails — the walker reads `args.len = 0` for every shape and returns `[]`. The next commit fixes `lazyLowerFunction`.
This commit is contained in:
1
tests/expected/173-pack-bare-args-cross-call.exit
Normal file
1
tests/expected/173-pack-bare-args-cross-call.exit
Normal file
@@ -0,0 +1 @@
|
||||
0
|
||||
6
tests/expected/173-pack-bare-args-cross-call.txt
Normal file
6
tests/expected/173-pack-bare-args-cross-call.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
0: []
|
||||
1: [s64]
|
||||
3: [s64, string, bool]
|
||||
5: [s64, f64, string, bool, s64]
|
||||
--- build done ---
|
||||
rt
|
||||
Reference in New Issue
Block a user