OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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-create-lowering.h" | 5 #include "src/compiler/js-create-lowering.h" |
6 | 6 |
7 #include "src/allocation-site-scopes.h" | 7 #include "src/allocation-site-scopes.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 580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
591 a.Store(AccessBuilder::ForJSArrayLength(elements_kind), length); | 591 a.Store(AccessBuilder::ForJSArrayLength(elements_kind), length); |
592 RelaxControls(node); | 592 RelaxControls(node); |
593 a.FinishAndChange(node); | 593 a.FinishAndChange(node); |
594 return Changed(node); | 594 return Changed(node); |
595 } | 595 } |
596 | 596 |
597 Reduction JSCreateLowering::ReduceNewArrayToStubCall( | 597 Reduction JSCreateLowering::ReduceNewArrayToStubCall( |
598 Node* node, Handle<AllocationSite> site) { | 598 Node* node, Handle<AllocationSite> site) { |
599 CreateArrayParameters const& p = CreateArrayParametersOf(node->op()); | 599 CreateArrayParameters const& p = CreateArrayParametersOf(node->op()); |
600 int const arity = static_cast<int>(p.arity()); | 600 int const arity = static_cast<int>(p.arity()); |
| 601 Node* target = NodeProperties::GetValueInput(node, 0); |
| 602 Node* new_target = NodeProperties::GetValueInput(node, 1); |
| 603 Type* new_target_type = NodeProperties::GetType(new_target); |
601 | 604 |
602 ElementsKind elements_kind = site->GetElementsKind(); | 605 ElementsKind elements_kind = site->GetElementsKind(); |
603 AllocationSiteOverrideMode override_mode = | 606 AllocationSiteOverrideMode override_mode = |
604 (AllocationSite::GetMode(elements_kind) == TRACK_ALLOCATION_SITE) | 607 (AllocationSite::GetMode(elements_kind) == TRACK_ALLOCATION_SITE) |
605 ? DISABLE_ALLOCATION_SITES | 608 ? DISABLE_ALLOCATION_SITES |
606 : DONT_OVERRIDE; | 609 : DONT_OVERRIDE; |
607 | 610 |
| 611 // The Array constructor can only trigger an observable side-effect |
| 612 // if the new.target may be a proxy. |
| 613 Operator::Properties const properties = |
| 614 (new_target != target || new_target_type->Maybe(Type::Proxy())) |
| 615 ? Operator::kNoDeopt |
| 616 : Operator::kNoDeopt | Operator::kNoWrite; |
| 617 |
608 if (arity == 0) { | 618 if (arity == 0) { |
609 ArrayNoArgumentConstructorStub stub(isolate(), elements_kind, | 619 ArrayNoArgumentConstructorStub stub(isolate(), elements_kind, |
610 override_mode); | 620 override_mode); |
611 CallDescriptor* desc = Linkage::GetStubCallDescriptor( | 621 CallDescriptor* desc = Linkage::GetStubCallDescriptor( |
612 isolate(), graph()->zone(), stub.GetCallInterfaceDescriptor(), 1, | 622 isolate(), graph()->zone(), stub.GetCallInterfaceDescriptor(), 1, |
613 CallDescriptor::kNeedsFrameState); | 623 CallDescriptor::kNeedsFrameState, properties); |
614 node->ReplaceInput(0, jsgraph()->HeapConstant(stub.GetCode())); | 624 node->ReplaceInput(0, jsgraph()->HeapConstant(stub.GetCode())); |
615 node->InsertInput(graph()->zone(), 2, jsgraph()->HeapConstant(site)); | 625 node->InsertInput(graph()->zone(), 2, jsgraph()->HeapConstant(site)); |
616 node->InsertInput(graph()->zone(), 3, jsgraph()->Constant(0)); | 626 node->InsertInput(graph()->zone(), 3, jsgraph()->Constant(0)); |
617 node->InsertInput(graph()->zone(), 4, jsgraph()->UndefinedConstant()); | 627 node->InsertInput(graph()->zone(), 4, jsgraph()->UndefinedConstant()); |
618 NodeProperties::ChangeOp(node, common()->Call(desc)); | 628 NodeProperties::ChangeOp(node, common()->Call(desc)); |
619 return Changed(node); | 629 return Changed(node); |
620 } else if (arity == 1) { | 630 } else if (arity == 1) { |
621 AllocationSiteOverrideMode override_mode = | 631 AllocationSiteOverrideMode override_mode = |
622 (AllocationSite::GetMode(elements_kind) == TRACK_ALLOCATION_SITE) | 632 (AllocationSite::GetMode(elements_kind) == TRACK_ALLOCATION_SITE) |
623 ? DISABLE_ALLOCATION_SITES | 633 ? DISABLE_ALLOCATION_SITES |
624 : DONT_OVERRIDE; | 634 : DONT_OVERRIDE; |
625 | 635 |
626 if (IsHoleyElementsKind(elements_kind)) { | 636 if (IsHoleyElementsKind(elements_kind)) { |
627 ArraySingleArgumentConstructorStub stub(isolate(), elements_kind, | 637 ArraySingleArgumentConstructorStub stub(isolate(), elements_kind, |
628 override_mode); | 638 override_mode); |
629 CallDescriptor* desc = Linkage::GetStubCallDescriptor( | 639 CallDescriptor* desc = Linkage::GetStubCallDescriptor( |
630 isolate(), graph()->zone(), stub.GetCallInterfaceDescriptor(), 2, | 640 isolate(), graph()->zone(), stub.GetCallInterfaceDescriptor(), 2, |
631 CallDescriptor::kNeedsFrameState); | 641 CallDescriptor::kNeedsFrameState, properties); |
632 node->ReplaceInput(0, jsgraph()->HeapConstant(stub.GetCode())); | 642 node->ReplaceInput(0, jsgraph()->HeapConstant(stub.GetCode())); |
633 node->InsertInput(graph()->zone(), 2, jsgraph()->HeapConstant(site)); | 643 node->InsertInput(graph()->zone(), 2, jsgraph()->HeapConstant(site)); |
634 node->InsertInput(graph()->zone(), 3, jsgraph()->Constant(1)); | 644 node->InsertInput(graph()->zone(), 3, jsgraph()->Constant(1)); |
635 node->InsertInput(graph()->zone(), 4, jsgraph()->UndefinedConstant()); | 645 node->InsertInput(graph()->zone(), 4, jsgraph()->UndefinedConstant()); |
636 NodeProperties::ChangeOp(node, common()->Call(desc)); | 646 NodeProperties::ChangeOp(node, common()->Call(desc)); |
637 return Changed(node); | 647 return Changed(node); |
638 } | 648 } |
639 | 649 |
640 Node* effect = NodeProperties::GetEffectInput(node); | 650 Node* effect = NodeProperties::GetEffectInput(node); |
641 Node* control = NodeProperties::GetControlInput(node); | 651 Node* control = NodeProperties::GetControlInput(node); |
642 Node* length = NodeProperties::GetValueInput(node, 2); | 652 Node* length = NodeProperties::GetValueInput(node, 2); |
643 Node* equal = graph()->NewNode(simplified()->ReferenceEqual(), length, | 653 Node* equal = graph()->NewNode(simplified()->ReferenceEqual(), length, |
644 jsgraph()->ZeroConstant()); | 654 jsgraph()->ZeroConstant()); |
645 | 655 |
646 Node* branch = | 656 Node* branch = |
647 graph()->NewNode(common()->Branch(BranchHint::kFalse), equal, control); | 657 graph()->NewNode(common()->Branch(BranchHint::kFalse), equal, control); |
648 Node* call_holey; | 658 Node* call_holey; |
649 Node* call_packed; | 659 Node* call_packed; |
650 Node* context = NodeProperties::GetContextInput(node); | 660 Node* context = NodeProperties::GetContextInput(node); |
651 Node* frame_state = NodeProperties::GetFrameStateInput(node); | 661 Node* frame_state = NodeProperties::GetFrameStateInput(node); |
652 Node* if_equal = graph()->NewNode(common()->IfTrue(), branch); | 662 Node* if_equal = graph()->NewNode(common()->IfTrue(), branch); |
653 { | 663 { |
654 ArraySingleArgumentConstructorStub stub(isolate(), elements_kind, | 664 ArraySingleArgumentConstructorStub stub(isolate(), elements_kind, |
655 override_mode); | 665 override_mode); |
656 CallDescriptor* desc = Linkage::GetStubCallDescriptor( | 666 CallDescriptor* desc = Linkage::GetStubCallDescriptor( |
657 isolate(), graph()->zone(), stub.GetCallInterfaceDescriptor(), 2, | 667 isolate(), graph()->zone(), stub.GetCallInterfaceDescriptor(), 2, |
658 CallDescriptor::kNeedsFrameState); | 668 CallDescriptor::kNeedsFrameState, properties); |
659 | 669 |
660 Node* inputs[] = {jsgraph()->HeapConstant(stub.GetCode()), | 670 Node* inputs[] = {jsgraph()->HeapConstant(stub.GetCode()), |
661 node->InputAt(1), | 671 node->InputAt(1), |
662 jsgraph()->HeapConstant(site), | 672 jsgraph()->HeapConstant(site), |
663 jsgraph()->Constant(1), | 673 jsgraph()->Constant(1), |
664 jsgraph()->UndefinedConstant(), | 674 jsgraph()->UndefinedConstant(), |
665 length, | 675 length, |
666 context, | 676 context, |
667 frame_state, | 677 frame_state, |
668 effect, | 678 effect, |
669 if_equal}; | 679 if_equal}; |
670 | 680 |
671 call_holey = | 681 call_holey = |
672 graph()->NewNode(common()->Call(desc), arraysize(inputs), inputs); | 682 graph()->NewNode(common()->Call(desc), arraysize(inputs), inputs); |
673 } | 683 } |
674 Node* if_not_equal = graph()->NewNode(common()->IfFalse(), branch); | 684 Node* if_not_equal = graph()->NewNode(common()->IfFalse(), branch); |
675 { | 685 { |
676 // Require elements kind to "go holey." | 686 // Require elements kind to "go holey." |
677 ArraySingleArgumentConstructorStub stub( | 687 ArraySingleArgumentConstructorStub stub( |
678 isolate(), GetHoleyElementsKind(elements_kind), override_mode); | 688 isolate(), GetHoleyElementsKind(elements_kind), override_mode); |
679 CallDescriptor* desc = Linkage::GetStubCallDescriptor( | 689 CallDescriptor* desc = Linkage::GetStubCallDescriptor( |
680 isolate(), graph()->zone(), stub.GetCallInterfaceDescriptor(), 2, | 690 isolate(), graph()->zone(), stub.GetCallInterfaceDescriptor(), 2, |
681 CallDescriptor::kNeedsFrameState); | 691 CallDescriptor::kNeedsFrameState, properties); |
682 | 692 |
683 Node* inputs[] = {jsgraph()->HeapConstant(stub.GetCode()), | 693 Node* inputs[] = {jsgraph()->HeapConstant(stub.GetCode()), |
684 node->InputAt(1), | 694 node->InputAt(1), |
685 jsgraph()->HeapConstant(site), | 695 jsgraph()->HeapConstant(site), |
686 jsgraph()->Constant(1), | 696 jsgraph()->Constant(1), |
687 jsgraph()->UndefinedConstant(), | 697 jsgraph()->UndefinedConstant(), |
688 length, | 698 length, |
689 context, | 699 context, |
690 frame_state, | 700 frame_state, |
691 effect, | 701 effect, |
(...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1335 return jsgraph()->simplified(); | 1345 return jsgraph()->simplified(); |
1336 } | 1346 } |
1337 | 1347 |
1338 MachineOperatorBuilder* JSCreateLowering::machine() const { | 1348 MachineOperatorBuilder* JSCreateLowering::machine() const { |
1339 return jsgraph()->machine(); | 1349 return jsgraph()->machine(); |
1340 } | 1350 } |
1341 | 1351 |
1342 } // namespace compiler | 1352 } // namespace compiler |
1343 } // namespace internal | 1353 } // namespace internal |
1344 } // namespace v8 | 1354 } // namespace v8 |
OLD | NEW |