code wiki / _hdl_build / nx_js_error_gate.nx

nx_js_error_gate.nx source

↩ module page · 74 lines · 5605 B

1// nx_js_error_gate.nx -- Error/TypeError/RangeError constructors + Array/Error called WITHOUT `new`, 2// V8-pinned on BOTH tiers. Pins the bid-collision fix (BI_ARRAY_CTOR/BI_ERROR_CTOR were 101/102 = 3// BI_XHR_OPEN/BI_XHR_SEND, so plain `Array(5)` errored and `Error(m)` returned undefined -> now unique 4// 111-114), per-subtype `.name`, spec message semantics (ToString coercion; absent/undefined -> ""), 5// and XHR still intact on its 100-103 bids. Two direct-call helpers, one per tier (branch-on-static 6// helper miscompiles -- see gotchas). expect_exit: 0 license_tier: ORIGINAL 7import "nx_js_vm.nx" 8func w(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 9func nn(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 } 10static g_want: i64 11func ct(label: *u8, src: *u8) -> i64 { // TREE tier 12 let rt: *i64 = sys_mmap(16) as *i64 13 let r: i64 = js_run_source(src, bsl(src), rt) 14 w(" " as *u8); w(label); w(": rc=" as *u8); nn(r); w(" got=" as *u8); nn(rt[1]); w(" want=" as *u8); nn(g_want) 15 if r == 0 { if rt[1] == g_want { w(" ok\n" as *u8); return 1 } } 16 w(" FAIL\n" as *u8) 17 return 0 18} 19func cv(label: *u8, src: *u8) -> i64 { // VM/JIT tier 20 let rt: *i64 = sys_mmap(16) as *i64 21 let r: i64 = compile_run(src, rt) 22 w(" " as *u8); w(label); w(": rc=" as *u8); nn(r); w(" got=" as *u8); nn(rt[1]); w(" want=" as *u8); nn(g_want) 23 if r == 0 { if rt[1] == g_want { w(" ok\n" as *u8); return 1 } } 24 w(" FAIL\n" as *u8) 25 return 0 26} 27func tree_suite() -> i64 { 28 var p: i64 = 0 29 g_want=1; p=p+ct("new-typeof-obj " as *u8, "(typeof new Error(\x22boom\x22)==\x22object\x22)?1:0" as *u8) 30 g_want=1; p=p+ct("new-message " as *u8, "(new Error(\x22boom\x22).message==\x22boom\x22)?1:0" as *u8) 31 g_want=1; p=p+ct("name-error " as *u8, "(new Error(\x22z\x22).name==\x22Error\x22)?1:0" as *u8) 32 g_want=1; p=p+ct("name-typeerr " as *u8, "(new TypeError(\x22t\x22).name==\x22TypeError\x22)?1:0" as *u8) 33 g_want=1; p=p+ct("name-rangeerr " as *u8, "(new RangeError(\x22r\x22).name==\x22RangeError\x22)?1:0" as *u8) 34 g_want=1; p=p+ct("nonew-error " as *u8, "var e=Error(\x22y\x22); (typeof e==\x22object\x22&&e.message==\x22y\x22)?1:0" as *u8) 35 g_want=0; p=p+ct("noarg-msg-len0 " as *u8, "new Error().message.length" as *u8) 36 g_want=1; p=p+ct("msg-coerce-num " as *u8, "(new Error(5).message==\x225\x22)?1:0" as *u8) 37 g_want=1; p=p+ct("throw-catch-msg" as *u8, "var r=0; try{throw new Error(\x22x\x22)}catch(e){ if(e.message==\x22x\x22) r=1; } r" as *u8) 38 g_want=1; p=p+ct("throw-catch-nm " as *u8, "var r=0; try{throw new TypeError(\x22q\x22)}catch(e){ if(e.name==\x22TypeError\x22) r=1; } r" as *u8) 39 g_want=5; p=p+ct("arr-nonew-len " as *u8, "var a=Array(5); a.length" as *u8) 40 g_want=1; p=p+ct("arr-nonew-elems" as *u8, "var a=Array(9,8,7); (a.length==3&&a[2]==7)?1:0" as *u8) 41 g_want=3; p=p+ct("arr-new-len " as *u8, "new Array(3).length" as *u8) 42 g_want=1; p=p+ct("xhr-intact " as *u8, "var x=new XMLHttpRequest(); x.open(\x22GET\x22,\x22u\x22); x.readyState" as *u8) 43 return p 44} 45func vm_suite() -> i64 { 46 var p: i64 = 0 47 g_want=1; p=p+cv("new-typeof-obj " as *u8, "(typeof new Error(\x22boom\x22)==\x22object\x22)?1:0" as *u8) 48 g_want=1; p=p+cv("new-message " as *u8, "(new Error(\x22boom\x22).message==\x22boom\x22)?1:0" as *u8) 49 g_want=1; p=p+cv("name-error " as *u8, "(new Error(\x22z\x22).name==\x22Error\x22)?1:0" as *u8) 50 g_want=1; p=p+cv("name-typeerr " as *u8, "(new TypeError(\x22t\x22).name==\x22TypeError\x22)?1:0" as *u8) 51 g_want=1; p=p+cv("name-rangeerr " as *u8, "(new RangeError(\x22r\x22).name==\x22RangeError\x22)?1:0" as *u8) 52 g_want=1; p=p+cv("nonew-error " as *u8, "var e=Error(\x22y\x22); (typeof e==\x22object\x22&&e.message==\x22y\x22)?1:0" as *u8) 53 g_want=0; p=p+cv("noarg-msg-len0 " as *u8, "new Error().message.length" as *u8) 54 g_want=1; p=p+cv("msg-coerce-num " as *u8, "(new Error(5).message==\x225\x22)?1:0" as *u8) 55 g_want=1; p=p+cv("throw-catch-msg" as *u8, "var r=0; try{throw new Error(\x22x\x22)}catch(e){ if(e.message==\x22x\x22) r=1; } r" as *u8) 56 g_want=1; p=p+cv("throw-catch-nm " as *u8, "var r=0; try{throw new TypeError(\x22q\x22)}catch(e){ if(e.name==\x22TypeError\x22) r=1; } r" as *u8) 57 g_want=5; p=p+cv("arr-nonew-len " as *u8, "var a=Array(5); a.length" as *u8) 58 g_want=1; p=p+cv("arr-nonew-elems" as *u8, "var a=Array(9,8,7); (a.length==3&&a[2]==7)?1:0" as *u8) 59 g_want=3; p=p+cv("arr-new-len " as *u8, "new Array(3).length" as *u8) 60 g_want=1; p=p+cv("xhr-intact " as *u8, "var x=new XMLHttpRequest(); x.open(\x22GET\x22,\x22u\x22); x.readyState" as *u8) 61 return p 62} 63func main(argc: i64, argv: *i64) -> i64 { 64 w("=== nx_js_error_gate: Error family + no-new ctor calls + bid-collision fix (both tiers) ===\n" as *u8) 65 var pass: i64 = 0 66 w("--- tree tier (js_run_source) ---\n" as *u8) 67 pass = pass + tree_suite() 68 w("--- VM/JIT tier (compile_run) ---\n" as *u8) 69 pass = pass + vm_suite() 70 w(" --- " as *u8); nn(pass); w("/28 ---\n" as *u8) 71 if pass == 28 { w("=== GREEN: Error/TypeError/RangeError V8-shaped, Array/Error callable without new, XHR intact ===\n" as *u8); return 0 } 72 w("=== RED ===\n" as *u8) 73 return 1 74}