code wiki / _hdl_build / nx_js_spread_gate.nx

nx_js_spread_gate.nx source

↩ module page · 44 lines · 3378 B

1import "nx_gate_gn.nx" 2import "nx_gate_base.nx" 3// nx_js_spread_gate.nx -- proves SPREAD IN CALL ARGUMENTS works FROM JAVASCRIPT: `f(...xs)` splices an 4// array into positional args, mixes with fixed args (`f(a, ...xs, b)`), stacks multiple spreads, feeds 5// `new C(...xs)`, and reaches native builtins (`Math.max(...xs)`). ABSOLUTE expected values via the 6// tree-walker (the VM DECLINES spread-args -> tree fallback, so tree IS the oracle). license_tier: ORIGINAL expect_exit: 0 7import "nx_syscalls.nx" 8import "nx_js_eval.nx" 9 10func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw(" 11" as *u8); return ok } 12func gsl(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n } 13 14func rjs(src: *u8, etag: i64, epay: i64) -> i64 { 15 let out: *i64 = sys_mmap(16) as *i64 16 let rc: i64 = js_run_source(src, gsl(src), out) 17 if rc != 0 { return 0 } 18 if out[0] != etag { return 0 } 19 if out[1] != epay { return 0 } 20 return 1 21} 22 23func main() -> i64 { 24 gw("js-spread SOVEREIGN gate (f(...xs) call-arg spread: user fns, mixed, stacked, new, natives)\n" as *u8) 25 var pass: i64 = 0 26 var ttl: i64 = 0 27 28 ttl=ttl+1; pass=pass+grow("S1 add(...[1,2,3])=6\x00" as *u8, rjs("function add(a,b,c){return a+b+c} var xs=[1,2,3];add(...xs)" as *u8, VAL_NUM, 6)) 29 ttl=ttl+1; pass=pass+grow("S2 f(1,...[2,3])=123 (leading fixed)\x00" as *u8, rjs("function f(a,b,c){return a*100+b*10+c} f(1,...[2,3])" as *u8, VAL_NUM, 123)) 30 ttl=ttl+1; pass=pass+grow("S3 f(...[1,2],3)=123 (trailing fixed)\x00" as *u8, rjs("function f(a,b,c){return a*100+b*10+c} f(...[1,2],3)" as *u8, VAL_NUM, 123)) 31 ttl=ttl+1; pass=pass+grow("S4 f(...[1,2],...[3,4])=10 (two spreads)\x00" as *u8, rjs("function f(a,b,c,d){return a+b+c+d} f(...[1,2],...[3,4])" as *u8, VAL_NUM, 10)) 32 ttl=ttl+1; pass=pass+grow("S5 f(...[])=0 (empty spread)\x00" as *u8, rjs("function f(a,b){return (a||0)+(b||0)} f(...[])" as *u8, VAL_NUM, 0)) 33 ttl=ttl+1; pass=pass+grow("S6 spread of a variable: f(...a)=24\x00" as *u8, rjs("var a=[2,3,4];function f(x,y,z){return x*y*z} f(...a)" as *u8, VAL_NUM, 24)) 34 ttl=ttl+1; pass=pass+grow("S7 new P(...[4,5]).s=9 (spread into new)\x00" as *u8, rjs("class P{constructor(a,b){this.s=a+b}} var xs=[4,5];new P(...xs).s" as *u8, VAL_NUM, 9)) 35 ttl=ttl+1; pass=pass+grow("S8 forwarding wrapper inner(...x)=30\x00" as *u8, rjs("function inner(a,b){return a+b} function wrap(x){return inner(...x)} wrap([10,20])" as *u8, VAL_NUM, 30)) 36 ttl=ttl+1; pass=pass+grow("S9 Math.max(...[3,7,2,9,1])=9 (native)\x00" as *u8, rjs("Math.max(...[3,7,2,9,1])" as *u8, VAL_NUM, 9)) 37 ttl=ttl+1; pass=pass+grow("S10 Math.min(...[5,2,8])=2 (native)\x00" as *u8, rjs("Math.min(...[5,2,8])" as *u8, VAL_NUM, 2)) 38 ttl=ttl+1; pass=pass+grow("S11 mixed spread+fixed reaches all: f(0,...[1,2,3],4)=10\x00" as *u8, rjs("function f(a,b,c,d,e){return a+b+c+d+e} f(0,...[1,2,3],4)" as *u8, VAL_NUM, 10)) 39 ttl=ttl+1; pass=pass+grow("S12 normal call unbroken: g(10,3)=7\x00" as *u8, rjs("function g(a,b){return a-b} g(10,3)" as *u8, VAL_NUM, 7)) 40 41 gw("pass=" as *u8); gn(pass); gw("/" as *u8); gn(ttl); gw("\n" as *u8) 42 if pass == ttl { gw("verdict=GREEN (call-arg spread runs from JS: user/new/native, mixed + stacked)\n" as *u8); sys_exit(0); return 0 } 43 gw("verdict=RED\n" as *u8); sys_exit(1); return 1 44}