giles
1bb40415a8
VM upvalue support: closures capture variables from enclosing scopes
Compiler (compiler.sx):
- Function scopes marked is-function=true; let scopes share parent frame
- scope-resolve only creates upvalue captures at function boundaries
- Let scope locals use parent's slot numbering (same frame)
- OP_CLOSURE emits upvalue descriptors: (is_local, index) per capture
VM (sx_vm.ml):
- upvalue_cell type: shared mutable reference to captured value
- OP_UPVALUE_GET/SET: read/write from closure's upvalue array
- OP_CLOSURE: reads upvalue descriptors, creates cells from
enclosing frame's locals (is_local=1) or upvalues (is_local=0)
- vm_closure carries live env_ref (not snapshot)
- vm_call falls back to CEK for Lambda/Component/Island values
Verified: (let ((x 10)) (let ((add-x (fn (y) (+ x y)))) (add-x 5)))
Compiles to: CONST 10, LOC_SET #0, CLOSURE [UV_GET#0 LOC_GET#0 CPRIM+ RET]
with upvalue descriptor: is_local=1 index=0
VM executes → 15 ✓
Auto-compile: 6/117 functions compile (up from 3). Disabled until
compiler handles all features — fallback can't reconstruct closure
scope for variables like nav-state bound in caller's let*.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 20:13:17 +00:00
..
2026-03-15 20:51:59 +00:00
2026-03-15 23:28:48 +00:00
2026-03-19 19:30:54 +00:00
2026-03-19 17:56:50 +00:00
2026-03-15 23:28:48 +00:00
2026-03-19 17:56:50 +00:00
2026-03-19 17:56:50 +00:00
2026-03-19 20:13:17 +00:00