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}