| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "test/cctest/compiler/function-tester.h" | 7 #include "test/cctest/compiler/function-tester.h" |
| 8 | 8 |
| 9 #if V8_TURBOFAN_TARGET | 9 #if V8_TURBOFAN_TARGET |
| 10 | 10 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 } | 35 } |
| 36 | 36 |
| 37 | 37 |
| 38 TEST(SimpleInlining) { | 38 TEST(SimpleInlining) { |
| 39 FunctionTester T( | 39 FunctionTester T( |
| 40 "(function(){" | 40 "(function(){" |
| 41 "function foo(s) { AssertStackDepth(1); return s; };" | 41 "function foo(s) { AssertStackDepth(1); return s; };" |
| 42 "function bar(s, t) { return foo(s); };" | 42 "function bar(s, t) { return foo(s); };" |
| 43 "return bar;})();", | 43 "return bar;})();", |
| 44 CompilationInfo::kInliningEnabled | | 44 CompilationInfo::kInliningEnabled | |
| 45 CompilationInfo::kContextSpecializing); | 45 CompilationInfo::kContextSpecializing | |
| 46 CompilationInfo::kTypingEnabled); |
| 46 | 47 |
| 47 InstallAssertStackDepthHelper(CcTest::isolate()); | 48 InstallAssertStackDepthHelper(CcTest::isolate()); |
| 48 T.CheckCall(T.Val(1), T.Val(1), T.Val(2)); | 49 T.CheckCall(T.Val(1), T.Val(1), T.Val(2)); |
| 49 } | 50 } |
| 50 | 51 |
| 51 | 52 |
| 52 TEST(SimpleInliningContext) { | 53 TEST(SimpleInliningContext) { |
| 53 FunctionTester T( | 54 FunctionTester T( |
| 54 "(function () {" | 55 "(function () {" |
| 55 "function foo(s) { AssertStackDepth(1); var x = 12; return s + x; };" | 56 "function foo(s) { AssertStackDepth(1); var x = 12; return s + x; };" |
| 56 "function bar(s, t) { return foo(s); };" | 57 "function bar(s, t) { return foo(s); };" |
| 57 "return bar;" | 58 "return bar;" |
| 58 "})();", | 59 "})();", |
| 59 CompilationInfo::kInliningEnabled | | 60 CompilationInfo::kInliningEnabled | |
| 60 CompilationInfo::kContextSpecializing); | 61 CompilationInfo::kContextSpecializing | |
| 62 CompilationInfo::kTypingEnabled); |
| 61 | 63 |
| 62 InstallAssertStackDepthHelper(CcTest::isolate()); | 64 InstallAssertStackDepthHelper(CcTest::isolate()); |
| 63 T.CheckCall(T.Val(13), T.Val(1), T.Val(2)); | 65 T.CheckCall(T.Val(13), T.Val(1), T.Val(2)); |
| 64 } | 66 } |
| 65 | 67 |
| 66 | 68 |
| 67 TEST(CaptureContext) { | 69 TEST(CaptureContext) { |
| 68 FunctionTester T( | 70 FunctionTester T( |
| 69 "var f = (function () {" | 71 "var f = (function () {" |
| 70 "var x = 42;" | 72 "var x = 42;" |
| 71 "function bar(s) { return x + s; };" | 73 "function bar(s) { return x + s; };" |
| 72 "return (function (s) { return bar(s); });" | 74 "return (function (s) { return bar(s); });" |
| 73 "})();" | 75 "})();" |
| 74 "(function (s) { return f(s)})", | 76 "(function (s) { return f(s)})", |
| 75 CompilationInfo::kInliningEnabled | | 77 CompilationInfo::kInliningEnabled | |
| 76 CompilationInfo::kContextSpecializing); | 78 CompilationInfo::kContextSpecializing | |
| 79 CompilationInfo::kTypingEnabled); |
| 77 | 80 |
| 78 InstallAssertStackDepthHelper(CcTest::isolate()); | 81 InstallAssertStackDepthHelper(CcTest::isolate()); |
| 79 T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined()); | 82 T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined()); |
| 80 } | 83 } |
| 81 | 84 |
| 82 | 85 |
| 83 // TODO(sigurds) For now we do not inline any native functions. If we do at | 86 // TODO(sigurds) For now we do not inline any native functions. If we do at |
| 84 // some point, change this test. | 87 // some point, change this test. |
| 85 TEST(DontInlineEval) { | 88 TEST(DontInlineEval) { |
| 86 FunctionTester T( | 89 FunctionTester T( |
| 87 "var x = 42;" | 90 "var x = 42;" |
| 88 "(function () {" | 91 "(function () {" |
| 89 "function bar(s, t) { return eval(\"AssertStackDepth(2); x\") };" | 92 "function bar(s, t) { return eval(\"AssertStackDepth(2); x\") };" |
| 90 "return bar;" | 93 "return bar;" |
| 91 "})();", | 94 "})();", |
| 92 CompilationInfo::kInliningEnabled | | 95 CompilationInfo::kInliningEnabled | |
| 93 CompilationInfo::kContextSpecializing); | 96 CompilationInfo::kContextSpecializing | |
| 97 CompilationInfo::kTypingEnabled); |
| 94 | 98 |
| 95 InstallAssertStackDepthHelper(CcTest::isolate()); | 99 InstallAssertStackDepthHelper(CcTest::isolate()); |
| 96 T.CheckCall(T.Val(42), T.Val("x"), T.undefined()); | 100 T.CheckCall(T.Val(42), T.Val("x"), T.undefined()); |
| 97 } | 101 } |
| 98 | 102 |
| 99 | 103 |
| 100 TEST(InlineOmitArguments) { | 104 TEST(InlineOmitArguments) { |
| 101 FunctionTester T( | 105 FunctionTester T( |
| 102 "(function () {" | 106 "(function () {" |
| 103 "var x = 42;" | 107 "var x = 42;" |
| 104 "function bar(s, t, u, v) { AssertStackDepth(1); return x + s; };" | 108 "function bar(s, t, u, v) { AssertStackDepth(1); return x + s; };" |
| 105 "return (function (s,t) { return bar(s); });" | 109 "return (function (s,t) { return bar(s); });" |
| 106 "})();", | 110 "})();", |
| 107 CompilationInfo::kInliningEnabled | | 111 CompilationInfo::kInliningEnabled | |
| 108 CompilationInfo::kContextSpecializing); | 112 CompilationInfo::kContextSpecializing | |
| 113 CompilationInfo::kTypingEnabled); |
| 109 | 114 |
| 110 InstallAssertStackDepthHelper(CcTest::isolate()); | 115 InstallAssertStackDepthHelper(CcTest::isolate()); |
| 111 T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined()); | 116 T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined()); |
| 112 } | 117 } |
| 113 | 118 |
| 114 | 119 |
| 115 TEST(InlineSurplusArguments) { | 120 TEST(InlineSurplusArguments) { |
| 116 FunctionTester T( | 121 FunctionTester T( |
| 117 "(function () {" | 122 "(function () {" |
| 118 "var x = 42;" | 123 "var x = 42;" |
| 119 "function foo(s) { AssertStackDepth(1); return x + s; };" | 124 "function foo(s) { AssertStackDepth(1); return x + s; };" |
| 120 "function bar(s,t) { return foo(s,t,13); };" | 125 "function bar(s,t) { return foo(s,t,13); };" |
| 121 "return bar;" | 126 "return bar;" |
| 122 "})();", | 127 "})();", |
| 123 CompilationInfo::kInliningEnabled | | 128 CompilationInfo::kInliningEnabled | |
| 124 CompilationInfo::kContextSpecializing); | 129 CompilationInfo::kContextSpecializing | |
| 130 CompilationInfo::kTypingEnabled); |
| 125 | 131 |
| 126 InstallAssertStackDepthHelper(CcTest::isolate()); | 132 InstallAssertStackDepthHelper(CcTest::isolate()); |
| 127 T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined()); | 133 T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined()); |
| 128 } | 134 } |
| 129 | 135 |
| 130 | 136 |
| 131 TEST(InlineTwice) { | 137 TEST(InlineTwice) { |
| 132 FunctionTester T( | 138 FunctionTester T( |
| 133 "(function () {" | 139 "(function () {" |
| 134 "var x = 42;" | 140 "var x = 42;" |
| 135 "function bar(s) { AssertStackDepth(1); return x + s; };" | 141 "function bar(s) { AssertStackDepth(1); return x + s; };" |
| 136 "return (function (s,t) { return bar(s) + bar(t); });" | 142 "return (function (s,t) { return bar(s) + bar(t); });" |
| 137 "})();", | 143 "})();", |
| 138 CompilationInfo::kInliningEnabled | | 144 CompilationInfo::kInliningEnabled | |
| 139 CompilationInfo::kContextSpecializing); | 145 CompilationInfo::kContextSpecializing | |
| 146 CompilationInfo::kTypingEnabled); |
| 140 | 147 |
| 141 InstallAssertStackDepthHelper(CcTest::isolate()); | 148 InstallAssertStackDepthHelper(CcTest::isolate()); |
| 142 T.CheckCall(T.Val(2 * 42 + 12 + 4), T.Val(12), T.Val(4)); | 149 T.CheckCall(T.Val(2 * 42 + 12 + 4), T.Val(12), T.Val(4)); |
| 143 } | 150 } |
| 144 | 151 |
| 145 | 152 |
| 146 TEST(InlineTwiceDependent) { | 153 TEST(InlineTwiceDependent) { |
| 147 FunctionTester T( | 154 FunctionTester T( |
| 148 "(function () {" | 155 "(function () {" |
| 149 "var x = 42;" | 156 "var x = 42;" |
| 150 "function foo(s) { AssertStackDepth(1); return x + s; };" | 157 "function foo(s) { AssertStackDepth(1); return x + s; };" |
| 151 "function bar(s,t) { return foo(foo(s)); };" | 158 "function bar(s,t) { return foo(foo(s)); };" |
| 152 "return bar;" | 159 "return bar;" |
| 153 "})();", | 160 "})();", |
| 154 CompilationInfo::kInliningEnabled | | 161 CompilationInfo::kInliningEnabled | |
| 155 CompilationInfo::kContextSpecializing); | 162 CompilationInfo::kContextSpecializing | |
| 163 CompilationInfo::kTypingEnabled); |
| 156 | 164 |
| 157 InstallAssertStackDepthHelper(CcTest::isolate()); | 165 InstallAssertStackDepthHelper(CcTest::isolate()); |
| 158 T.CheckCall(T.Val(42 + 42 + 12), T.Val(12), T.Val(4)); | 166 T.CheckCall(T.Val(42 + 42 + 12), T.Val(12), T.Val(4)); |
| 159 } | 167 } |
| 160 | 168 |
| 161 | 169 |
| 162 TEST(InlineTwiceDependentDiamond) { | 170 TEST(InlineTwiceDependentDiamond) { |
| 163 FunctionTester T( | 171 FunctionTester T( |
| 164 "(function () {" | 172 "(function () {" |
| 165 "var x = 41;" | 173 "var x = 41;" |
| 166 "function foo(s) { AssertStackDepth(1); if (s % 2 == 0) {" | 174 "function foo(s) { AssertStackDepth(1); if (s % 2 == 0) {" |
| 167 " return x - s } else { return x + s; } };" | 175 " return x - s } else { return x + s; } };" |
| 168 "function bar(s,t) { return foo(foo(s)); };" | 176 "function bar(s,t) { return foo(foo(s)); };" |
| 169 "return bar;" | 177 "return bar;" |
| 170 "})();", | 178 "})();", |
| 171 CompilationInfo::kInliningEnabled | | 179 CompilationInfo::kInliningEnabled | |
| 172 CompilationInfo::kContextSpecializing); | 180 CompilationInfo::kContextSpecializing | |
| 181 CompilationInfo::kTypingEnabled); |
| 173 | 182 |
| 174 InstallAssertStackDepthHelper(CcTest::isolate()); | 183 InstallAssertStackDepthHelper(CcTest::isolate()); |
| 175 T.CheckCall(T.Val(-11), T.Val(11), T.Val(4)); | 184 T.CheckCall(T.Val(-11), T.Val(11), T.Val(4)); |
| 176 } | 185 } |
| 177 | 186 |
| 178 | 187 |
| 179 TEST(InlineTwiceDependentDiamondDifferent) { | 188 TEST(InlineTwiceDependentDiamondDifferent) { |
| 180 FunctionTester T( | 189 FunctionTester T( |
| 181 "(function () {" | 190 "(function () {" |
| 182 "var x = 41;" | 191 "var x = 41;" |
| 183 "function foo(s,t) { AssertStackDepth(1); if (s % 2 == 0) {" | 192 "function foo(s,t) { AssertStackDepth(1); if (s % 2 == 0) {" |
| 184 " return x - s * t } else { return x + s * t; } };" | 193 " return x - s * t } else { return x + s * t; } };" |
| 185 "function bar(s,t) { return foo(foo(s, 3), 5); };" | 194 "function bar(s,t) { return foo(foo(s, 3), 5); };" |
| 186 "return bar;" | 195 "return bar;" |
| 187 "})();", | 196 "})();", |
| 188 CompilationInfo::kInliningEnabled | | 197 CompilationInfo::kInliningEnabled | |
| 189 CompilationInfo::kContextSpecializing); | 198 CompilationInfo::kContextSpecializing | |
| 199 CompilationInfo::kTypingEnabled); |
| 190 | 200 |
| 191 InstallAssertStackDepthHelper(CcTest::isolate()); | 201 InstallAssertStackDepthHelper(CcTest::isolate()); |
| 192 T.CheckCall(T.Val(-329), T.Val(11), T.Val(4)); | 202 T.CheckCall(T.Val(-329), T.Val(11), T.Val(4)); |
| 193 } | 203 } |
| 194 | 204 |
| 195 | 205 |
| 196 TEST(InlineLoop) { | 206 TEST(InlineLoop) { |
| 197 FunctionTester T( | 207 FunctionTester T( |
| 198 "(function () {" | 208 "(function () {" |
| 199 "var x = 41;" | 209 "var x = 41;" |
| 200 "function foo(s) { AssertStackDepth(1); while (s > 0) {" | 210 "function foo(s) { AssertStackDepth(1); while (s > 0) {" |
| 201 " s = s - 1; }; return s; };" | 211 " s = s - 1; }; return s; };" |
| 202 "function bar(s,t) { return foo(foo(s)); };" | 212 "function bar(s,t) { return foo(foo(s)); };" |
| 203 "return bar;" | 213 "return bar;" |
| 204 "})();", | 214 "})();", |
| 205 CompilationInfo::kInliningEnabled | | 215 CompilationInfo::kInliningEnabled | |
| 206 CompilationInfo::kContextSpecializing); | 216 CompilationInfo::kContextSpecializing | |
| 217 CompilationInfo::kTypingEnabled); |
| 207 | 218 |
| 208 InstallAssertStackDepthHelper(CcTest::isolate()); | 219 InstallAssertStackDepthHelper(CcTest::isolate()); |
| 209 T.CheckCall(T.Val(0.0), T.Val(11), T.Val(4)); | 220 T.CheckCall(T.Val(0.0), T.Val(11), T.Val(4)); |
| 210 } | 221 } |
| 211 | 222 |
| 212 | 223 |
| 213 TEST(InlineStrictIntoNonStrict) { | 224 TEST(InlineStrictIntoNonStrict) { |
| 214 FunctionTester T( | 225 FunctionTester T( |
| 215 "(function () {" | 226 "(function () {" |
| 216 "var x = Object.create({}, { y: { value:42, writable:false } });" | 227 "var x = Object.create({}, { y: { value:42, writable:false } });" |
| 217 "function foo(s) { 'use strict';" | 228 "function foo(s) { 'use strict';" |
| 218 " x.y = 9; };" | 229 " x.y = 9; };" |
| 219 "function bar(s,t) { return foo(s); };" | 230 "function bar(s,t) { return foo(s); };" |
| 220 "return bar;" | 231 "return bar;" |
| 221 "})();", | 232 "})();", |
| 222 CompilationInfo::kInliningEnabled | | 233 CompilationInfo::kInliningEnabled | |
| 223 CompilationInfo::kContextSpecializing); | 234 CompilationInfo::kContextSpecializing | |
| 235 CompilationInfo::kTypingEnabled); |
| 224 | 236 |
| 225 InstallAssertStackDepthHelper(CcTest::isolate()); | 237 InstallAssertStackDepthHelper(CcTest::isolate()); |
| 226 T.CheckThrows(T.undefined(), T.undefined()); | 238 T.CheckThrows(T.undefined(), T.undefined()); |
| 227 } | 239 } |
| 228 | 240 |
| 229 | 241 |
| 230 TEST(InlineNonStrictIntoStrict) { | 242 TEST(InlineNonStrictIntoStrict) { |
| 231 FunctionTester T( | 243 FunctionTester T( |
| 232 "(function () {" | 244 "(function () {" |
| 233 "var x = Object.create({}, { y: { value:42, writable:false } });" | 245 "var x = Object.create({}, { y: { value:42, writable:false } });" |
| 234 "function foo(s) { x.y = 9; return x.y; };" | 246 "function foo(s) { x.y = 9; return x.y; };" |
| 235 "function bar(s,t) { \'use strict\'; return foo(s); };" | 247 "function bar(s,t) { \'use strict\'; return foo(s); };" |
| 236 "return bar;" | 248 "return bar;" |
| 237 "})();", | 249 "})();", |
| 238 CompilationInfo::kInliningEnabled | | 250 CompilationInfo::kInliningEnabled | |
| 239 CompilationInfo::kContextSpecializing); | 251 CompilationInfo::kContextSpecializing | |
| 252 CompilationInfo::kTypingEnabled); |
| 240 | 253 |
| 241 InstallAssertStackDepthHelper(CcTest::isolate()); | 254 InstallAssertStackDepthHelper(CcTest::isolate()); |
| 242 T.CheckCall(T.Val(42), T.undefined(), T.undefined()); | 255 T.CheckCall(T.Val(42), T.undefined(), T.undefined()); |
| 243 } | 256 } |
| 244 | 257 |
| 245 | 258 |
| 246 #endif // V8_TURBOFAN_TARGET | 259 #endif // V8_TURBOFAN_TARGET |
| OLD | NEW |