5 #include "src/compiler/frame-states.h" 7 #include "src/base/functional.h" 8 #include "src/callable.h" 9 #include "src/compiler/graph.h" 10 #include "src/compiler/js-graph.h" 11 #include "src/compiler/node.h" 12 #include "src/handles-inl.h" 13 #include "src/objects-inl.h" 19 size_t hash_value(OutputFrameStateCombine
const& sc) {
20 return base::hash_value(sc.parameter_);
24 std::ostream& operator<<(std::ostream& os, OutputFrameStateCombine
const& sc) {
25 if (sc.parameter_ == OutputFrameStateCombine::kInvalidIndex)
26 return os <<
"Ignore";
27 return os <<
"PokeAt(" << sc.parameter_ <<
")";
31 bool operator==(FrameStateInfo
const& lhs, FrameStateInfo
const& rhs) {
32 return lhs.type() == rhs.type() && lhs.bailout_id() == rhs.bailout_id() &&
33 lhs.state_combine() == rhs.state_combine() &&
34 lhs.function_info() == rhs.function_info();
38 bool operator!=(FrameStateInfo
const& lhs, FrameStateInfo
const& rhs) {
43 size_t hash_value(FrameStateInfo
const& info) {
44 return base::hash_combine(static_cast<int>(info.type()), info.bailout_id(),
45 info.state_combine());
49 std::ostream& operator<<(std::ostream& os, FrameStateType type) {
51 case FrameStateType::kInterpretedFunction:
52 os <<
"INTERPRETED_FRAME";
54 case FrameStateType::kArgumentsAdaptor:
55 os <<
"ARGUMENTS_ADAPTOR";
57 case FrameStateType::kConstructStub:
58 os <<
"CONSTRUCT_STUB";
60 case FrameStateType::kBuiltinContinuation:
61 os <<
"BUILTIN_CONTINUATION_FRAME";
63 case FrameStateType::kJavaScriptBuiltinContinuation:
64 os <<
"JAVA_SCRIPT_BUILTIN_CONTINUATION_FRAME";
66 case FrameStateType::kJavaScriptBuiltinContinuationWithCatch:
67 os <<
"JAVA_SCRIPT_BUILTIN_CONTINUATION_WITH_CATCH_FRAME";
74 std::ostream& operator<<(std::ostream& os, FrameStateInfo
const& info) {
75 os << info.type() <<
", " << info.bailout_id() <<
", " 76 << info.state_combine();
77 Handle<SharedFunctionInfo> shared_info;
78 if (info.shared_info().ToHandle(&shared_info)) {
79 os <<
", " << Brief(*shared_info);
92 uint8_t DeoptimizerParameterCountFor(ContinuationFrameStateMode mode) {
94 case ContinuationFrameStateMode::EAGER:
96 case ContinuationFrameStateMode::LAZY:
98 case ContinuationFrameStateMode::LAZY_WITH_CATCH:
104 Node* CreateBuiltinContinuationFrameStateCommon(
105 JSGraph* jsgraph, FrameStateType frame_type, Builtins::Name name,
106 Node* closure, Node* context, Node** parameters,
int parameter_count,
107 Node* outer_frame_state,
108 Handle<SharedFunctionInfo> shared = Handle<SharedFunctionInfo>()) {
109 Isolate*
const isolate = jsgraph->isolate();
110 Graph*
const graph = jsgraph->graph();
111 CommonOperatorBuilder*
const common = jsgraph->common();
113 BailoutId bailout_id = Builtins::GetContinuationBailoutId(name);
114 Callable callable = Builtins::CallableFor(isolate, name);
116 const Operator* op_param =
117 common->StateValues(parameter_count, SparseInputMask::Dense());
118 Node* params_node = graph->NewNode(op_param, parameter_count, parameters);
120 const FrameStateFunctionInfo* state_info =
121 common->CreateFrameStateFunctionInfo(frame_type, parameter_count, 0,
123 const Operator* op = common->FrameState(
124 bailout_id, OutputFrameStateCombine::Ignore(), state_info);
126 Node* frame_state = graph->NewNode(
127 op, params_node, jsgraph->EmptyStateValues(), jsgraph->EmptyStateValues(),
128 context, closure, outer_frame_state);
135 Node* CreateStubBuiltinContinuationFrameState(
136 JSGraph* jsgraph, Builtins::Name name, Node* context,
137 Node*
const* parameters,
int parameter_count, Node* outer_frame_state,
138 ContinuationFrameStateMode mode) {
139 Isolate* isolate = jsgraph->isolate();
140 Callable callable = Builtins::CallableFor(isolate, name);
141 CallInterfaceDescriptor descriptor = callable.descriptor();
143 std::vector<Node*> actual_parameters;
146 int stack_parameter_count =
147 descriptor.GetParameterCount() - DeoptimizerParameterCountFor(mode);
150 actual_parameters.reserve(stack_parameter_count >= 0
151 ? stack_parameter_count +
152 descriptor.GetRegisterParameterCount()
154 for (
int i = 0;
i < stack_parameter_count; ++
i) {
155 actual_parameters.push_back(
156 parameters[descriptor.GetRegisterParameterCount() +
i]);
160 for (
int i = 0;
i < descriptor.GetRegisterParameterCount(); ++
i) {
161 actual_parameters.push_back(parameters[
i]);
164 return CreateBuiltinContinuationFrameStateCommon(
165 jsgraph, FrameStateType::kBuiltinContinuation, name,
166 jsgraph->UndefinedConstant(), context, actual_parameters.data(),
167 static_cast<int>(actual_parameters.size()), outer_frame_state);
170 Node* CreateJavaScriptBuiltinContinuationFrameState(
171 JSGraph* jsgraph,
const SharedFunctionInfoRef& shared, Builtins::Name name,
172 Node* target, Node* context, Node*
const* stack_parameters,
173 int stack_parameter_count, Node* outer_frame_state,
174 ContinuationFrameStateMode mode) {
175 Isolate*
const isolate = jsgraph->isolate();
176 Callable
const callable = Builtins::CallableFor(isolate, name);
180 DCHECK_EQ(Builtins::GetStackParameterCount(name) + 1,
181 stack_parameter_count + DeoptimizerParameterCountFor(mode));
183 Node* argc = jsgraph->Constant(Builtins::GetStackParameterCount(name));
188 std::vector<Node*> actual_parameters;
189 for (
int i = 0;
i < stack_parameter_count; ++
i) {
190 actual_parameters.push_back(stack_parameters[
i]);
195 actual_parameters.push_back(target);
196 actual_parameters.push_back(jsgraph->UndefinedConstant());
197 actual_parameters.push_back(argc);
199 return CreateBuiltinContinuationFrameStateCommon(
201 mode == ContinuationFrameStateMode::LAZY_WITH_CATCH
202 ? FrameStateType::kJavaScriptBuiltinContinuationWithCatch
203 : FrameStateType::kJavaScriptBuiltinContinuation,
204 name, target, context, &actual_parameters[0],
205 static_cast<int>(actual_parameters.size()), outer_frame_state,