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']);