stack-alignment.js (4446B)
1 setJitCompilerOption("baseline.warmup.trigger", 10); 2 setJitCompilerOption("ion.warmup.trigger", 30); 3 var i; 4 5 // Check that an entry frame is always aligned properly. 6 function entryFrame_1() { 7 assertJitStackInvariants(); 8 } 9 10 // Check rectifier frames are keeping the same alignment. 11 function rectifierFrame_verify(a, b, c, d) { 12 assertJitStackInvariants(); 13 } 14 15 function rectifierFrame_1(i) { 16 rectifierFrame_verify(); 17 } 18 function rectifierFrame_2(i) { 19 rectifierFrame_verify(i); 20 } 21 function rectifierFrame_3(i) { 22 rectifierFrame_verify(i, i); 23 } 24 function rectifierFrame_4(i) { 25 rectifierFrame_verify(i, i, i); 26 } 27 28 // Check that an ion frame size is always aligned properly. 29 function gen_ionFrameSize(x, y, name) { 30 var locals = (new Array(x)).fill(0).map((v, i) => i); 31 var args = (new Array(y)).fill(0).map((v, i) => i); 32 33 return new Function("i", 34 locals.map(i => "var l% = i + %;\n".replace(/%/g, i)).join("") 35 + name + "(" + args.map(i => "l%".replace("%", i)).join(", ") + ");\n" 36 + "return " + locals.map(i => "l%".replace("%", i)).join(" + ") + ";\n" 37 ); 38 } 39 40 var ionFrameSize_0 = gen_ionFrameSize(30, 0, "assertJitStackInvariants"); 41 var ionFrameSize_1 = gen_ionFrameSize(31, 0, "assertJitStackInvariants"); 42 var ionFrameSize_2 = gen_ionFrameSize(32, 0, "assertJitStackInvariants"); 43 var ionFrameSize_3 = gen_ionFrameSize(33, 0, "assertJitStackInvariants"); 44 45 function ionFrameSize_callee_verify(a, b, c, d) { 46 assertJitStackInvariants(); 47 } 48 49 var ionFrameSize_args = []; 50 for (var l = 0; l < 4; l++) { 51 ionFrameSize_args[l] = []; 52 for (var a = 0; a < 4; a++) 53 ionFrameSize_args[l][a] = gen_ionFrameSize(30 + l, a, "ionFrameSize_callee_verify");; 54 } 55 56 // Check ion frames during function apply calls with the argument vector. 57 function ionFrame_funApply_0() { 58 assertJitStackInvariants.apply(this, arguments); 59 } 60 function ionFrame_funApply_1() { 61 ionFrame_funApply_0.apply(this, arguments); 62 } 63 64 // Check ion frames during function apply calls with an array of arguments. 65 function ionFrame_funApply_2() { 66 var arr = Array.apply(Array, arguments); 67 assertJitStackInvariants.apply(this, arr); 68 } 69 function ionFrame_funApply_3() { 70 var arr = Array.apply(Array, arguments); 71 ionFrame_funApply_2.apply(this, arr); 72 } 73 74 // Check ion frames during function .call calls. 75 function ionFrame_funCall_0() { 76 assertJitStackInvariants.call(this); 77 } 78 function ionFrame_funCall_1(a) { 79 assertJitStackInvariants.call(this, a); 80 } 81 function ionFrame_funCall_2(a, b) { 82 assertJitStackInvariants.call(this, a, b); 83 } 84 function ionFrame_funCall_3(a, b, c) { 85 assertJitStackInvariants.call(this, a, b, c); 86 } 87 88 function ionFrame_funCall_x0() { 89 ionFrame_funCall_0.call(this); 90 } 91 function ionFrame_funCall_x1(a) { 92 ionFrame_funCall_1.call(this, a); 93 } 94 function ionFrame_funCall_x2(a, b) { 95 ionFrame_funCall_2.call(this, a, b); 96 } 97 function ionFrame_funCall_x3(a, b, c) { 98 ionFrame_funCall_3.call(this, a, b, c); 99 } 100 101 // Check ion frames during spread calls. 102 function ionFrame_spreadCall_0() { 103 var arr = Array.apply(Array, arguments); 104 assertJitStackInvariants(...arr); 105 } 106 function ionFrame_spreadCall_1() { 107 var arr = Array.apply(Array, arguments); 108 ionFrame_spreadCall_0(...arr); 109 } 110 111 112 for (i = 0; i < 40; i++) { 113 entryFrame_1(); 114 entryFrame_1(0); 115 entryFrame_1(0, 1); 116 117 rectifierFrame_1(i); 118 rectifierFrame_2(i); 119 rectifierFrame_3(i); 120 rectifierFrame_4(i); 121 122 ionFrameSize_0(i); 123 ionFrameSize_1(i); 124 ionFrameSize_2(i); 125 ionFrameSize_3(i); 126 127 for (var l = 0; l < 4; l++) 128 for (var a = 0; a < 4; a++) 129 ionFrameSize_args[l][a](i); 130 131 ionFrame_funApply_0(); 132 ionFrame_funApply_0(1); 133 ionFrame_funApply_0(1, 2); 134 ionFrame_funApply_0(1, 2, 3); 135 ionFrame_funApply_1(); 136 ionFrame_funApply_1(1); 137 ionFrame_funApply_1(1, 2); 138 ionFrame_funApply_1(1, 2, 3); 139 140 ionFrame_funApply_2(); 141 ionFrame_funApply_2(1); 142 ionFrame_funApply_2(1, 2); 143 ionFrame_funApply_2(1, 2, 3); 144 ionFrame_funApply_3(); 145 ionFrame_funApply_3(1); 146 ionFrame_funApply_3(1, 2); 147 ionFrame_funApply_3(1, 2, 3); 148 149 ionFrame_funCall_0(); 150 ionFrame_funCall_1(1); 151 ionFrame_funCall_2(1, 2); 152 ionFrame_funCall_3(1, 2, 3); 153 ionFrame_funCall_x0(); 154 ionFrame_funCall_x1(1); 155 ionFrame_funCall_x2(1, 2); 156 ionFrame_funCall_x3(1, 2, 3); 157 158 ionFrame_spreadCall_0(); 159 ionFrame_spreadCall_0(1); 160 ionFrame_spreadCall_0(1, 2); 161 ionFrame_spreadCall_0(1, 2, 3); 162 ionFrame_spreadCall_1(); 163 ionFrame_spreadCall_1(1); 164 ionFrame_spreadCall_1(1, 2); 165 ionFrame_spreadCall_1(1, 2, 3); 166 }