|
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 setCachingEnabled(true); |
|
21 |
|
22 var callFFI = asmCompile('global', 'ffis', USE_ASM + "var ffi=ffis.ffi; function f() { return ffi()|0 } return f"); |
|
23 |
|
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 } |
|
30 |
|
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 } |
|
38 |
|
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"]); |
|
44 |
|
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 } |
|
52 |
|
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); |
|
62 |
|
63 var caught = false; |
|
64 try { |
|
65 callFFI(null, {ffi:Object.preventExtensions})(); |
|
66 } catch (e) { |
|
67 caught = true; |
|
68 } |
|
69 assertEq(caught, true); |
|
70 |
|
71 asmLink(callFFI, null, {ffi:eval})(); |
|
72 asmLink(callFFI, null, {ffi:Function})(); |
|
73 asmLink(callFFI, null, {ffi:Error})(); |
|
74 |
|
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']); |