OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // 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 | 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/compiler/js-call-reducer.h" | 5 #include "src/compiler/js-call-reducer.h" |
6 | 6 |
7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 #include "src/compilation-dependencies.h" | 9 #include "src/compilation-dependencies.h" |
10 #include "src/compiler/js-graph.h" | 10 #include "src/compiler/js-graph.h" |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 if (type == CreateArgumentsType::kMappedArguments) { | 129 if (type == CreateArgumentsType::kMappedArguments) { |
130 // Mapped arguments (sloppy mode) cannot be handled if they are aliased. | 130 // Mapped arguments (sloppy mode) cannot be handled if they are aliased. |
131 if (formal_parameter_count != 0) return NoChange(); | 131 if (formal_parameter_count != 0) return NoChange(); |
132 } else if (type == CreateArgumentsType::kRestParameter) { | 132 } else if (type == CreateArgumentsType::kRestParameter) { |
133 start_index = formal_parameter_count; | 133 start_index = formal_parameter_count; |
134 } | 134 } |
135 // Check if are applying to inlined arguments or to the arguments of | 135 // Check if are applying to inlined arguments or to the arguments of |
136 // the outermost function. | 136 // the outermost function. |
137 Node* outer_state = frame_state->InputAt(kFrameStateOuterStateInput); | 137 Node* outer_state = frame_state->InputAt(kFrameStateOuterStateInput); |
138 if (outer_state->opcode() != IrOpcode::kFrameState) { | 138 if (outer_state->opcode() != IrOpcode::kFrameState) { |
139 // TODO(jarin,bmeurer): Support the NewUnmappedArgumentsElement and | |
140 // NewRestParameterElements in the EscapeAnalysis and Deoptimizer | |
141 // instead, then we don't need this hack. | |
142 // Only works with zero formal parameters because of lacking deoptimizer | |
143 // support. | |
144 if (type != CreateArgumentsType::kRestParameter && | |
145 formal_parameter_count == 0) { | |
146 // There are no other uses of the {arg_array} except in StateValues, | |
147 // so we just replace {arg_array} with a marker for the Deoptimizer | |
148 // that this refers to the arguments object. | |
149 Node* arguments = graph()->NewNode(common()->ArgumentsObjectState()); | |
150 ReplaceWithValue(arg_array, arguments); | |
151 } | |
152 | |
153 // Reduce {node} to a JSCallForwardVarargs operation, which just | 139 // Reduce {node} to a JSCallForwardVarargs operation, which just |
154 // re-pushes the incoming arguments and calls the {target}. | 140 // re-pushes the incoming arguments and calls the {target}. |
155 node->RemoveInput(0); // Function.prototype.apply | 141 node->RemoveInput(0); // Function.prototype.apply |
156 node->RemoveInput(2); // arguments | 142 node->RemoveInput(2); // arguments |
157 NodeProperties::ChangeOp(node, javascript()->CallForwardVarargs( | 143 NodeProperties::ChangeOp(node, javascript()->CallForwardVarargs( |
158 start_index, p.tail_call_mode())); | 144 start_index, p.tail_call_mode())); |
159 return Changed(node); | 145 return Changed(node); |
160 } | 146 } |
161 // Get to the actual frame state from which to extract the arguments; | 147 // Get to the actual frame state from which to extract the arguments; |
162 // we can only optimize this in case the {node} was already inlined into | 148 // we can only optimize this in case the {node} was already inlined into |
(...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
827 return jsgraph()->javascript(); | 813 return jsgraph()->javascript(); |
828 } | 814 } |
829 | 815 |
830 SimplifiedOperatorBuilder* JSCallReducer::simplified() const { | 816 SimplifiedOperatorBuilder* JSCallReducer::simplified() const { |
831 return jsgraph()->simplified(); | 817 return jsgraph()->simplified(); |
832 } | 818 } |
833 | 819 |
834 } // namespace compiler | 820 } // namespace compiler |
835 } // namespace internal | 821 } // namespace internal |
836 } // namespace v8 | 822 } // namespace v8 |
OLD | NEW |