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

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/js/src/jit-test/tests/asm.js/testStackWalking.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,95 @@
     1.4 +load(libdir + "asm.js");
     1.5 +load(libdir + "asserts.js");
     1.6 +
     1.7 +function matchStack(stackString, stackArray)
     1.8 +{
     1.9 +    var match = 0;
    1.10 +    for (name of stackArray) {
    1.11 +        match = stackString.indexOf(name, match);
    1.12 +        if (match === -1)
    1.13 +            throw name + " not found in the stack " + stack;
    1.14 +    }
    1.15 +}
    1.16 +
    1.17 +var stack;
    1.18 +function dumpStack()
    1.19 +{
    1.20 +    stack = new Error().stack
    1.21 +}
    1.22 +
    1.23 +setCachingEnabled(true);
    1.24 +
    1.25 +var callFFI = asmCompile('global', 'ffis', USE_ASM + "var ffi=ffis.ffi; function f() { return ffi()|0 } return f");
    1.26 +
    1.27 +var f = asmLink(callFFI, null, {ffi:dumpStack});
    1.28 +for (var i = 0; i < 5000; i++) {
    1.29 +    stack = null;
    1.30 +    f();
    1.31 +    matchStack(stack, ['dumpStack', 'f']);
    1.32 +}
    1.33 +
    1.34 +if (isAsmJSCompilationAvailable() && isCachingEnabled()) {
    1.35 +    var callFFI = asmCompile('global', 'ffis', USE_ASM + "var ffi=ffis.ffi; function f() { return ffi()|0 } return f");
    1.36 +    assertEq(isAsmJSModuleLoadedFromCache(callFFI), true);
    1.37 +    stack = null;
    1.38 +    f();
    1.39 +    matchStack(stack, ['dumpStack', 'f']);
    1.40 +}
    1.41 +
    1.42 +var f1 = asmLink(callFFI, null, {ffi:dumpStack});
    1.43 +var f2 = asmLink(callFFI, null, {ffi:function middle() { f1() }});
    1.44 +stack = null;
    1.45 +(function outer() { f2() })();
    1.46 +matchStack(stack, ["dumpStack", "f", "middle", "f"]);
    1.47 +
    1.48 +function returnStackDumper() { return { valueOf:function() { stack = new Error().stack } } }
    1.49 +var f = asmLink(callFFI, null, {ffi:returnStackDumper});
    1.50 +for (var i = 0; i < 5000; i++) {
    1.51 +    stack = null;
    1.52 +    f();
    1.53 +    matchStack(stack, ['valueOf', 'f']);
    1.54 +}
    1.55 +
    1.56 +var caught = false;
    1.57 +try {
    1.58 +    stack = null;
    1.59 +    asmLink(asmCompile(USE_ASM + "function asmRec() { asmRec() } return asmRec"))();
    1.60 +} catch (e) {
    1.61 +    caught = true;
    1.62 +    matchStack(e.stack, ['asmRec', 'asmRec', 'asmRec', 'asmRec']);
    1.63 +}
    1.64 +assertEq(caught, true);
    1.65 +
    1.66 +var caught = false;
    1.67 +try {
    1.68 +    callFFI(null, {ffi:Object.preventExtensions})();
    1.69 +} catch (e) {
    1.70 +    caught = true;
    1.71 +}
    1.72 +assertEq(caught, true);
    1.73 +
    1.74 +asmLink(callFFI, null, {ffi:eval})();
    1.75 +asmLink(callFFI, null, {ffi:Function})();
    1.76 +asmLink(callFFI, null, {ffi:Error})();
    1.77 +
    1.78 +var manyCalls = asmCompile('global', 'ffis',
    1.79 +    USE_ASM +
    1.80 +    "var ffi=ffis.ffi;\
    1.81 +     function f1(a,b,c,d,e,f,g,h,i,j,k) { \
    1.82 +       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; \
    1.83 +       ffi(); \
    1.84 +       return (a+b+c+d+e+f+g+h+i+j+k)|0; \
    1.85 +     } \
    1.86 +     function f2() { \
    1.87 +       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; \
    1.88 +     } \
    1.89 +     function f3() { return 13 } \
    1.90 +     function f4(i) { \
    1.91 +       i=i|0; \
    1.92 +       return TBL[i&3]()|0; \
    1.93 +     } \
    1.94 +     var TBL=[f3, f3, f2, f3]; \
    1.95 +     return f4;");
    1.96 +stack = null;
    1.97 +assertEq(asmLink(manyCalls, null, {ffi:dumpStack})(2), 123);
    1.98 +matchStack(stack, ['dumpStack', 'f1', 'f2', 'f4']);

mercurial