blob: 234060c7f7c1b899894f3a7659adea4387a6346e [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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
3// found in the LICENSE file.
4
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00005#include "src/frames-inl.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +00006#include "test/cctest/compiler/function-tester.h"
7
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00008namespace v8 {
9namespace internal {
10namespace compiler {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000011
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000012namespace {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000013
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000014// Helper to determine inline count via JavaScriptFrame::GetFunctions.
Ben Murdochb8a8cc12014-11-26 15:28:44 +000015// Note that a count of 1 indicates that no inlining has occured.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000016void AssertInlineCount(const v8::FunctionCallbackInfo<v8::Value>& args) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000017 StackTraceFrameIterator it(CcTest::i_isolate());
18 int frames_seen = 0;
19 JavaScriptFrame* topmost = it.frame();
20 while (!it.done()) {
21 JavaScriptFrame* frame = it.frame();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000022 List<JSFunction*> functions(2);
23 frame->GetFunctions(&functions);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000024 PrintF("%d %s, inline count: %d\n", frames_seen,
25 frame->function()->shared()->DebugName()->ToCString().get(),
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000026 functions.length());
Ben Murdochb8a8cc12014-11-26 15:28:44 +000027 frames_seen++;
28 it.Advance();
29 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000030 List<JSFunction*> functions(2);
31 topmost->GetFunctions(&functions);
32 CHECK_EQ(args[0]
33 ->ToInt32(args.GetIsolate()->GetCurrentContext())
34 .ToLocalChecked()
35 ->Value(),
36 functions.length());
Ben Murdochb8a8cc12014-11-26 15:28:44 +000037}
38
39
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000040void InstallAssertInlineCountHelper(v8::Isolate* isolate) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000041 v8::Local<v8::Context> context = isolate->GetCurrentContext();
42 v8::Local<v8::FunctionTemplate> t =
43 v8::FunctionTemplate::New(isolate, AssertInlineCount);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000044 CHECK(context->Global()
45 ->Set(context, v8_str("AssertInlineCount"),
46 t->GetFunction(context).ToLocalChecked())
47 .FromJust());
Ben Murdochb8a8cc12014-11-26 15:28:44 +000048}
49
50
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000051const uint32_t kRestrictedInliningFlags =
52 CompilationInfo::kFunctionContextSpecializing |
53 CompilationInfo::kTypingEnabled;
54
55const uint32_t kInlineFlags = CompilationInfo::kInliningEnabled |
56 CompilationInfo::kFunctionContextSpecializing |
57 CompilationInfo::kTypingEnabled;
58
59} // namespace
Emily Bernierd0a1eb72015-03-24 16:35:39 -040060
61
Ben Murdochb8a8cc12014-11-26 15:28:44 +000062TEST(SimpleInlining) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000063 FunctionTester T(
64 "(function(){"
Emily Bernierd0a1eb72015-03-24 16:35:39 -040065 " function foo(s) { AssertInlineCount(2); return s; };"
66 " function bar(s, t) { return foo(s); };"
67 " return bar;"
68 "})();",
69 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000070
71 InstallAssertInlineCountHelper(CcTest::isolate());
72 T.CheckCall(T.Val(1), T.Val(1), T.Val(2));
73}
74
75
76TEST(SimpleInliningDeopt) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000077 FunctionTester T(
78 "(function(){"
Emily Bernierd0a1eb72015-03-24 16:35:39 -040079 " function foo(s) { %DeoptimizeFunction(bar); return s; };"
80 " function bar(s, t) { return foo(s); };"
81 " return bar;"
82 "})();",
83 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000084
85 InstallAssertInlineCountHelper(CcTest::isolate());
86 T.CheckCall(T.Val(1), T.Val(1), T.Val(2));
87}
88
89
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000090TEST(SimpleInliningDeoptSelf) {
91 FunctionTester T(
92 "(function(){"
93 " function foo(s) { %_DeoptimizeNow(); return s; };"
94 " function bar(s, t) { return foo(s); };"
95 " return bar;"
96 "})();",
97 kInlineFlags);
98
99 InstallAssertInlineCountHelper(CcTest::isolate());
100 T.CheckCall(T.Val(1), T.Val(1), T.Val(2));
101}
102
103
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000104TEST(SimpleInliningContext) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000105 FunctionTester T(
106 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400107 " function foo(s) { AssertInlineCount(2); var x = 12; return s + x; };"
108 " function bar(s, t) { return foo(s); };"
109 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000110 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400111 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000112
113 InstallAssertInlineCountHelper(CcTest::isolate());
114 T.CheckCall(T.Val(13), T.Val(1), T.Val(2));
115}
116
117
118TEST(SimpleInliningContextDeopt) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000119 FunctionTester T(
120 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400121 " function foo(s) {"
122 " AssertInlineCount(2); %DeoptimizeFunction(bar); var x = 12;"
123 " return s + x;"
124 " };"
125 " function bar(s, t) { return foo(s); };"
126 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000127 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400128 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000129
130 InstallAssertInlineCountHelper(CcTest::isolate());
131 T.CheckCall(T.Val(13), T.Val(1), T.Val(2));
132}
133
134
135TEST(CaptureContext) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000136 FunctionTester T(
137 "var f = (function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400138 " var x = 42;"
139 " function bar(s) { return x + s; };"
140 " return (function (s) { return bar(s); });"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000141 "})();"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400142 "(function (s) { return f(s) })",
143 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000144
145 InstallAssertInlineCountHelper(CcTest::isolate());
146 T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined());
147}
148
149
150// TODO(sigurds) For now we do not inline any native functions. If we do at
151// some point, change this test.
152TEST(DontInlineEval) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000153 FunctionTester T(
154 "var x = 42;"
155 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400156 " function bar(s, t) { return eval(\"AssertInlineCount(1); x\") };"
157 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000158 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400159 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000160
161 InstallAssertInlineCountHelper(CcTest::isolate());
162 T.CheckCall(T.Val(42), T.Val("x"), T.undefined());
163}
164
165
166TEST(InlineOmitArguments) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000167 FunctionTester T(
168 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400169 " var x = 42;"
170 " function bar(s, t, u, v) { AssertInlineCount(2); return x + s; };"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000171 " function foo(s, t) { return bar(s); };"
172 " return foo;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000173 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400174 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000175
176 InstallAssertInlineCountHelper(CcTest::isolate());
177 T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined());
178}
179
180
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000181TEST(InlineOmitArgumentsObject) {
182 FunctionTester T(
183 "(function () {"
184 " function bar(s, t, u, v) { AssertInlineCount(2); return arguments; };"
185 " function foo(s, t) { var args = bar(s);"
186 " return args.length == 1 &&"
187 " args[0] == 11; };"
188 " return foo;"
189 "})();",
190 kInlineFlags);
191
192 InstallAssertInlineCountHelper(CcTest::isolate());
193 T.CheckCall(T.true_value(), T.Val(11), T.undefined());
194}
195
196
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000197TEST(InlineOmitArgumentsDeopt) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000198 FunctionTester T(
199 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400200 " function foo(s,t,u,v) { AssertInlineCount(2);"
201 " %DeoptimizeFunction(bar); return baz(); };"
202 " function bar() { return foo(11); };"
203 " function baz() { return foo.arguments.length == 1 &&"
204 " foo.arguments[0] == 11; }"
205 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000206 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400207 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000208
209 InstallAssertInlineCountHelper(CcTest::isolate());
210 T.CheckCall(T.true_value(), T.Val(12), T.Val(14));
211}
212
213
214TEST(InlineSurplusArguments) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000215 FunctionTester T(
216 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400217 " var x = 42;"
218 " function foo(s) { AssertInlineCount(2); return x + s; };"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000219 " function bar(s, t) { return foo(s, t, 13); };"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400220 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000221 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400222 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000223
224 InstallAssertInlineCountHelper(CcTest::isolate());
225 T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined());
226}
227
228
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000229TEST(InlineSurplusArgumentsObject) {
230 FunctionTester T(
231 "(function () {"
232 " function foo(s) { AssertInlineCount(2); return arguments; };"
233 " function bar(s, t) { var args = foo(s, t, 13);"
234 " return args.length == 3 &&"
235 " args[0] == 11 &&"
236 " args[1] == 12 &&"
237 " args[2] == 13; };"
238 " return bar;"
239 "})();",
240 kInlineFlags);
241
242 InstallAssertInlineCountHelper(CcTest::isolate());
243 T.CheckCall(T.true_value(), T.Val(11), T.Val(12));
244}
245
246
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000247TEST(InlineSurplusArgumentsDeopt) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000248 FunctionTester T(
249 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400250 " function foo(s) { AssertInlineCount(2); %DeoptimizeFunction(bar);"
251 " return baz(); };"
252 " function bar() { return foo(13, 14, 15); };"
253 " function baz() { return foo.arguments.length == 3 &&"
254 " foo.arguments[0] == 13 &&"
255 " foo.arguments[1] == 14 &&"
256 " foo.arguments[2] == 15; }"
257 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000258 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400259 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000260
261 InstallAssertInlineCountHelper(CcTest::isolate());
262 T.CheckCall(T.true_value(), T.Val(12), T.Val(14));
263}
264
265
266TEST(InlineTwice) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000267 FunctionTester T(
268 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400269 " var x = 42;"
270 " function bar(s) { AssertInlineCount(2); return x + s; };"
Ben Murdochda12d292016-06-02 14:46:10 +0100271 " function foo(s, t) { return bar(s) + bar(t); };"
272 " return foo;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000273 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400274 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000275
276 InstallAssertInlineCountHelper(CcTest::isolate());
277 T.CheckCall(T.Val(2 * 42 + 12 + 4), T.Val(12), T.Val(4));
278}
279
280
281TEST(InlineTwiceDependent) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000282 FunctionTester T(
283 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400284 " var x = 42;"
285 " function foo(s) { AssertInlineCount(2); return x + s; };"
286 " function bar(s,t) { return foo(foo(s)); };"
287 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000288 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400289 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000290
291 InstallAssertInlineCountHelper(CcTest::isolate());
292 T.CheckCall(T.Val(42 + 42 + 12), T.Val(12), T.Val(4));
293}
294
295
296TEST(InlineTwiceDependentDiamond) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000297 FunctionTester T(
298 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400299 " var x = 41;"
300 " function foo(s) { AssertInlineCount(2); if (s % 2 == 0) {"
301 " return x - s } else { return x + s; } };"
302 " function bar(s,t) { return foo(foo(s)); };"
303 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000304 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400305 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000306
307 InstallAssertInlineCountHelper(CcTest::isolate());
308 T.CheckCall(T.Val(-11), T.Val(11), T.Val(4));
309}
310
311
312TEST(InlineTwiceDependentDiamondDifferent) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000313 FunctionTester T(
314 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400315 " var x = 41;"
316 " function foo(s,t) { AssertInlineCount(2); if (s % 2 == 0) {"
317 " return x - s * t } else { return x + s * t; } };"
318 " function bar(s,t) { return foo(foo(s, 3), 5); };"
319 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000320 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400321 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000322
323 InstallAssertInlineCountHelper(CcTest::isolate());
324 T.CheckCall(T.Val(-329), T.Val(11), T.Val(4));
325}
326
327
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400328TEST(InlineLoopGuardedEmpty) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000329 FunctionTester T(
330 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400331 " function foo(s) { AssertInlineCount(2); if (s) while (s); return s; };"
332 " function bar(s,t) { return foo(s); };"
333 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000334 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400335 kInlineFlags);
336
337 InstallAssertInlineCountHelper(CcTest::isolate());
338 T.CheckCall(T.Val(0.0), T.Val(0.0), T.Val(4));
339}
340
341
342TEST(InlineLoopGuardedOnce) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400343 FunctionTester T(
344 "(function () {"
345 " function foo(s,t) { AssertInlineCount(2); if (t > 0) while (s > 0) {"
346 " s = s - 1; }; return s; };"
347 " function bar(s,t) { return foo(s,t); };"
348 " return bar;"
349 "})();",
350 kInlineFlags);
351
352 InstallAssertInlineCountHelper(CcTest::isolate());
353 T.CheckCall(T.Val(0.0), T.Val(11), T.Val(4));
354}
355
356
357TEST(InlineLoopGuardedTwice) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400358 FunctionTester T(
359 "(function () {"
360 " function foo(s,t) { AssertInlineCount(2); if (t > 0) while (s > 0) {"
361 " s = s - 1; }; return s; };"
362 " function bar(s,t) { return foo(foo(s,t),t); };"
363 " return bar;"
364 "})();",
365 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000366
367 InstallAssertInlineCountHelper(CcTest::isolate());
368 T.CheckCall(T.Val(0.0), T.Val(11), T.Val(4));
369}
370
371
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000372TEST(InlineLoopUnguardedEmpty) {
373 FunctionTester T(
374 "(function () {"
375 " function foo(s) { AssertInlineCount(2); while (s); return s; };"
376 " function bar(s, t) { return foo(s); };"
377 " return bar;"
378 "})();",
379 kInlineFlags);
380
381 InstallAssertInlineCountHelper(CcTest::isolate());
382 T.CheckCall(T.Val(0.0), T.Val(0.0), T.Val(4));
383}
384
385
386TEST(InlineLoopUnguardedOnce) {
387 FunctionTester T(
388 "(function () {"
389 " function foo(s) { AssertInlineCount(2); while (s) {"
390 " s = s - 1; }; return s; };"
391 " function bar(s, t) { return foo(s); };"
392 " return bar;"
393 "})();",
394 kInlineFlags);
395
396 InstallAssertInlineCountHelper(CcTest::isolate());
397 T.CheckCall(T.Val(0.0), T.Val(0.0), T.Val(4));
398}
399
400
401TEST(InlineLoopUnguardedTwice) {
402 FunctionTester T(
403 "(function () {"
404 " function foo(s) { AssertInlineCount(2); while (s > 0) {"
405 " s = s - 1; }; return s; };"
406 " function bar(s,t) { return foo(foo(s,t),t); };"
407 " return bar;"
408 "})();",
409 kInlineFlags);
410
411 InstallAssertInlineCountHelper(CcTest::isolate());
412 T.CheckCall(T.Val(0.0), T.Val(0.0), T.Val(4));
413}
414
415
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000416TEST(InlineStrictIntoNonStrict) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000417 FunctionTester T(
418 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400419 " var x = Object.create({}, { y: { value:42, writable:false } });"
420 " function foo(s) { 'use strict';"
421 " x.y = 9; };"
422 " function bar(s,t) { return foo(s); };"
423 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000424 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400425 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000426
427 InstallAssertInlineCountHelper(CcTest::isolate());
428 T.CheckThrows(T.undefined(), T.undefined());
429}
430
431
432TEST(InlineNonStrictIntoStrict) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000433 FunctionTester T(
434 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400435 " var x = Object.create({}, { y: { value:42, writable:false } });"
436 " function foo(s) { x.y = 9; return x.y; };"
437 " function bar(s,t) { \'use strict\'; return foo(s); };"
438 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000439 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400440 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000441
442 InstallAssertInlineCountHelper(CcTest::isolate());
443 T.CheckCall(T.Val(42), T.undefined(), T.undefined());
444}
445
446
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400447TEST(InlineIntrinsicIsSmi) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400448 FunctionTester T(
449 "(function () {"
450 " var x = 42;"
451 " function bar(s,t) { return %_IsSmi(x); };"
452 " return bar;"
453 "})();",
454 kInlineFlags);
455
456 InstallAssertInlineCountHelper(CcTest::isolate());
457 T.CheckCall(T.true_value(), T.Val(12), T.Val(4));
458}
459
460
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400461TEST(InlineIntrinsicIsArray) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400462 FunctionTester T(
463 "(function () {"
464 " var x = [1,2,3];"
465 " function bar(s,t) { return %_IsArray(x); };"
466 " return bar;"
467 "})();",
468 kInlineFlags);
469
470 InstallAssertInlineCountHelper(CcTest::isolate());
471 T.CheckCall(T.true_value(), T.Val(12), T.Val(4));
472
473 FunctionTester T2(
474 "(function () {"
475 " var x = 32;"
476 " function bar(s,t) { return %_IsArray(x); };"
477 " return bar;"
478 "})();",
479 kInlineFlags);
480
481 T2.CheckCall(T.false_value(), T.Val(12), T.Val(4));
482
483 FunctionTester T3(
484 "(function () {"
485 " var x = bar;"
486 " function bar(s,t) { return %_IsArray(x); };"
487 " return bar;"
488 "})();",
489 kInlineFlags);
490
491 T3.CheckCall(T.false_value(), T.Val(12), T.Val(4));
492}
493
494
495TEST(InlineWithArguments) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400496 FunctionTester T(
497 "(function () {"
498 " function foo(s,t,u) { AssertInlineCount(2);"
499 " return foo.arguments.length == 3 &&"
500 " foo.arguments[0] == 13 &&"
501 " foo.arguments[1] == 14 &&"
502 " foo.arguments[2] == 15;"
503 " }"
504 " function bar() { return foo(13, 14, 15); };"
505 " return bar;"
506 "})();",
507 kInlineFlags);
508
509 InstallAssertInlineCountHelper(CcTest::isolate());
510 T.CheckCall(T.true_value(), T.Val(12), T.Val(14));
511}
512
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000513
514TEST(InlineBuiltin) {
515 FunctionTester T(
516 "(function () {"
517 " function foo(s,t,u) { AssertInlineCount(2); return true; }"
518 " function bar() { return foo(); };"
519 " %SetForceInlineFlag(foo);"
520 " return bar;"
521 "})();",
522 kRestrictedInliningFlags);
523
524 InstallAssertInlineCountHelper(CcTest::isolate());
525 T.CheckCall(T.true_value());
526}
527
528
529TEST(InlineNestedBuiltin) {
530 FunctionTester T(
531 "(function () {"
532 " function foo(s,t,u) { AssertInlineCount(3); return true; }"
533 " function baz(s,t,u) { return foo(s,t,u); }"
534 " function bar() { return baz(); };"
535 " %SetForceInlineFlag(foo);"
536 " %SetForceInlineFlag(baz);"
537 " return bar;"
538 "})();",
539 kRestrictedInliningFlags);
540
541 InstallAssertInlineCountHelper(CcTest::isolate());
542 T.CheckCall(T.true_value());
543}
544
545
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000546TEST(InlineSelfRecursive) {
547 FunctionTester T(
548 "(function () {"
549 " function foo(x) { "
550 " AssertInlineCount(1);"
551 " if (x == 1) return foo(12);"
552 " return x;"
553 " }"
554 " return foo;"
555 "})();",
556 kInlineFlags);
557
558 InstallAssertInlineCountHelper(CcTest::isolate());
559 T.CheckCall(T.Val(12), T.Val(1));
560}
561
562
563TEST(InlineMutuallyRecursive) {
564 FunctionTester T(
565 "(function () {"
566 " function bar(x) { AssertInlineCount(2); return foo(x); }"
567 " function foo(x) { "
568 " if (x == 1) return bar(42);"
569 " return x;"
570 " }"
571 " return foo;"
572 "})();",
573 kInlineFlags);
574
575 InstallAssertInlineCountHelper(CcTest::isolate());
576 T.CheckCall(T.Val(42), T.Val(1));
577}
578
579} // namespace compiler
580} // namespace internal
581} // namespace v8