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 |