OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/code-stubs.h" | 5 #include "src/code-stubs.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
(...skipping 3605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3616 &if_keyisinvalid); | 3616 &if_keyisinvalid); |
3617 assembler->Bind(&if_keyispositivesmi); | 3617 assembler->Bind(&if_keyispositivesmi); |
3618 assembler->TailCallRuntime(Runtime::kLoadElementWithInterceptor, context, | 3618 assembler->TailCallRuntime(Runtime::kLoadElementWithInterceptor, context, |
3619 receiver, key); | 3619 receiver, key); |
3620 | 3620 |
3621 assembler->Bind(&if_keyisinvalid); | 3621 assembler->Bind(&if_keyisinvalid); |
3622 assembler->TailCallRuntime(Runtime::kKeyedLoadIC_Miss, context, receiver, key, | 3622 assembler->TailCallRuntime(Runtime::kKeyedLoadIC_Miss, context, receiver, key, |
3623 slot, vector); | 3623 slot, vector); |
3624 } | 3624 } |
3625 | 3625 |
3626 void FastCloneShallowObjectStub::GenerateAssembly( | |
3627 compiler::CodeStubAssembler* assembler) const { | |
3628 typedef compiler::CodeStubAssembler::Label Label; | |
3629 typedef compiler::Node Node; | |
3630 Label call_runtime(assembler); | |
3631 Node* closure = assembler->Parameter(0); | |
3632 Node* literals_index = assembler->Parameter(1); | |
3633 | |
3634 Node* undefined = assembler->UndefinedConstant(); | |
3635 Node* literals_array = | |
3636 assembler->LoadObjectField(closure, JSFunction::kLiteralsOffset); | |
3637 Node* allocation_site = assembler->LoadFixedArrayElementSmiIndex( | |
3638 literals_array, literals_index, | |
3639 LiteralsArray::kFirstLiteralIndex * kPointerSize); | |
3640 assembler->GotoIf(assembler->WordEqual(allocation_site, undefined), | |
3641 &call_runtime); | |
3642 | |
3643 Node* boilerplate = assembler->LoadObjectField( | |
3644 allocation_site, AllocationSite::kTransitionInfoOffset); | |
3645 | |
3646 int length = this->length(); | |
3647 if (length == 0) { | |
3648 length = JSObject::kInitialGlobalObjectUnusedPropertiesCount; | |
3649 } | |
3650 int size = JSObject::kHeaderSize + length * kPointerSize; | |
3651 int object_size = size; | |
3652 if (FLAG_allocation_site_pretenuring) { | |
3653 size += AllocationMemento::kSize; | |
3654 } | |
3655 | |
3656 Node* boilerplate_map = assembler->LoadMap(boilerplate); | |
3657 Node* instance_size = assembler->LoadMapInstanceSize(boilerplate_map); | |
3658 Node* size_in_words = | |
3659 assembler->Int32Constant(object_size >> kPointerSizeLog2); | |
3660 assembler->GotoUnless(assembler->Word32Equal(instance_size, size_in_words), | |
3661 &call_runtime); | |
3662 | |
3663 Node* copy = assembler->Allocate(size); | |
3664 | |
3665 for (int i = 0; i < size; i += kPointerSize) { | |
Jakob Kummerow
2016/04/15 17:20:55
This should be "i < object_size"! Otherwise we'll
| |
3666 // The Allocate above guarantees that the copy lies in new space. This | |
3667 // allows us to skip write barriers. This is necessary since we may also be | |
3668 // copying unboxed doubles. | |
3669 Node* field = | |
3670 assembler->LoadObjectField(boilerplate, i, MachineType::IntPtr()); | |
3671 assembler->StoreObjectFieldNoWriteBarrier( | |
3672 copy, i, field, MachineType::PointerRepresentation()); | |
3673 } | |
3674 | |
3675 if (FLAG_allocation_site_pretenuring) { | |
3676 Node* memento = assembler->InnerAllocate(copy, object_size); | |
3677 assembler->StoreObjectFieldNoWriteBarrier( | |
3678 memento, HeapObject::kMapOffset, | |
3679 assembler->LoadRoot(Heap::kAllocationMementoMapRootIndex)); | |
3680 assembler->StoreObjectFieldNoWriteBarrier( | |
3681 memento, AllocationMemento::kAllocationSiteOffset, allocation_site); | |
3682 Node* memento_create_count = assembler->LoadObjectField( | |
3683 allocation_site, AllocationSite::kPretenureCreateCountOffset); | |
3684 memento_create_count = assembler->SmiAdd( | |
3685 memento_create_count, assembler->SmiConstant(Smi::FromInt(1))); | |
3686 assembler->StoreObjectFieldNoWriteBarrier( | |
3687 allocation_site, AllocationSite::kPretenureCreateCountOffset, | |
3688 memento_create_count); | |
3689 } | |
3690 | |
3691 // TODO(verwaest): Allocate and fill in double boxes. | |
3692 assembler->Return(copy); | |
3693 | |
3694 assembler->Bind(&call_runtime); | |
3695 Node* constant_properties = assembler->Parameter(2); | |
3696 Node* flags = assembler->Parameter(3); | |
3697 Node* context = assembler->Parameter(4); | |
3698 assembler->TailCallRuntime(Runtime::kCreateObjectLiteral, context, closure, | |
3699 literals_index, constant_properties, flags); | |
3700 } | |
3701 | |
3626 template<class StateType> | 3702 template<class StateType> |
3627 void HydrogenCodeStub::TraceTransition(StateType from, StateType to) { | 3703 void HydrogenCodeStub::TraceTransition(StateType from, StateType to) { |
3628 // Note: Although a no-op transition is semantically OK, it is hinting at a | 3704 // Note: Although a no-op transition is semantically OK, it is hinting at a |
3629 // bug somewhere in our state transition machinery. | 3705 // bug somewhere in our state transition machinery. |
3630 DCHECK(from != to); | 3706 DCHECK(from != to); |
3631 if (!FLAG_trace_ic) return; | 3707 if (!FLAG_trace_ic) return; |
3632 OFStream os(stdout); | 3708 OFStream os(stdout); |
3633 os << "["; | 3709 os << "["; |
3634 PrintBaseName(os); | 3710 PrintBaseName(os); |
3635 os << ": " << from << "=>" << to << "]" << std::endl; | 3711 os << ": " << from << "=>" << to << "]" << std::endl; |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3758 | 3834 |
3759 | 3835 |
3760 void FastCloneShallowArrayStub::InitializeDescriptor( | 3836 void FastCloneShallowArrayStub::InitializeDescriptor( |
3761 CodeStubDescriptor* descriptor) { | 3837 CodeStubDescriptor* descriptor) { |
3762 FastCloneShallowArrayDescriptor call_descriptor(isolate()); | 3838 FastCloneShallowArrayDescriptor call_descriptor(isolate()); |
3763 descriptor->Initialize( | 3839 descriptor->Initialize( |
3764 Runtime::FunctionForId(Runtime::kCreateArrayLiteralStubBailout)->entry); | 3840 Runtime::FunctionForId(Runtime::kCreateArrayLiteralStubBailout)->entry); |
3765 } | 3841 } |
3766 | 3842 |
3767 | 3843 |
3768 void FastCloneShallowObjectStub::InitializeDescriptor( | |
3769 CodeStubDescriptor* descriptor) { | |
3770 FastCloneShallowObjectDescriptor call_descriptor(isolate()); | |
3771 descriptor->Initialize( | |
3772 Runtime::FunctionForId(Runtime::kCreateObjectLiteral)->entry); | |
3773 } | |
3774 | |
3775 | |
3776 void CreateAllocationSiteStub::InitializeDescriptor(CodeStubDescriptor* d) {} | 3844 void CreateAllocationSiteStub::InitializeDescriptor(CodeStubDescriptor* d) {} |
3777 | 3845 |
3778 | 3846 |
3779 void CreateWeakCellStub::InitializeDescriptor(CodeStubDescriptor* d) {} | 3847 void CreateWeakCellStub::InitializeDescriptor(CodeStubDescriptor* d) {} |
3780 | 3848 |
3781 | 3849 |
3782 void RegExpConstructResultStub::InitializeDescriptor( | 3850 void RegExpConstructResultStub::InitializeDescriptor( |
3783 CodeStubDescriptor* descriptor) { | 3851 CodeStubDescriptor* descriptor) { |
3784 descriptor->Initialize( | 3852 descriptor->Initialize( |
3785 Runtime::FunctionForId(Runtime::kRegExpConstructResult)->entry); | 3853 Runtime::FunctionForId(Runtime::kRegExpConstructResult)->entry); |
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4054 if (type->Is(Type::UntaggedPointer())) { | 4122 if (type->Is(Type::UntaggedPointer())) { |
4055 return Representation::External(); | 4123 return Representation::External(); |
4056 } | 4124 } |
4057 | 4125 |
4058 DCHECK(!type->Is(Type::Untagged())); | 4126 DCHECK(!type->Is(Type::Untagged())); |
4059 return Representation::Tagged(); | 4127 return Representation::Tagged(); |
4060 } | 4128 } |
4061 | 4129 |
4062 } // namespace internal | 4130 } // namespace internal |
4063 } // namespace v8 | 4131 } // namespace v8 |
OLD | NEW |