tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

testStackWalking.js (2719B)


      1 load(libdir + "asm.js");
      2 load(libdir + "asserts.js");
      3 
      4 function matchStack(stackString, stackArray)
      5 {
      6    var match = 0;
      7    for (name of stackArray) {
      8        match = stackString.indexOf(name, match);
      9        if (match === -1)
     10            throw name + " not found in the stack " + stack;
     11    }
     12 }
     13 
     14 var stack;
     15 function dumpStack()
     16 {
     17    stack = new Error().stack
     18 }
     19 
     20 setJitCompilerOption("ion.warmup.trigger", 10);
     21 setJitCompilerOption("baseline.warmup.trigger", 0);
     22 setJitCompilerOption("offthread-compilation.enable", 0);
     23 
     24 var callFFI = asmCompile('global', 'ffis', USE_ASM + "var ffi=ffis.ffi; function f() { return ffi()|0 } return f");
     25 
     26 var f = asmLink(callFFI, null, {ffi:dumpStack});
     27 for (var i = 0; i < 15; i++) {
     28    stack = null;
     29    f();
     30    matchStack(stack, ['dumpStack', 'f']);
     31 }
     32 
     33 if (isAsmJSCompilationAvailable()) {
     34    var callFFI = asmCompile('global', 'ffis', USE_ASM + "var ffi=ffis.ffi; function f() { return ffi()|0 } return f");
     35    assertEq(isAsmJSModule(callFFI), true);
     36    stack = null;
     37    f();
     38    matchStack(stack, ['dumpStack', 'f']);
     39 }
     40 
     41 var f1 = asmLink(callFFI, null, {ffi:dumpStack});
     42 var f2 = asmLink(callFFI, null, {ffi:function middle() { f1() }});
     43 stack = null;
     44 (function outer() { f2() })();
     45 matchStack(stack, ["dumpStack", "f", "middle", "f"]);
     46 
     47 function returnStackDumper() { return { valueOf:function() { stack = new Error().stack } } }
     48 var f = asmLink(callFFI, null, {ffi:returnStackDumper});
     49 for (var i = 0; i < 15; i++) {
     50    stack = null;
     51    f();
     52    matchStack(stack, ['valueOf', 'f']);
     53 }
     54 
     55 var caught = false;
     56 try {
     57    stack = null;
     58    asmLink(asmCompile(USE_ASM + "function asmRec() { asmRec() } return asmRec"))();
     59 } catch (e) {
     60    caught = true;
     61    matchStack(e.stack, ['asmRec', 'asmRec', 'asmRec', 'asmRec']);
     62 }
     63 assertEq(caught, true);
     64 
     65 var caught = false;
     66 try {
     67    callFFI(null, {ffi:Object.defineProperty})();
     68 } catch (e) {
     69    caught = true;
     70 }
     71 assertEq(caught, true);
     72 
     73 asmLink(callFFI, null, {ffi:eval})();
     74 asmLink(callFFI, null, {ffi:Function})();
     75 asmLink(callFFI, null, {ffi:Error})();
     76 
     77 var manyCalls = asmCompile('global', 'ffis',
     78    USE_ASM +
     79    "var ffi=ffis.ffi;\
     80     function f1(a,b,c,d,e,f,g,h,i,j,k) { \
     81       a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0; \
     82       ffi(); \
     83       return (a+b+c+d+e+f+g+h+i+j+k)|0; \
     84     } \
     85     function f2() { \
     86       return f1(1,2,3,4,5,6,7,8,f1(1,2,3,4,5,6,7,8,9,10,11)|0,10,11)|0; \
     87     } \
     88     function f3() { return 13 } \
     89     function f4(i) { \
     90       i=i|0; \
     91       return TBL[i&3]()|0; \
     92     } \
     93     var TBL=[f3, f3, f2, f3]; \
     94     return f4;");
     95 stack = null;
     96 assertEq(asmLink(manyCalls, null, {ffi:dumpStack})(2), 123);
     97 matchStack(stack, ['dumpStack', 'f1', 'f2', 'f4']);