js/src/jit-test/tests/asm.js/testStackWalking.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 load(libdir + "asm.js");
     2 load(libdir + "asserts.js");
     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 }
    14 var stack;
    15 function dumpStack()
    16 {
    17     stack = new Error().stack
    18 }
    20 setCachingEnabled(true);
    22 var callFFI = asmCompile('global', 'ffis', USE_ASM + "var ffi=ffis.ffi; function f() { return ffi()|0 } return f");
    24 var f = asmLink(callFFI, null, {ffi:dumpStack});
    25 for (var i = 0; i < 5000; i++) {
    26     stack = null;
    27     f();
    28     matchStack(stack, ['dumpStack', 'f']);
    29 }
    31 if (isAsmJSCompilationAvailable() && isCachingEnabled()) {
    32     var callFFI = asmCompile('global', 'ffis', USE_ASM + "var ffi=ffis.ffi; function f() { return ffi()|0 } return f");
    33     assertEq(isAsmJSModuleLoadedFromCache(callFFI), true);
    34     stack = null;
    35     f();
    36     matchStack(stack, ['dumpStack', 'f']);
    37 }
    39 var f1 = asmLink(callFFI, null, {ffi:dumpStack});
    40 var f2 = asmLink(callFFI, null, {ffi:function middle() { f1() }});
    41 stack = null;
    42 (function outer() { f2() })();
    43 matchStack(stack, ["dumpStack", "f", "middle", "f"]);
    45 function returnStackDumper() { return { valueOf:function() { stack = new Error().stack } } }
    46 var f = asmLink(callFFI, null, {ffi:returnStackDumper});
    47 for (var i = 0; i < 5000; i++) {
    48     stack = null;
    49     f();
    50     matchStack(stack, ['valueOf', 'f']);
    51 }
    53 var caught = false;
    54 try {
    55     stack = null;
    56     asmLink(asmCompile(USE_ASM + "function asmRec() { asmRec() } return asmRec"))();
    57 } catch (e) {
    58     caught = true;
    59     matchStack(e.stack, ['asmRec', 'asmRec', 'asmRec', 'asmRec']);
    60 }
    61 assertEq(caught, true);
    63 var caught = false;
    64 try {
    65     callFFI(null, {ffi:Object.preventExtensions})();
    66 } catch (e) {
    67     caught = true;
    68 }
    69 assertEq(caught, true);
    71 asmLink(callFFI, null, {ffi:eval})();
    72 asmLink(callFFI, null, {ffi:Function})();
    73 asmLink(callFFI, null, {ffi:Error})();
    75 var manyCalls = asmCompile('global', 'ffis',
    76     USE_ASM +
    77     "var ffi=ffis.ffi;\
    78      function f1(a,b,c,d,e,f,g,h,i,j,k) { \
    79        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; \
    80        ffi(); \
    81        return (a+b+c+d+e+f+g+h+i+j+k)|0; \
    82      } \
    83      function f2() { \
    84        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; \
    85      } \
    86      function f3() { return 13 } \
    87      function f4(i) { \
    88        i=i|0; \
    89        return TBL[i&3]()|0; \
    90      } \
    91      var TBL=[f3, f3, f2, f3]; \
    92      return f4;");
    93 stack = null;
    94 assertEq(asmLink(manyCalls, null, {ffi:dumpStack})(2), 123);
    95 matchStack(stack, ['dumpStack', 'f1', 'f2', 'f4']);

mercurial