blob: ddb55c35d245ca6286f0ef11b9ffabb384a471ac [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2015 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#ifndef V8_COMPILER_FRAME_STATES_H_
6#define V8_COMPILER_FRAME_STATES_H_
7
8#include "src/handles.h"
9#include "src/utils.h"
10
11namespace v8 {
12namespace internal {
13
14// Forward declarations.
15class SharedFunctionInfo;
16
17namespace compiler {
18
19// Flag that describes how to combine the current environment with
20// the output of a node to obtain a framestate for lazy bailout.
21class OutputFrameStateCombine {
22 public:
23 enum Kind {
24 kPushOutput, // Push the output on the expression stack.
25 kPokeAt // Poke at the given environment location,
26 // counting from the top of the stack.
27 };
28
29 static OutputFrameStateCombine Ignore() {
30 return OutputFrameStateCombine(kPushOutput, 0);
31 }
32 static OutputFrameStateCombine Push(size_t count = 1) {
33 return OutputFrameStateCombine(kPushOutput, count);
34 }
35 static OutputFrameStateCombine PokeAt(size_t index) {
36 return OutputFrameStateCombine(kPokeAt, index);
37 }
38
39 Kind kind() const { return kind_; }
40 size_t GetPushCount() const {
41 DCHECK_EQ(kPushOutput, kind());
42 return parameter_;
43 }
44 size_t GetOffsetToPokeAt() const {
45 DCHECK_EQ(kPokeAt, kind());
46 return parameter_;
47 }
48
49 bool IsOutputIgnored() const {
50 return kind_ == kPushOutput && parameter_ == 0;
51 }
52
53 size_t ConsumedOutputCount() const {
54 return kind_ == kPushOutput ? GetPushCount() : 1;
55 }
56
57 bool operator==(OutputFrameStateCombine const& other) const {
58 return kind_ == other.kind_ && parameter_ == other.parameter_;
59 }
60 bool operator!=(OutputFrameStateCombine const& other) const {
61 return !(*this == other);
62 }
63
64 friend size_t hash_value(OutputFrameStateCombine const&);
65 friend std::ostream& operator<<(std::ostream&,
66 OutputFrameStateCombine const&);
67
68 private:
69 OutputFrameStateCombine(Kind kind, size_t parameter)
70 : kind_(kind), parameter_(parameter) {}
71
72 Kind const kind_;
73 size_t const parameter_;
74};
75
76
77// The type of stack frame that a FrameState node represents.
78enum class FrameStateType {
79 kJavaScriptFunction, // Represents an unoptimized JavaScriptFrame.
80 kInterpretedFunction, // Represents an InterpretedFrame.
81 kArgumentsAdaptor, // Represents an ArgumentsAdaptorFrame.
82 kConstructStub // Represents a ConstructStubFrame.
83};
84
85
86enum ContextCallingMode {
87 CALL_MAINTAINS_NATIVE_CONTEXT,
88 CALL_CHANGES_NATIVE_CONTEXT
89};
90
91
92class FrameStateFunctionInfo {
93 public:
94 FrameStateFunctionInfo(FrameStateType type, int parameter_count,
95 int local_count,
96 Handle<SharedFunctionInfo> shared_info,
97 ContextCallingMode context_calling_mode)
98 : type_(type),
99 parameter_count_(parameter_count),
100 local_count_(local_count),
101 shared_info_(shared_info),
102 context_calling_mode_(context_calling_mode) {}
103
104 int local_count() const { return local_count_; }
105 int parameter_count() const { return parameter_count_; }
106 Handle<SharedFunctionInfo> shared_info() const { return shared_info_; }
107 FrameStateType type() const { return type_; }
108 ContextCallingMode context_calling_mode() const {
109 return context_calling_mode_;
110 }
111
112 static bool IsJSFunctionType(FrameStateType type) {
113 return type == FrameStateType::kJavaScriptFunction ||
114 type == FrameStateType::kInterpretedFunction;
115 }
116
117 private:
118 FrameStateType const type_;
119 int const parameter_count_;
120 int const local_count_;
121 Handle<SharedFunctionInfo> const shared_info_;
122 ContextCallingMode context_calling_mode_;
123};
124
125
126class FrameStateInfo final {
127 public:
128 FrameStateInfo(BailoutId bailout_id, OutputFrameStateCombine state_combine,
129 const FrameStateFunctionInfo* info)
130 : bailout_id_(bailout_id),
131 frame_state_combine_(state_combine),
132 info_(info) {}
133
134 FrameStateType type() const {
135 return info_ == nullptr ? FrameStateType::kJavaScriptFunction
136 : info_->type();
137 }
138 BailoutId bailout_id() const { return bailout_id_; }
139 OutputFrameStateCombine state_combine() const { return frame_state_combine_; }
140 MaybeHandle<SharedFunctionInfo> shared_info() const {
141 return info_ == nullptr ? MaybeHandle<SharedFunctionInfo>()
142 : info_->shared_info();
143 }
144 int parameter_count() const {
145 return info_ == nullptr ? 0 : info_->parameter_count();
146 }
147 int local_count() const {
148 return info_ == nullptr ? 0 : info_->local_count();
149 }
150 const FrameStateFunctionInfo* function_info() const { return info_; }
151
152 private:
153 BailoutId const bailout_id_;
154 OutputFrameStateCombine const frame_state_combine_;
155 const FrameStateFunctionInfo* const info_;
156};
157
158bool operator==(FrameStateInfo const&, FrameStateInfo const&);
159bool operator!=(FrameStateInfo const&, FrameStateInfo const&);
160
161size_t hash_value(FrameStateInfo const&);
162
163std::ostream& operator<<(std::ostream&, FrameStateInfo const&);
164
165static const int kFrameStateParametersInput = 0;
166static const int kFrameStateLocalsInput = 1;
167static const int kFrameStateStackInput = 2;
168static const int kFrameStateContextInput = 3;
169static const int kFrameStateFunctionInput = 4;
170static const int kFrameStateOuterStateInput = 5;
171static const int kFrameStateInputCount = kFrameStateOuterStateInput + 1;
172
173} // namespace compiler
174} // namespace internal
175} // namespace v8
176
177#endif // V8_COMPILER_FRAME_STATES_H_