| 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 | 
|---|