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 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
110 if (!NodeProperties::IsValueEdge(edge)) continue; | 110 if (!NodeProperties::IsValueEdge(edge)) continue; |
111 if (edge.from() == node) continue; | 111 if (edge.from() == node) continue; |
112 return NoChange(); | 112 return NoChange(); |
113 } | 113 } |
114 // Check if the arguments can be handled in the fast case (i.e. we don't | 114 // Check if the arguments can be handled in the fast case (i.e. we don't |
115 // have aliased sloppy arguments), and compute the {start_index} for | 115 // have aliased sloppy arguments), and compute the {start_index} for |
116 // rest parameters. | 116 // rest parameters. |
117 CreateArgumentsType const type = CreateArgumentsTypeOf(arg_array->op()); | 117 CreateArgumentsType const type = CreateArgumentsTypeOf(arg_array->op()); |
118 Node* frame_state = NodeProperties::GetFrameStateInput(arg_array); | 118 Node* frame_state = NodeProperties::GetFrameStateInput(arg_array); |
119 FrameStateInfo state_info = OpParameter<FrameStateInfo>(frame_state); | 119 FrameStateInfo state_info = OpParameter<FrameStateInfo>(frame_state); |
| 120 int formal_parameter_count; |
120 int start_index = 0; | 121 int start_index = 0; |
| 122 { |
| 123 Handle<SharedFunctionInfo> shared; |
| 124 if (!state_info.shared_info().ToHandle(&shared)) return NoChange(); |
| 125 formal_parameter_count = shared->internal_formal_parameter_count(); |
| 126 } |
121 if (type == CreateArgumentsType::kMappedArguments) { | 127 if (type == CreateArgumentsType::kMappedArguments) { |
122 // Mapped arguments (sloppy mode) cannot be handled if they are aliased. | 128 // Mapped arguments (sloppy mode) cannot be handled if they are aliased. |
123 Handle<SharedFunctionInfo> shared; | 129 if (formal_parameter_count != 0) return NoChange(); |
124 if (!state_info.shared_info().ToHandle(&shared)) return NoChange(); | |
125 if (shared->internal_formal_parameter_count() != 0) return NoChange(); | |
126 } else if (type == CreateArgumentsType::kRestParameter) { | 130 } else if (type == CreateArgumentsType::kRestParameter) { |
127 Handle<SharedFunctionInfo> shared; | 131 start_index = formal_parameter_count; |
128 if (!state_info.shared_info().ToHandle(&shared)) return NoChange(); | |
129 start_index = shared->internal_formal_parameter_count(); | |
130 } | 132 } |
131 // Check if are applying to inlined arguments or to the arguments of | 133 // Check if are applying to inlined arguments or to the arguments of |
132 // the outermost function. | 134 // the outermost function. |
133 Node* outer_state = frame_state->InputAt(kFrameStateOuterStateInput); | 135 Node* outer_state = frame_state->InputAt(kFrameStateOuterStateInput); |
134 if (outer_state->opcode() != IrOpcode::kFrameState) { | 136 if (outer_state->opcode() != IrOpcode::kFrameState) { |
135 // TODO(jarin,bmeurer): Support the NewUnmappedArgumentsElement and | 137 // TODO(jarin,bmeurer): Support the NewUnmappedArgumentsElement and |
136 // NewRestParameterElements in the EscapeAnalysis and Deoptimizer | 138 // NewRestParameterElements in the EscapeAnalysis and Deoptimizer |
137 // instead, then we don't need this hack. | 139 // instead, then we don't need this hack. |
138 if (type != CreateArgumentsType::kRestParameter) { | 140 // Only works with zero formal parameters because of lacking deoptimizer |
| 141 // support. |
| 142 if (type != CreateArgumentsType::kRestParameter && |
| 143 formal_parameter_count == 0) { |
139 // There are no other uses of the {arg_array} except in StateValues, | 144 // There are no other uses of the {arg_array} except in StateValues, |
140 // so we just replace {arg_array} with a marker for the Deoptimizer | 145 // so we just replace {arg_array} with a marker for the Deoptimizer |
141 // that this refers to the arguments object. | 146 // that this refers to the arguments object. |
142 Node* arguments = graph()->NewNode(common()->ArgumentsObjectState()); | 147 Node* arguments = graph()->NewNode(common()->ArgumentsObjectState()); |
143 ReplaceWithValue(arg_array, arguments); | 148 ReplaceWithValue(arg_array, arguments); |
144 } | 149 } |
145 | 150 |
146 // Reduce {node} to a JSCallForwardVarargs operation, which just | 151 // Reduce {node} to a JSCallForwardVarargs operation, which just |
147 // re-pushes the incoming arguments and calls the {target}. | 152 // re-pushes the incoming arguments and calls the {target}. |
148 node->RemoveInput(0); // Function.prototype.apply | 153 node->RemoveInput(0); // Function.prototype.apply |
(...skipping 634 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
783 return jsgraph()->javascript(); | 788 return jsgraph()->javascript(); |
784 } | 789 } |
785 | 790 |
786 SimplifiedOperatorBuilder* JSCallReducer::simplified() const { | 791 SimplifiedOperatorBuilder* JSCallReducer::simplified() const { |
787 return jsgraph()->simplified(); | 792 return jsgraph()->simplified(); |
788 } | 793 } |
789 | 794 |
790 } // namespace compiler | 795 } // namespace compiler |
791 } // namespace internal | 796 } // namespace internal |
792 } // namespace v8 | 797 } // namespace v8 |
OLD | NEW |