code wiki / _hdl_build / nx_surrogate_diag.nx
nx_surrogate_diag.nx source
↩ module page · 37 lines · 3021 B
1import "nx_gate_base.nx"
2// nx_surrogate_diag.nx -- isolate exactly which JS the engine supports for the preamble, so I fix the real gap.
3import "nx_syscalls.nx"
4import "nx_js_eval.nx"
5const K_MAGIC_4096: i64 = 4096
6
7func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw("
8" as *u8); return ok }
9func gsl(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
10func contains(hay: *u8, hl: i64, needle: *u8) -> i64 { let nl: i64=gsl(needle); if nl>hl {return 0} var i: i64=0; let last: i64=hl-nl; while i<=last { var j: i64=0; var m: i64=1; while j<nl { if (hay[i+j]&0xff)!=(needle[j]&0xff){m=0;j=nl} else {j=j+1} } if m==1 {return 1} i=i+1 } return 0 }
11func fires(src: *u8, want: *u8) -> i64 {
12 let obx: *i64 = sys_mmap(16) as *i64
13 let rc: i64 = js_run_source_keep(src, gsl(src), obx)
14 let genv: *i64 = (obx[1]) as *i64
15 if (genv as i64) == 0 { gw(" [genv NULL rc="); if rc==0 {gw("0")} else {gw("!0")} gw("] "); return 0 }
16 let ubuf: *u8 = sys_mmap(K_MAGIC_4096)
17 var k: i64 = 0; var go: i64 = 1
18 while go == 1 { if k >= 256 { go = 0 } else { let ul: i64 = js_pending_url(genv, k, ubuf, K_MAGIC_4096); if ul == 0 { go = 0 } else { if contains(ubuf, ul, want) == 1 { return 1 } k = k + 1 } } }
19 return 0
20}
21func t(name: *u8, src: *u8, want: *u8) -> i64 { if fires(src, want)==1 { gw(" OK "); gw(name); gw("\n"); return 1 } gw(" FAIL "); gw(name); gw("\n"); return 0 }
22
23func main() -> i64 {
24 gw("surrogate-diag (which JS does the engine run for the preamble?)\n" as *u8)
25 t("D1 unconditional fetch\x00" as *u8, "fetch('http://a/d1.m3u8')" as *u8, "d1.m3u8" as *u8)
26 t("D2 var gate\x00" as *u8, "var c=true;if(c){fetch('http://a/d2.m3u8')}" as *u8, "d2.m3u8" as *u8)
27 t("D3 object-prop gate\x00" as *u8, "var w={};w.c=true;if(w.c){fetch('http://a/d3.m3u8')}" as *u8, "d3.m3u8" as *u8)
28 t("D4 window=this then window.c\x00" as *u8, "var window=this;window.c=true;if(window.c){fetch('http://a/d4.m3u8')}" as *u8, "d4.m3u8" as *u8)
29 t("D5 typeof undefined guard\x00" as *u8, "if(typeof foo==='undefined'){var foo=1};fetch('http://a/d5.m3u8')" as *u8, "d5.m3u8" as *u8)
30 t("D6 nested obj literal + method\x00" as *u8, "var d={mk:function(){return{style:{}}}};d.mk();fetch('http://a/d6.m3u8')" as *u8, "d6.m3u8" as *u8)
31 t("D7 new + method callback\x00" as *u8, "var F=function(){this.ond=function(f){if(f){f()}return this}};var x=new F();x.ond(function(){fetch('http://a/d7.m3u8')})" as *u8, "d7.m3u8" as *u8)
32 t("D8 this at top level truthy\x00" as *u8, "if(this){fetch('http://a/d8.m3u8')}" as *u8, "d8.m3u8" as *u8)
33 t("D9 window=this property readback\x00" as *u8, "var window=this;window.canRunAds=true;var q=window.canRunAds;if(q){fetch('http://a/d9.m3u8')}" as *u8, "d9.m3u8" as *u8)
34 t("D10 ternary typeof to this\x00" as *u8, "var w=(typeof window!=='undefined')?window:this;w.z=true;if(w.z){fetch('http://a/d10.m3u8')}" as *u8, "d10.m3u8" as *u8)
35 sys_exit(0)
36 return 0
37}