| 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/access-builder.h" | 10 #include "src/compiler/access-builder.h" |
| (...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 return ReduceObjectGetPrototype(node, object); | 335 return ReduceObjectGetPrototype(node, object); |
| 336 } | 336 } |
| 337 | 337 |
| 338 // ES6 section B.2.2.1.1 get Object.prototype.__proto__ | 338 // ES6 section B.2.2.1.1 get Object.prototype.__proto__ |
| 339 Reduction JSCallReducer::ReduceObjectPrototypeGetProto(Node* node) { | 339 Reduction JSCallReducer::ReduceObjectPrototypeGetProto(Node* node) { |
| 340 DCHECK_EQ(IrOpcode::kJSCall, node->opcode()); | 340 DCHECK_EQ(IrOpcode::kJSCall, node->opcode()); |
| 341 Node* receiver = NodeProperties::GetValueInput(node, 1); | 341 Node* receiver = NodeProperties::GetValueInput(node, 1); |
| 342 return ReduceObjectGetPrototype(node, receiver); | 342 return ReduceObjectGetPrototype(node, receiver); |
| 343 } | 343 } |
| 344 | 344 |
| 345 // ES #sec-object.prototype.isprototypeof |
| 346 Reduction JSCallReducer::ReduceObjectPrototypeIsPrototypeOf(Node* node) { |
| 347 DCHECK_EQ(IrOpcode::kJSCall, node->opcode()); |
| 348 Node* receiver = NodeProperties::GetValueInput(node, 1); |
| 349 Node* value = node->op()->ValueInputCount() > 2 |
| 350 ? NodeProperties::GetValueInput(node, 2) |
| 351 : jsgraph()->UndefinedConstant(); |
| 352 Node* effect = NodeProperties::GetEffectInput(node); |
| 353 |
| 354 // Ensure that the {receiver} is known to be a JSReceiver (so that |
| 355 // the ToObject step of Object.prototype.isPrototypeOf is a no-op). |
| 356 ZoneHandleSet<Map> receiver_maps; |
| 357 NodeProperties::InferReceiverMapsResult result = |
| 358 NodeProperties::InferReceiverMaps(receiver, effect, &receiver_maps); |
| 359 if (result == NodeProperties::kNoReceiverMaps) return NoChange(); |
| 360 for (size_t i = 0; i < receiver_maps.size(); ++i) { |
| 361 if (!receiver_maps[i]->IsJSReceiverMap()) return NoChange(); |
| 362 } |
| 363 |
| 364 // We don't check whether {value} is a proper JSReceiver here explicitly, |
| 365 // and don't explicitly rule out Primitive {value}s, since all of them |
| 366 // have null as their prototype, so the prototype chain walk inside the |
| 367 // JSHasInPrototypeChain operator immediately aborts and yields false. |
| 368 NodeProperties::ReplaceValueInput(node, value, 0); |
| 369 NodeProperties::ReplaceValueInput(node, receiver, 1); |
| 370 for (int i = node->op()->ValueInputCount(); i-- > 2;) { |
| 371 node->RemoveInput(i); |
| 372 } |
| 373 NodeProperties::ChangeOp(node, javascript()->HasInPrototypeChain()); |
| 374 return Changed(node); |
| 375 } |
| 376 |
| 345 // ES6 section 26.1.7 Reflect.getPrototypeOf ( target ) | 377 // ES6 section 26.1.7 Reflect.getPrototypeOf ( target ) |
| 346 Reduction JSCallReducer::ReduceReflectGetPrototypeOf(Node* node) { | 378 Reduction JSCallReducer::ReduceReflectGetPrototypeOf(Node* node) { |
| 347 DCHECK_EQ(IrOpcode::kJSCall, node->opcode()); | 379 DCHECK_EQ(IrOpcode::kJSCall, node->opcode()); |
| 348 Node* target = (node->op()->ValueInputCount() >= 3) | 380 Node* target = (node->op()->ValueInputCount() >= 3) |
| 349 ? NodeProperties::GetValueInput(node, 2) | 381 ? NodeProperties::GetValueInput(node, 2) |
| 350 : jsgraph()->UndefinedConstant(); | 382 : jsgraph()->UndefinedConstant(); |
| 351 return ReduceObjectGetPrototype(node, target); | 383 return ReduceObjectGetPrototype(node, target); |
| 352 } | 384 } |
| 353 | 385 |
| 354 Reduction JSCallReducer::ReduceArrayForEach(Handle<JSFunction> function, | 386 Reduction JSCallReducer::ReduceArrayForEach(Handle<JSFunction> function, |
| (...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 734 case Builtins::kFunctionPrototypeCall: | 766 case Builtins::kFunctionPrototypeCall: |
| 735 return ReduceFunctionPrototypeCall(node); | 767 return ReduceFunctionPrototypeCall(node); |
| 736 case Builtins::kFunctionPrototypeHasInstance: | 768 case Builtins::kFunctionPrototypeHasInstance: |
| 737 return ReduceFunctionPrototypeHasInstance(node); | 769 return ReduceFunctionPrototypeHasInstance(node); |
| 738 case Builtins::kNumberConstructor: | 770 case Builtins::kNumberConstructor: |
| 739 return ReduceNumberConstructor(node); | 771 return ReduceNumberConstructor(node); |
| 740 case Builtins::kObjectGetPrototypeOf: | 772 case Builtins::kObjectGetPrototypeOf: |
| 741 return ReduceObjectGetPrototypeOf(node); | 773 return ReduceObjectGetPrototypeOf(node); |
| 742 case Builtins::kObjectPrototypeGetProto: | 774 case Builtins::kObjectPrototypeGetProto: |
| 743 return ReduceObjectPrototypeGetProto(node); | 775 return ReduceObjectPrototypeGetProto(node); |
| 776 case Builtins::kObjectPrototypeIsPrototypeOf: |
| 777 return ReduceObjectPrototypeIsPrototypeOf(node); |
| 744 case Builtins::kReflectGetPrototypeOf: | 778 case Builtins::kReflectGetPrototypeOf: |
| 745 return ReduceReflectGetPrototypeOf(node); | 779 return ReduceReflectGetPrototypeOf(node); |
| 746 case Builtins::kArrayForEach: | 780 case Builtins::kArrayForEach: |
| 747 return ReduceArrayForEach(function, node); | 781 return ReduceArrayForEach(function, node); |
| 748 default: | 782 default: |
| 749 break; | 783 break; |
| 750 } | 784 } |
| 751 | 785 |
| 752 // Check for the Array constructor. | 786 // Check for the Array constructor. |
| 753 if (*function == function->native_context()->array_function()) { | 787 if (*function == function->native_context()->array_function()) { |
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1021 return jsgraph()->javascript(); | 1055 return jsgraph()->javascript(); |
| 1022 } | 1056 } |
| 1023 | 1057 |
| 1024 SimplifiedOperatorBuilder* JSCallReducer::simplified() const { | 1058 SimplifiedOperatorBuilder* JSCallReducer::simplified() const { |
| 1025 return jsgraph()->simplified(); | 1059 return jsgraph()->simplified(); |
| 1026 } | 1060 } |
| 1027 | 1061 |
| 1028 } // namespace compiler | 1062 } // namespace compiler |
| 1029 } // namespace internal | 1063 } // namespace internal |
| 1030 } // namespace v8 | 1064 } // namespace v8 |
| OLD | NEW |