| 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-native-context-specialization.h" | 5 #include "src/compiler/js-native-context-specialization.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/code-factory.h" | 8 #include "src/code-factory.h" |
| 9 #include "src/compilation-dependencies.h" | 9 #include "src/compilation-dependencies.h" |
| 10 #include "src/compiler/access-builder.h" | 10 #include "src/compiler/access-builder.h" |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 | 168 |
| 169 return NoChange(); | 169 return NoChange(); |
| 170 } | 170 } |
| 171 | 171 |
| 172 Reduction JSNativeContextSpecialization::ReduceJSInstanceOf(Node* node) { | 172 Reduction JSNativeContextSpecialization::ReduceJSInstanceOf(Node* node) { |
| 173 DCHECK_EQ(IrOpcode::kJSInstanceOf, node->opcode()); | 173 DCHECK_EQ(IrOpcode::kJSInstanceOf, node->opcode()); |
| 174 Node* object = NodeProperties::GetValueInput(node, 0); | 174 Node* object = NodeProperties::GetValueInput(node, 0); |
| 175 Node* constructor = NodeProperties::GetValueInput(node, 1); | 175 Node* constructor = NodeProperties::GetValueInput(node, 1); |
| 176 Node* context = NodeProperties::GetContextInput(node); | 176 Node* context = NodeProperties::GetContextInput(node); |
| 177 Node* effect = NodeProperties::GetEffectInput(node); | 177 Node* effect = NodeProperties::GetEffectInput(node); |
| 178 Node* frame_state = NodeProperties::GetFrameStateInput(node); |
| 178 Node* control = NodeProperties::GetControlInput(node); | 179 Node* control = NodeProperties::GetControlInput(node); |
| 179 | 180 |
| 180 // Check if the right hand side is a known {receiver}. | 181 // Check if the right hand side is a known {receiver}. |
| 181 HeapObjectMatcher m(constructor); | 182 HeapObjectMatcher m(constructor); |
| 182 if (!m.HasValue() || !m.Value()->IsJSObject()) return NoChange(); | 183 if (!m.HasValue() || !m.Value()->IsJSObject()) return NoChange(); |
| 183 Handle<JSObject> receiver = Handle<JSObject>::cast(m.Value()); | 184 Handle<JSObject> receiver = Handle<JSObject>::cast(m.Value()); |
| 184 Handle<Map> receiver_map(receiver->map(), isolate()); | 185 Handle<Map> receiver_map(receiver->map(), isolate()); |
| 185 | 186 |
| 186 // Compute property access info for @@hasInstance on {receiver}. | 187 // Compute property access info for @@hasInstance on {receiver}. |
| 187 PropertyAccessInfo access_info; | 188 PropertyAccessInfo access_info; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 237 FieldIndex field_index = access_info.field_index(); | 238 FieldIndex field_index = access_info.field_index(); |
| 238 constant = JSObject::FastPropertyAt(holder, Representation::Tagged(), | 239 constant = JSObject::FastPropertyAt(holder, Representation::Tagged(), |
| 239 field_index); | 240 field_index); |
| 240 } | 241 } |
| 241 DCHECK(constant->IsCallable()); | 242 DCHECK(constant->IsCallable()); |
| 242 | 243 |
| 243 // Monomorphic property access. | 244 // Monomorphic property access. |
| 244 effect = BuildCheckMaps(constructor, effect, control, | 245 effect = BuildCheckMaps(constructor, effect, control, |
| 245 access_info.receiver_maps()); | 246 access_info.receiver_maps()); |
| 246 | 247 |
| 248 // Create a nested frame state inside the current method's most-recent frame |
| 249 // state that will ensure that deopts that happen after this point will not |
| 250 // fallback to the last Checkpoint--which would completely re-execute the |
| 251 // instanceof logic--but rather create an activation of a version of the |
| 252 // ToBoolean stub that finishes the remaining work of instanceof and returns |
| 253 // to the caller without duplicating side-effects upon a lazy deopt. |
| 254 Node* continuation_frame_state = CreateStubBuiltinContinuationFrameState( |
| 255 jsgraph(), Builtins::kToBooleanLazyDeoptContinuation, context, nullptr, |
| 256 0, frame_state, ContinuationFrameStateMode::LAZY); |
| 257 |
| 247 // Call the @@hasInstance handler. | 258 // Call the @@hasInstance handler. |
| 248 Node* target = jsgraph()->Constant(constant); | 259 Node* target = jsgraph()->Constant(constant); |
| 249 node->InsertInput(graph()->zone(), 0, target); | 260 node->InsertInput(graph()->zone(), 0, target); |
| 250 node->ReplaceInput(1, constructor); | 261 node->ReplaceInput(1, constructor); |
| 251 node->ReplaceInput(2, object); | 262 node->ReplaceInput(2, object); |
| 263 node->ReplaceInput(4, continuation_frame_state); |
| 252 node->ReplaceInput(5, effect); | 264 node->ReplaceInput(5, effect); |
| 253 NodeProperties::ChangeOp( | 265 NodeProperties::ChangeOp( |
| 254 node, javascript()->Call(3, CallFrequency(), VectorSlotPair(), | 266 node, javascript()->Call(3, CallFrequency(), VectorSlotPair(), |
| 255 ConvertReceiverMode::kNotNullOrUndefined)); | 267 ConvertReceiverMode::kNotNullOrUndefined)); |
| 256 | 268 |
| 257 // Rewire the value uses of {node} to ToBoolean conversion of the result. | 269 // Rewire the value uses of {node} to ToBoolean conversion of the result. |
| 258 Node* value = graph()->NewNode(javascript()->ToBoolean(ToBooleanHint::kAny), | 270 Node* value = graph()->NewNode(javascript()->ToBoolean(ToBooleanHint::kAny), |
| 259 node, context); | 271 node, context); |
| 260 for (Edge edge : node->use_edges()) { | 272 for (Edge edge : node->use_edges()) { |
| 261 if (NodeProperties::IsValueEdge(edge) && edge.from() != value) { | 273 if (NodeProperties::IsValueEdge(edge) && edge.from() != value) { |
| (...skipping 2352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2614 return jsgraph()->javascript(); | 2626 return jsgraph()->javascript(); |
| 2615 } | 2627 } |
| 2616 | 2628 |
| 2617 SimplifiedOperatorBuilder* JSNativeContextSpecialization::simplified() const { | 2629 SimplifiedOperatorBuilder* JSNativeContextSpecialization::simplified() const { |
| 2618 return jsgraph()->simplified(); | 2630 return jsgraph()->simplified(); |
| 2619 } | 2631 } |
| 2620 | 2632 |
| 2621 } // namespace compiler | 2633 } // namespace compiler |
| 2622 } // namespace internal | 2634 } // namespace internal |
| 2623 } // namespace v8 | 2635 } // namespace v8 |
| OLD | NEW |