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/code-factory.h" | 5 #include "src/code-factory.h" |
6 #include "src/compiler/access-builder.h" | 6 #include "src/compiler/access-builder.h" |
7 #include "src/compiler/js-graph.h" | 7 #include "src/compiler/js-graph.h" |
8 #include "src/compiler/js-typed-lowering.h" | 8 #include "src/compiler/js-typed-lowering.h" |
9 #include "src/compiler/linkage.h" | 9 #include "src/compiler/linkage.h" |
10 #include "src/compiler/node-matchers.h" | 10 #include "src/compiler/node-matchers.h" |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 // Avoid introducing too many eager ToString() operations. | 245 // Avoid introducing too many eager ToString() operations. |
246 Reduction reduced = lowering_->ReduceJSToStringInput(node); | 246 Reduction reduced = lowering_->ReduceJSToStringInput(node); |
247 if (reduced.Changed()) return reduced.replacement(); | 247 if (reduced.Changed()) return reduced.replacement(); |
248 Node* n = graph()->NewNode(javascript()->ToString(), node, context(), | 248 Node* n = graph()->NewNode(javascript()->ToString(), node, context(), |
249 effect(), control()); | 249 effect(), control()); |
250 update_effect(n); | 250 update_effect(n); |
251 return n; | 251 return n; |
252 } | 252 } |
253 | 253 |
254 Node* CreateFrameStateForLeftInput(Node* frame_state) { | 254 Node* CreateFrameStateForLeftInput(Node* frame_state) { |
255 FrameStateCallInfo state_info = | 255 FrameStateInfo state_info = OpParameter<FrameStateInfo>(frame_state); |
256 OpParameter<FrameStateCallInfo>(frame_state); | |
257 | 256 |
258 if (state_info.bailout_id() == BailoutId::None()) { | 257 if (state_info.bailout_id() == BailoutId::None()) { |
259 // Dummy frame state => just leave it as is. | 258 // Dummy frame state => just leave it as is. |
260 return frame_state; | 259 return frame_state; |
261 } | 260 } |
262 | 261 |
263 // If the frame state is already the right one, just return it. | 262 // If the frame state is already the right one, just return it. |
264 if (state_info.state_combine().kind() == OutputFrameStateCombine::kPokeAt && | 263 if (state_info.state_combine().kind() == OutputFrameStateCombine::kPokeAt && |
265 state_info.state_combine().GetOffsetToPokeAt() == 1) { | 264 state_info.state_combine().GetOffsetToPokeAt() == 1) { |
266 return frame_state; | 265 return frame_state; |
267 } | 266 } |
268 | 267 |
269 // Here, we smash the result of the conversion into the slot just below | 268 // Here, we smash the result of the conversion into the slot just below |
270 // the stack top. This is the slot that full code uses to store the | 269 // the stack top. This is the slot that full code uses to store the |
271 // left operand. | 270 // left operand. |
272 const Operator* op = jsgraph()->common()->FrameState( | 271 const Operator* op = jsgraph()->common()->FrameState( |
273 state_info.type(), state_info.bailout_id(), | 272 state_info.bailout_id(), OutputFrameStateCombine::PokeAt(1), |
274 OutputFrameStateCombine::PokeAt(1), state_info.shared_info()); | 273 state_info.function_info()); |
275 | 274 |
276 return graph()->NewNode(op, | 275 return graph()->NewNode(op, |
277 frame_state->InputAt(kFrameStateParametersInput), | 276 frame_state->InputAt(kFrameStateParametersInput), |
278 frame_state->InputAt(kFrameStateLocalsInput), | 277 frame_state->InputAt(kFrameStateLocalsInput), |
279 frame_state->InputAt(kFrameStateStackInput), | 278 frame_state->InputAt(kFrameStateStackInput), |
280 frame_state->InputAt(kFrameStateContextInput), | 279 frame_state->InputAt(kFrameStateContextInput), |
281 frame_state->InputAt(kFrameStateFunctionInput), | 280 frame_state->InputAt(kFrameStateFunctionInput), |
282 frame_state->InputAt(kFrameStateOuterStateInput)); | 281 frame_state->InputAt(kFrameStateOuterStateInput)); |
283 } | 282 } |
284 | 283 |
285 Node* CreateFrameStateForRightInput(Node* frame_state, Node* converted_left) { | 284 Node* CreateFrameStateForRightInput(Node* frame_state, Node* converted_left) { |
286 FrameStateCallInfo state_info = | 285 FrameStateInfo state_info = OpParameter<FrameStateInfo>(frame_state); |
287 OpParameter<FrameStateCallInfo>(frame_state); | |
288 | 286 |
289 if (state_info.bailout_id() == BailoutId::None()) { | 287 if (state_info.bailout_id() == BailoutId::None()) { |
290 // Dummy frame state => just leave it as is. | 288 // Dummy frame state => just leave it as is. |
291 return frame_state; | 289 return frame_state; |
292 } | 290 } |
293 | 291 |
294 // Create a frame state that stores the result of the operation to the | 292 // Create a frame state that stores the result of the operation to the |
295 // top of the stack (i.e., the slot used for the right operand). | 293 // top of the stack (i.e., the slot used for the right operand). |
296 const Operator* op = jsgraph()->common()->FrameState( | 294 const Operator* op = jsgraph()->common()->FrameState( |
297 state_info.type(), state_info.bailout_id(), | 295 state_info.bailout_id(), OutputFrameStateCombine::PokeAt(0), |
298 OutputFrameStateCombine::PokeAt(0), state_info.shared_info()); | 296 state_info.function_info()); |
299 | 297 |
300 // Change the left operand {converted_left} on the expression stack. | 298 // Change the left operand {converted_left} on the expression stack. |
301 Node* stack = frame_state->InputAt(2); | 299 Node* stack = frame_state->InputAt(2); |
302 DCHECK_EQ(stack->opcode(), IrOpcode::kStateValues); | 300 DCHECK_EQ(stack->opcode(), IrOpcode::kStateValues); |
303 DCHECK_GE(stack->InputCount(), 2); | 301 DCHECK_GE(stack->InputCount(), 2); |
304 | 302 |
305 // TODO(jarin) Allocate in a local zone or a reusable buffer. | 303 // TODO(jarin) Allocate in a local zone or a reusable buffer. |
306 NodeVector new_values(stack->InputCount(), zone()); | 304 NodeVector new_values(stack->InputCount(), zone()); |
307 for (int i = 0; i < stack->InputCount(); i++) { | 305 for (int i = 0; i < stack->InputCount(); i++) { |
308 if (i == stack->InputCount() - 2) { | 306 if (i == stack->InputCount() - 2) { |
(...skipping 1399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1708 } | 1706 } |
1709 | 1707 |
1710 | 1708 |
1711 MachineOperatorBuilder* JSTypedLowering::machine() const { | 1709 MachineOperatorBuilder* JSTypedLowering::machine() const { |
1712 return jsgraph()->machine(); | 1710 return jsgraph()->machine(); |
1713 } | 1711 } |
1714 | 1712 |
1715 } // namespace compiler | 1713 } // namespace compiler |
1716 } // namespace internal | 1714 } // namespace internal |
1717 } // namespace v8 | 1715 } // namespace v8 |
OLD | NEW |