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