Chromium Code Reviews| 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/ast/ast.h" | 5 #include "src/ast/ast.h" |
| 6 #include "src/builtins/builtins-constructor.h" | 6 #include "src/builtins/builtins-constructor.h" |
| 7 #include "src/builtins/builtins-utils-gen.h" | 7 #include "src/builtins/builtins-utils-gen.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 626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 637 | 637 |
| 638 Node* ConstructorBuiltinsAssembler::EmitFastCloneShallowObject( | 638 Node* ConstructorBuiltinsAssembler::EmitFastCloneShallowObject( |
| 639 Label* call_runtime, Node* closure, Node* literals_index, | 639 Label* call_runtime, Node* closure, Node* literals_index, |
| 640 Node* properties_count) { | 640 Node* properties_count) { |
| 641 Node* cell = LoadObjectField(closure, JSFunction::kFeedbackVectorOffset); | 641 Node* cell = LoadObjectField(closure, JSFunction::kFeedbackVectorOffset); |
| 642 Node* feedback_vector = LoadObjectField(cell, Cell::kValueOffset); | 642 Node* feedback_vector = LoadObjectField(cell, Cell::kValueOffset); |
| 643 Node* allocation_site = LoadFixedArrayElement( | 643 Node* allocation_site = LoadFixedArrayElement( |
| 644 feedback_vector, literals_index, 0, CodeStubAssembler::SMI_PARAMETERS); | 644 feedback_vector, literals_index, 0, CodeStubAssembler::SMI_PARAMETERS); |
| 645 GotoIf(IsUndefined(allocation_site), call_runtime); | 645 GotoIf(IsUndefined(allocation_site), call_runtime); |
| 646 | 646 |
| 647 Node* boilerplate = | |
| 648 LoadObjectField(allocation_site, AllocationSite::kTransitionInfoOffset); | |
| 649 Node* boilerplate_map = LoadMap(boilerplate); | |
| 650 Variable properties(this, MachineRepresentation::kTagged, | |
| 651 EmptyFixedArrayConstant()); | |
| 652 // Directly copy over the property store for dict-mode boilerplates. | |
| 653 Label dict_properties(this), allocate_object(this); | |
| 654 Branch(IsDictionaryMap(boilerplate_map), &dict_properties, &allocate_object); | |
| 655 Bind(&dict_properties); | |
| 656 { | |
| 657 properties.Bind( | |
| 658 CopyNameDictionary(LoadProperties(boilerplate), call_runtime)); | |
| 659 Goto(&allocate_object); | |
| 660 } | |
| 661 Bind(&allocate_object); | |
| 662 | |
| 647 // Calculate the object and allocation size based on the properties count. | 663 // Calculate the object and allocation size based on the properties count. |
| 648 Node* object_size = IntPtrAdd(WordShl(properties_count, kPointerSizeLog2), | 664 Node* object_size = IntPtrAdd(WordShl(properties_count, kPointerSizeLog2), |
| 649 IntPtrConstant(JSObject::kHeaderSize)); | 665 IntPtrConstant(JSObject::kHeaderSize)); |
| 650 Node* allocation_size = object_size; | 666 Node* allocation_size = object_size; |
| 651 if (FLAG_allocation_site_pretenuring) { | 667 if (FLAG_allocation_site_pretenuring) { |
| 652 allocation_size = | 668 allocation_size = |
| 653 IntPtrAdd(object_size, IntPtrConstant(AllocationMemento::kSize)); | 669 IntPtrAdd(object_size, IntPtrConstant(AllocationMemento::kSize)); |
| 654 } | 670 } |
| 655 Node* boilerplate = | 671 |
| 656 LoadObjectField(allocation_site, AllocationSite::kTransitionInfoOffset); | |
| 657 Node* boilerplate_map = LoadMap(boilerplate); | |
| 658 Node* instance_size = LoadMapInstanceSize(boilerplate_map); | 672 Node* instance_size = LoadMapInstanceSize(boilerplate_map); |
| 659 Node* size_in_words = WordShr(object_size, kPointerSizeLog2); | 673 Node* size_in_words = WordShr(object_size, kPointerSizeLog2); |
| 660 GotoIfNot(WordEqual(instance_size, size_in_words), call_runtime); | 674 GotoIfNot(WordEqual(instance_size, size_in_words), call_runtime); |
| 661 | 675 |
| 662 Node* copy = AllocateInNewSpace(allocation_size); | 676 Node* copy = AllocateInNewSpace(allocation_size); |
| 663 | 677 |
| 678 StoreObjectFieldNoWriteBarrier(copy, JSObject::kPropertiesOffset, | |
| 679 properties.value()); | |
|
Toon Verwaest
2017/03/20 14:47:11
Isn't this field overwritten by the initialization
| |
| 664 // Copy boilerplate elements. | 680 // Copy boilerplate elements. |
| 665 Variable offset(this, MachineType::PointerRepresentation()); | 681 Variable offset(this, MachineType::PointerRepresentation()); |
| 666 offset.Bind(IntPtrConstant(-kHeapObjectTag)); | 682 offset.Bind(IntPtrConstant(-kHeapObjectTag)); |
| 667 Node* end_offset = IntPtrAdd(object_size, offset.value()); | 683 Node* end_offset = IntPtrAdd(object_size, offset.value()); |
| 668 Label loop_body(this, &offset), loop_check(this, &offset); | 684 Label loop_body(this, &offset), loop_check(this, &offset); |
| 669 // We should always have an object size greater than zero. | 685 // We should always have an object size greater than zero. |
| 670 Goto(&loop_body); | 686 Goto(&loop_body); |
| 671 Bind(&loop_body); | 687 Bind(&loop_body); |
| 672 { | 688 { |
| 673 // The Allocate above guarantees that the copy lies in new space. This | 689 // The Allocate above guarantees that the copy lies in new space. This |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 732 SHALLOW_OBJECT_BUILTIN(0); | 748 SHALLOW_OBJECT_BUILTIN(0); |
| 733 SHALLOW_OBJECT_BUILTIN(1); | 749 SHALLOW_OBJECT_BUILTIN(1); |
| 734 SHALLOW_OBJECT_BUILTIN(2); | 750 SHALLOW_OBJECT_BUILTIN(2); |
| 735 SHALLOW_OBJECT_BUILTIN(3); | 751 SHALLOW_OBJECT_BUILTIN(3); |
| 736 SHALLOW_OBJECT_BUILTIN(4); | 752 SHALLOW_OBJECT_BUILTIN(4); |
| 737 SHALLOW_OBJECT_BUILTIN(5); | 753 SHALLOW_OBJECT_BUILTIN(5); |
| 738 SHALLOW_OBJECT_BUILTIN(6); | 754 SHALLOW_OBJECT_BUILTIN(6); |
| 739 | 755 |
| 740 } // namespace internal | 756 } // namespace internal |
| 741 } // namespace v8 | 757 } // namespace v8 |
| OLD | NEW |