code wiki / _hdl_build / nx_js_arena_gate.nx
nx_js_arena_gate.nx source
↩ module page · 49 lines · 3083 B
1// nx_js_arena_gate.nx -- escape-aware ARENA RECLAMATION. Proves (A) call-heavy code that USED to exhaust
2// the 32MB env arena (~fib27) now COMPLETES (fib(32)=4.3M calls, fib(34)=5.7M -- was rc=1); (B) the escape
3// guard is CORRECT: closures that OUTLIVE their creating call keep their captured env (NOT wrongly reclaimed),
4// verified vs the tree-walker oracle. Conservative-correct stack-discipline reclaim, not a tracing GC.
5// (Inline/cell-reuse style: each compile_run mmaps a fresh 32MB arena not munmap'd, so we keep runs few.)
6// expect_exit: 0 license_tier: ORIGINAL
7import "nx_js_vm.nx"
8func aw(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
9func an(v: i64) -> i64 { if v==0 { sys_write(1,"0" as *u8,1); return 0 } var m: i64=v; if m<0 { sys_write(1,"-" as *u8,1); m=0-m } let t: *u8=sys_mmap(24); var k: i64=0; while m>0 { t[k]=(48+(m%10)) as u8; m=m/10; k=k+1 } let o: *u8=sys_mmap(24); var q: i64=k-1; var x: i64=0; while q>=0 { o[x]=t[q]; x=x+1; q=q-1 } sys_write(1,o,x); return 0 }
10
11func main(argc: i64, argv: *i64) -> i64 {
12 aw("=== nx_js_arena_gate: escape-aware arena reclamation ===\n" as *u8)
13 let o: *i64 = sys_mmap(16) as *i64
14 let ot: *i64 = sys_mmap(16) as *i64
15 var pass: i64 = 0
16 var tot: i64 = 0
17
18 // A) call-heavy NON-escaping recursion that used to exhaust the arena (~fib27). Reclaim -> completes.
19 tot = tot + 1
20 compile_run("function fib(n){return n<2?n:fib(n-1)+fib(n-2);}fib(32)" as *u8, o)
21 aw(" A1 fib(32) [4.3M calls, was arena-OOM]: "); an(o[1])
22 if o[0] == VAL_NUM { if o[1] == 2178309 { pass = pass + 1; aw(" ok\n" as *u8) } else { aw(" FAIL\n" as *u8) } } else { aw(" FAIL(rc)\n" as *u8) }
23
24 tot = tot + 1
25 compile_run("function fib(n){return n<2?n:fib(n-1)+fib(n-2);}fib(34)" as *u8, o)
26 aw(" A2 fib(34) [5.7M calls]: "); an(o[1])
27 if o[0] == VAL_NUM { if o[1] == 5702887 { pass = pass + 1; aw(" ok\n" as *u8) } else { aw(" FAIL\n" as *u8) } } else { aw(" FAIL(rc)\n" as *u8) }
28
29 // B) ESCAPE SAFETY: a returned closure keeps its captured env (VM must match the tree-walker oracle).
30 tot = tot + 1
31 let b1: *u8 = "function mk(x){return function(y){return x+y;};}var a=mk(5);a(10)" as *u8
32 compile_run(b1, o)
33 js_run_source(b1, bsl(b1), ot)
34 aw(" B1 escaped closure: VM="); an(o[1]); aw(" tree="); an(ot[1])
35 if o[1] == 15 { if ot[1] == 15 { pass = pass + 1; aw(" ok\n" as *u8) } else { aw(" FAIL\n" as *u8) } } else { aw(" FAIL\n" as *u8) }
36
37 tot = tot + 1
38 compile_run("function mk(x){return function(){return x;};}var a=mk(5);var b=mk(100);a()+b()+a()" as *u8, o)
39 aw(" B2 two closures distinct envs: "); an(o[1])
40 if o[1] == 110 { pass = pass + 1; aw(" ok\n" as *u8) } else { aw(" FAIL (expect 110)\n" as *u8) }
41
42 aw(" --- "); an(pass); aw("/"); an(tot); aw(" ---\n" as *u8)
43 if pass == tot {
44 aw("=== GREEN: arena reclaimed on non-escaping returns (fib32/34 run); escaped closures preserved ===\n" as *u8)
45 return 0
46 }
47 aw("=== RED ===\n" as *u8)
48 return 1
49}