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}