Line data Source code
1 : // Copyright 2016 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 :
5 : #include "src/builtins/builtins-utils.h"
6 : #include "src/builtins/builtins.h"
7 : #include "src/globals.h"
8 : #include "src/handles-inl.h"
9 : #include "src/objects-inl.h"
10 :
11 : namespace v8 {
12 : namespace internal {
13 :
14 1447 : Handle<Code> Builtins::InterpreterPushArgsThenCall(
15 : ConvertReceiverMode receiver_mode, TailCallMode tail_call_mode,
16 : InterpreterPushArgsMode mode) {
17 1447 : switch (mode) {
18 : case InterpreterPushArgsMode::kJSFunction:
19 516 : if (tail_call_mode == TailCallMode::kDisallow) {
20 387 : switch (receiver_mode) {
21 : case ConvertReceiverMode::kNullOrUndefined:
22 129 : return InterpreterPushUndefinedAndArgsThenCallFunction();
23 : case ConvertReceiverMode::kNotNullOrUndefined:
24 : case ConvertReceiverMode::kAny:
25 258 : return InterpreterPushArgsThenCallFunction();
26 : }
27 : } else {
28 129 : CHECK_EQ(receiver_mode, ConvertReceiverMode::kAny);
29 129 : return InterpreterPushArgsThenTailCallFunction();
30 : }
31 : case InterpreterPushArgsMode::kWithFinalSpread:
32 129 : CHECK(tail_call_mode == TailCallMode::kDisallow);
33 129 : return InterpreterPushArgsThenCallWithFinalSpread();
34 : case InterpreterPushArgsMode::kOther:
35 802 : if (tail_call_mode == TailCallMode::kDisallow) {
36 671 : switch (receiver_mode) {
37 : case ConvertReceiverMode::kNullOrUndefined:
38 137 : return InterpreterPushUndefinedAndArgsThenCall();
39 : case ConvertReceiverMode::kNotNullOrUndefined:
40 : case ConvertReceiverMode::kAny:
41 534 : return InterpreterPushArgsThenCall();
42 : }
43 : } else {
44 131 : CHECK_EQ(receiver_mode, ConvertReceiverMode::kAny);
45 131 : return InterpreterPushArgsThenTailCall();
46 : }
47 : }
48 0 : UNREACHABLE();
49 : return Handle<Code>::null();
50 : }
51 :
52 387 : Handle<Code> Builtins::InterpreterPushArgsThenConstruct(
53 : InterpreterPushArgsMode mode) {
54 387 : switch (mode) {
55 : case InterpreterPushArgsMode::kJSFunction:
56 129 : return InterpreterPushArgsThenConstructFunction();
57 : case InterpreterPushArgsMode::kWithFinalSpread:
58 129 : return InterpreterPushArgsThenConstructWithFinalSpread();
59 : case InterpreterPushArgsMode::kOther:
60 129 : return InterpreterPushArgsThenConstruct();
61 : }
62 0 : UNREACHABLE();
63 : return Handle<Code>::null();
64 : }
65 :
66 : } // namespace internal
67 : } // namespace v8
|