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/builtins/builtins-constructor.h" | 5 #include "src/builtins/builtins-constructor.h" |
6 #include "src/ast/ast.h" | 6 #include "src/ast/ast.h" |
7 #include "src/builtins/builtins-utils.h" | 7 #include "src/builtins/builtins-utils.h" |
8 #include "src/builtins/builtins.h" | 8 #include "src/builtins/builtins.h" |
9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
10 #include "src/code-stub-assembler.h" | 10 #include "src/code-stub-assembler.h" |
(...skipping 696 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
707 Node* field = Load(MachineType::IntPtr(), boilerplate, offset.value()); | 707 Node* field = Load(MachineType::IntPtr(), boilerplate, offset.value()); |
708 StoreNoWriteBarrier(MachineType::PointerRepresentation(), copy, | 708 StoreNoWriteBarrier(MachineType::PointerRepresentation(), copy, |
709 offset.value(), field); | 709 offset.value(), field); |
710 Goto(&loop_check); | 710 Goto(&loop_check); |
711 } | 711 } |
712 Bind(&loop_check); | 712 Bind(&loop_check); |
713 { | 713 { |
714 offset.Bind(IntPtrAdd(offset.value(), IntPtrConstant(kPointerSize))); | 714 offset.Bind(IntPtrAdd(offset.value(), IntPtrConstant(kPointerSize))); |
715 GotoIfNot(IntPtrGreaterThanOrEqual(offset.value(), end_offset), &loop_body); | 715 GotoIfNot(IntPtrGreaterThanOrEqual(offset.value(), end_offset), &loop_body); |
716 } | 716 } |
717 | |
718 if (FLAG_allocation_site_pretenuring) { | 717 if (FLAG_allocation_site_pretenuring) { |
719 Node* memento = InnerAllocate(copy, object_size); | 718 Node* memento = InnerAllocate(copy, object_size); |
720 StoreMapNoWriteBarrier(memento, Heap::kAllocationMementoMapRootIndex); | 719 StoreMapNoWriteBarrier(memento, Heap::kAllocationMementoMapRootIndex); |
721 StoreObjectFieldNoWriteBarrier( | 720 StoreObjectFieldNoWriteBarrier( |
722 memento, AllocationMemento::kAllocationSiteOffset, allocation_site); | 721 memento, AllocationMemento::kAllocationSiteOffset, allocation_site); |
723 Node* memento_create_count = LoadObjectField( | 722 Node* memento_create_count = LoadObjectField( |
724 allocation_site, AllocationSite::kPretenureCreateCountOffset); | 723 allocation_site, AllocationSite::kPretenureCreateCountOffset); |
725 memento_create_count = | 724 memento_create_count = |
726 SmiAdd(memento_create_count, SmiConstant(Smi::FromInt(1))); | 725 SmiAdd(memento_create_count, SmiConstant(Smi::FromInt(1))); |
727 StoreObjectFieldNoWriteBarrier(allocation_site, | 726 StoreObjectFieldNoWriteBarrier(allocation_site, |
728 AllocationSite::kPretenureCreateCountOffset, | 727 AllocationSite::kPretenureCreateCountOffset, |
729 memento_create_count); | 728 memento_create_count); |
730 } | 729 } |
731 | 730 |
731 // Directly copy over the property store for dict-mode boilerplates. | |
732 Label dict_properties(this), done(this); | |
733 Branch(IsDictionaryMap(boilerplate_map), &dict_properties, &done); | |
734 Bind(&dict_properties); | |
735 { | |
736 Comment("Copy boilderplate property dict"); | |
737 Node* boilerplate_properties = LoadProperties(boilerplate); | |
738 // TODO(cbruni): Use inner allocate for name dictionary | |
739 Node* properties = AllocateNameDictionary( | |
740 SmiUntag(GetCapacity<NameDictionary>(boilerplate_properties))); | |
741 CopyFixedArrayElements(FAST_ELEMENTS, boilerplate_properties, properties, | |
742 LoadFixedArrayBaseLength(boilerplate_properties), | |
743 SKIP_WRITE_BARRIER, SMI_PARAMETERS); | |
Toon Verwaest
2017/03/14 13:27:47
With black allocation I'm not sure this is safe if
Camillo Bruni
2017/03/17 16:40:55
Adding separate helper to make the contract cleare
| |
744 StoreObjectField(copy, JSObject::kPropertiesOffset, properties); | |
745 Goto(&done); | |
746 } | |
747 Bind(&done); | |
748 | |
732 // TODO(verwaest): Allocate and fill in double boxes. | 749 // TODO(verwaest): Allocate and fill in double boxes. |
733 return copy; | 750 return copy; |
734 } | 751 } |
735 | 752 |
736 void ConstructorBuiltinsAssembler::CreateFastCloneShallowObjectBuiltin( | 753 void ConstructorBuiltinsAssembler::CreateFastCloneShallowObjectBuiltin( |
737 int properties_count) { | 754 int properties_count) { |
738 DCHECK_GE(properties_count, 0); | 755 DCHECK_GE(properties_count, 0); |
739 DCHECK_LE(properties_count, kMaximumClonedShallowObjectProperties); | 756 DCHECK_LE(properties_count, kMaximumClonedShallowObjectProperties); |
740 Label call_runtime(this); | 757 Label call_runtime(this); |
741 Node* closure = Parameter(0); | 758 Node* closure = Parameter(0); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
785 case 6: | 802 case 6: |
786 return FastCloneShallowObject6(); | 803 return FastCloneShallowObject6(); |
787 default: | 804 default: |
788 UNREACHABLE(); | 805 UNREACHABLE(); |
789 } | 806 } |
790 return Handle<Code>::null(); | 807 return Handle<Code>::null(); |
791 } | 808 } |
792 | 809 |
793 } // namespace internal | 810 } // namespace internal |
794 } // namespace v8 | 811 } // namespace v8 |
OLD | NEW |