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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/api.h" | 8 #include "src/api.h" |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/base/once.h" | 10 #include "src/base/once.h" |
(...skipping 2482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2493 | 2493 |
2494 static inline void EvacuateFixedTypedArray(Map* map, HeapObject** slot, | 2494 static inline void EvacuateFixedTypedArray(Map* map, HeapObject** slot, |
2495 HeapObject* object) { | 2495 HeapObject* object) { |
2496 int object_size = reinterpret_cast<FixedTypedArrayBase*>(object)->size(); | 2496 int object_size = reinterpret_cast<FixedTypedArrayBase*>(object)->size(); |
2497 EvacuateObject<DATA_OBJECT, kWordAligned>(map, slot, object, object_size); | 2497 EvacuateObject<DATA_OBJECT, kWordAligned>(map, slot, object, object_size); |
2498 | 2498 |
2499 MapWord map_word = object->map_word(); | 2499 MapWord map_word = object->map_word(); |
2500 DCHECK(map_word.IsForwardingAddress()); | 2500 DCHECK(map_word.IsForwardingAddress()); |
2501 FixedTypedArrayBase* target = | 2501 FixedTypedArrayBase* target = |
2502 reinterpret_cast<FixedTypedArrayBase*>(map_word.ToForwardingAddress()); | 2502 reinterpret_cast<FixedTypedArrayBase*>(map_word.ToForwardingAddress()); |
2503 target->set_base_pointer(target, SKIP_WRITE_BARRIER); | 2503 if (target->base_pointer() != Smi::FromInt(0)) |
| 2504 target->set_base_pointer(target, SKIP_WRITE_BARRIER); |
2504 } | 2505 } |
2505 | 2506 |
2506 | 2507 |
2507 static inline void EvacuateFixedFloat64Array(Map* map, HeapObject** slot, | 2508 static inline void EvacuateFixedFloat64Array(Map* map, HeapObject** slot, |
2508 HeapObject* object) { | 2509 HeapObject* object) { |
2509 int object_size = reinterpret_cast<FixedFloat64Array*>(object)->size(); | 2510 int object_size = reinterpret_cast<FixedFloat64Array*>(object)->size(); |
2510 EvacuateObject<DATA_OBJECT, kDoubleAligned>(map, slot, object, object_size); | 2511 EvacuateObject<DATA_OBJECT, kDoubleAligned>(map, slot, object, object_size); |
2511 | 2512 |
2512 MapWord map_word = object->map_word(); | 2513 MapWord map_word = object->map_word(); |
2513 DCHECK(map_word.IsForwardingAddress()); | 2514 DCHECK(map_word.IsForwardingAddress()); |
2514 FixedTypedArrayBase* target = | 2515 FixedTypedArrayBase* target = |
2515 reinterpret_cast<FixedTypedArrayBase*>(map_word.ToForwardingAddress()); | 2516 reinterpret_cast<FixedTypedArrayBase*>(map_word.ToForwardingAddress()); |
2516 target->set_base_pointer(target, SKIP_WRITE_BARRIER); | 2517 if (target->base_pointer() != Smi::FromInt(0)) |
| 2518 target->set_base_pointer(target, SKIP_WRITE_BARRIER); |
2517 } | 2519 } |
2518 | 2520 |
2519 | 2521 |
2520 static inline void EvacuateJSArrayBuffer(Map* map, HeapObject** slot, | 2522 static inline void EvacuateJSArrayBuffer(Map* map, HeapObject** slot, |
2521 HeapObject* object) { | 2523 HeapObject* object) { |
2522 ObjectEvacuationStrategy<POINTER_OBJECT>::Visit(map, slot, object); | 2524 ObjectEvacuationStrategy<POINTER_OBJECT>::Visit(map, slot, object); |
2523 | 2525 |
2524 Heap* heap = map->GetHeap(); | 2526 Heap* heap = map->GetHeap(); |
2525 MapWord map_word = object->map_word(); | 2527 MapWord map_word = object->map_word(); |
2526 DCHECK(map_word.IsForwardingAddress()); | 2528 DCHECK(map_word.IsForwardingAddress()); |
(...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2997 ExternalOneByteString::kSize); | 2999 ExternalOneByteString::kSize); |
2998 if (!allocation.To(&obj)) return false; | 3000 if (!allocation.To(&obj)) return false; |
2999 set_native_source_string_map(Map::cast(obj)); | 3001 set_native_source_string_map(Map::cast(obj)); |
3000 } | 3002 } |
3001 | 3003 |
3002 ALLOCATE_VARSIZE_MAP(FIXED_DOUBLE_ARRAY_TYPE, fixed_double_array) | 3004 ALLOCATE_VARSIZE_MAP(FIXED_DOUBLE_ARRAY_TYPE, fixed_double_array) |
3003 ALLOCATE_VARSIZE_MAP(BYTE_ARRAY_TYPE, byte_array) | 3005 ALLOCATE_VARSIZE_MAP(BYTE_ARRAY_TYPE, byte_array) |
3004 ALLOCATE_VARSIZE_MAP(BYTECODE_ARRAY_TYPE, bytecode_array) | 3006 ALLOCATE_VARSIZE_MAP(BYTECODE_ARRAY_TYPE, bytecode_array) |
3005 ALLOCATE_VARSIZE_MAP(FREE_SPACE_TYPE, free_space) | 3007 ALLOCATE_VARSIZE_MAP(FREE_SPACE_TYPE, free_space) |
3006 | 3008 |
3007 #define ALLOCATE_EXTERNAL_ARRAY_MAP(Type, type, TYPE, ctype, size) \ | |
3008 ALLOCATE_MAP(EXTERNAL_##TYPE##_ARRAY_TYPE, ExternalArray::kSize, \ | |
3009 external_##type##_array) | |
3010 | |
3011 TYPED_ARRAYS(ALLOCATE_EXTERNAL_ARRAY_MAP) | |
3012 #undef ALLOCATE_EXTERNAL_ARRAY_MAP | |
3013 | |
3014 #define ALLOCATE_FIXED_TYPED_ARRAY_MAP(Type, type, TYPE, ctype, size) \ | 3009 #define ALLOCATE_FIXED_TYPED_ARRAY_MAP(Type, type, TYPE, ctype, size) \ |
3015 ALLOCATE_VARSIZE_MAP(FIXED_##TYPE##_ARRAY_TYPE, fixed_##type##_array) | 3010 ALLOCATE_VARSIZE_MAP(FIXED_##TYPE##_ARRAY_TYPE, fixed_##type##_array) |
3016 | 3011 |
3017 TYPED_ARRAYS(ALLOCATE_FIXED_TYPED_ARRAY_MAP) | 3012 TYPED_ARRAYS(ALLOCATE_FIXED_TYPED_ARRAY_MAP) |
3018 #undef ALLOCATE_FIXED_TYPED_ARRAY_MAP | 3013 #undef ALLOCATE_FIXED_TYPED_ARRAY_MAP |
3019 | 3014 |
3020 ALLOCATE_VARSIZE_MAP(FIXED_ARRAY_TYPE, sloppy_arguments_elements) | 3015 ALLOCATE_VARSIZE_MAP(FIXED_ARRAY_TYPE, sloppy_arguments_elements) |
3021 | 3016 |
3022 ALLOCATE_VARSIZE_MAP(CODE_TYPE, code) | 3017 ALLOCATE_VARSIZE_MAP(CODE_TYPE, code) |
3023 | 3018 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3069 | 3064 |
3070 BytecodeArray* bytecode_array; | 3065 BytecodeArray* bytecode_array; |
3071 AllocationResult allocation = | 3066 AllocationResult allocation = |
3072 AllocateBytecodeArray(0, nullptr, kPointerSize); | 3067 AllocateBytecodeArray(0, nullptr, kPointerSize); |
3073 if (!allocation.To(&bytecode_array)) { | 3068 if (!allocation.To(&bytecode_array)) { |
3074 return false; | 3069 return false; |
3075 } | 3070 } |
3076 set_empty_bytecode_array(bytecode_array); | 3071 set_empty_bytecode_array(bytecode_array); |
3077 } | 3072 } |
3078 | 3073 |
3079 #define ALLOCATE_EMPTY_EXTERNAL_ARRAY(Type, type, TYPE, ctype, size) \ | |
3080 { \ | |
3081 ExternalArray* obj; \ | |
3082 if (!AllocateEmptyExternalArray(kExternal##Type##Array).To(&obj)) \ | |
3083 return false; \ | |
3084 set_empty_external_##type##_array(obj); \ | |
3085 } | |
3086 | |
3087 TYPED_ARRAYS(ALLOCATE_EMPTY_EXTERNAL_ARRAY) | |
3088 #undef ALLOCATE_EMPTY_EXTERNAL_ARRAY | |
3089 | |
3090 #define ALLOCATE_EMPTY_FIXED_TYPED_ARRAY(Type, type, TYPE, ctype, size) \ | 3074 #define ALLOCATE_EMPTY_FIXED_TYPED_ARRAY(Type, type, TYPE, ctype, size) \ |
3091 { \ | 3075 { \ |
3092 FixedTypedArrayBase* obj; \ | 3076 FixedTypedArrayBase* obj; \ |
3093 if (!AllocateEmptyFixedTypedArray(kExternal##Type##Array).To(&obj)) \ | 3077 if (!AllocateEmptyFixedTypedArray(kExternal##Type##Array).To(&obj)) \ |
3094 return false; \ | 3078 return false; \ |
3095 set_empty_fixed_##type##_array(obj); \ | 3079 set_empty_fixed_##type##_array(obj); \ |
3096 } | 3080 } |
3097 | 3081 |
3098 TYPED_ARRAYS(ALLOCATE_EMPTY_FIXED_TYPED_ARRAY) | 3082 TYPED_ARRAYS(ALLOCATE_EMPTY_FIXED_TYPED_ARRAY) |
3099 #undef ALLOCATE_EMPTY_FIXED_TYPED_ARRAY | 3083 #undef ALLOCATE_EMPTY_FIXED_TYPED_ARRAY |
(...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3695 // releasing an evacuation candidate due to a slots buffer overflow | 3679 // releasing an evacuation candidate due to a slots buffer overflow |
3696 // results in lost pages. | 3680 // results in lost pages. |
3697 mark_compact_collector()->RecordSlot(slot, slot, *slot, | 3681 mark_compact_collector()->RecordSlot(slot, slot, *slot, |
3698 SlotsBuffer::IGNORE_OVERFLOW); | 3682 SlotsBuffer::IGNORE_OVERFLOW); |
3699 } | 3683 } |
3700 allocation_sites_scratchpad_length_++; | 3684 allocation_sites_scratchpad_length_++; |
3701 } | 3685 } |
3702 } | 3686 } |
3703 | 3687 |
3704 | 3688 |
3705 Map* Heap::MapForExternalArrayType(ExternalArrayType array_type) { | |
3706 return Map::cast(roots_[RootIndexForExternalArrayType(array_type)]); | |
3707 } | |
3708 | |
3709 | |
3710 Heap::RootListIndex Heap::RootIndexForExternalArrayType( | |
3711 ExternalArrayType array_type) { | |
3712 switch (array_type) { | |
3713 #define ARRAY_TYPE_TO_ROOT_INDEX(Type, type, TYPE, ctype, size) \ | |
3714 case kExternal##Type##Array: \ | |
3715 return kExternal##Type##ArrayMapRootIndex; | |
3716 | |
3717 TYPED_ARRAYS(ARRAY_TYPE_TO_ROOT_INDEX) | |
3718 #undef ARRAY_TYPE_TO_ROOT_INDEX | |
3719 | |
3720 default: | |
3721 UNREACHABLE(); | |
3722 return kUndefinedValueRootIndex; | |
3723 } | |
3724 } | |
3725 | |
3726 | 3689 |
3727 Map* Heap::MapForFixedTypedArray(ExternalArrayType array_type) { | 3690 Map* Heap::MapForFixedTypedArray(ExternalArrayType array_type) { |
3728 return Map::cast(roots_[RootIndexForFixedTypedArray(array_type)]); | 3691 return Map::cast(roots_[RootIndexForFixedTypedArray(array_type)]); |
3729 } | 3692 } |
3730 | 3693 |
3731 | 3694 |
3732 Heap::RootListIndex Heap::RootIndexForFixedTypedArray( | 3695 Heap::RootListIndex Heap::RootIndexForFixedTypedArray( |
3733 ExternalArrayType array_type) { | 3696 ExternalArrayType array_type) { |
3734 switch (array_type) { | 3697 switch (array_type) { |
3735 #define ARRAY_TYPE_TO_ROOT_INDEX(Type, type, TYPE, ctype, size) \ | 3698 #define ARRAY_TYPE_TO_ROOT_INDEX(Type, type, TYPE, ctype, size) \ |
3736 case kExternal##Type##Array: \ | 3699 case kExternal##Type##Array: \ |
3737 return kFixed##Type##ArrayMapRootIndex; | 3700 return kFixed##Type##ArrayMapRootIndex; |
3738 | 3701 |
3739 TYPED_ARRAYS(ARRAY_TYPE_TO_ROOT_INDEX) | 3702 TYPED_ARRAYS(ARRAY_TYPE_TO_ROOT_INDEX) |
3740 #undef ARRAY_TYPE_TO_ROOT_INDEX | 3703 #undef ARRAY_TYPE_TO_ROOT_INDEX |
3741 | 3704 |
3742 default: | 3705 default: |
3743 UNREACHABLE(); | 3706 UNREACHABLE(); |
3744 return kUndefinedValueRootIndex; | 3707 return kUndefinedValueRootIndex; |
3745 } | 3708 } |
3746 } | 3709 } |
3747 | 3710 |
3748 | 3711 |
3749 Heap::RootListIndex Heap::RootIndexForEmptyExternalArray( | |
3750 ElementsKind elementsKind) { | |
3751 switch (elementsKind) { | |
3752 #define ELEMENT_KIND_TO_ROOT_INDEX(Type, type, TYPE, ctype, size) \ | |
3753 case EXTERNAL_##TYPE##_ELEMENTS: \ | |
3754 return kEmptyExternal##Type##ArrayRootIndex; | |
3755 | |
3756 TYPED_ARRAYS(ELEMENT_KIND_TO_ROOT_INDEX) | |
3757 #undef ELEMENT_KIND_TO_ROOT_INDEX | |
3758 | |
3759 default: | |
3760 UNREACHABLE(); | |
3761 return kUndefinedValueRootIndex; | |
3762 } | |
3763 } | |
3764 | |
3765 | |
3766 Heap::RootListIndex Heap::RootIndexForEmptyFixedTypedArray( | 3712 Heap::RootListIndex Heap::RootIndexForEmptyFixedTypedArray( |
3767 ElementsKind elementsKind) { | 3713 ElementsKind elementsKind) { |
3768 switch (elementsKind) { | 3714 switch (elementsKind) { |
3769 #define ELEMENT_KIND_TO_ROOT_INDEX(Type, type, TYPE, ctype, size) \ | 3715 #define ELEMENT_KIND_TO_ROOT_INDEX(Type, type, TYPE, ctype, size) \ |
3770 case TYPE##_ELEMENTS: \ | 3716 case TYPE##_ELEMENTS: \ |
3771 return kEmptyFixed##Type##ArrayRootIndex; | 3717 return kEmptyFixed##Type##ArrayRootIndex; |
3772 | 3718 |
3773 TYPED_ARRAYS(ELEMENT_KIND_TO_ROOT_INDEX) | 3719 TYPED_ARRAYS(ELEMENT_KIND_TO_ROOT_INDEX) |
3774 #undef ELEMENT_KIND_TO_ROOT_INDEX | 3720 #undef ELEMENT_KIND_TO_ROOT_INDEX |
3775 default: | 3721 default: |
3776 UNREACHABLE(); | 3722 UNREACHABLE(); |
3777 return kUndefinedValueRootIndex; | 3723 return kUndefinedValueRootIndex; |
3778 } | 3724 } |
3779 } | 3725 } |
3780 | 3726 |
3781 | 3727 |
3782 ExternalArray* Heap::EmptyExternalArrayForMap(Map* map) { | |
3783 return ExternalArray::cast( | |
3784 roots_[RootIndexForEmptyExternalArray(map->elements_kind())]); | |
3785 } | |
3786 | |
3787 | |
3788 FixedTypedArrayBase* Heap::EmptyFixedTypedArrayForMap(Map* map) { | 3728 FixedTypedArrayBase* Heap::EmptyFixedTypedArrayForMap(Map* map) { |
3789 return FixedTypedArrayBase::cast( | 3729 return FixedTypedArrayBase::cast( |
3790 roots_[RootIndexForEmptyFixedTypedArray(map->elements_kind())]); | 3730 roots_[RootIndexForEmptyFixedTypedArray(map->elements_kind())]); |
3791 } | 3731 } |
3792 | 3732 |
3793 | 3733 |
3794 AllocationResult Heap::AllocateForeign(Address address, | 3734 AllocationResult Heap::AllocateForeign(Address address, |
3795 PretenureFlag pretenure) { | 3735 PretenureFlag pretenure) { |
3796 // Statically ensure that it is safe to allocate foreigns in paged spaces. | 3736 // Statically ensure that it is safe to allocate foreigns in paged spaces. |
3797 STATIC_ASSERT(Foreign::kSize <= Page::kMaxRegularHeapObjectSize); | 3737 STATIC_ASSERT(Foreign::kSize <= Page::kMaxRegularHeapObjectSize); |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3998 | 3938 |
3999 // Notify the heap profiler of change in object layout. The array may not be | 3939 // Notify the heap profiler of change in object layout. The array may not be |
4000 // moved during GC, and size has to be adjusted nevertheless. | 3940 // moved during GC, and size has to be adjusted nevertheless. |
4001 HeapProfiler* profiler = isolate()->heap_profiler(); | 3941 HeapProfiler* profiler = isolate()->heap_profiler(); |
4002 if (profiler->is_tracking_allocations()) { | 3942 if (profiler->is_tracking_allocations()) { |
4003 profiler->UpdateObjectSizeEvent(object->address(), object->Size()); | 3943 profiler->UpdateObjectSizeEvent(object->address(), object->Size()); |
4004 } | 3944 } |
4005 } | 3945 } |
4006 | 3946 |
4007 | 3947 |
4008 AllocationResult Heap::AllocateExternalArray(int length, | 3948 AllocationResult Heap::AllocateFixedTypedArrayWithExternalPointer( |
4009 ExternalArrayType array_type, | 3949 int length, ExternalArrayType array_type, void* external_pointer, |
4010 void* external_pointer, | 3950 PretenureFlag pretenure) { |
4011 PretenureFlag pretenure) { | 3951 int size = FixedTypedArrayBase::kHeaderSize; |
4012 int size = ExternalArray::kSize; | |
4013 AllocationSpace space = SelectSpace(size, pretenure); | 3952 AllocationSpace space = SelectSpace(size, pretenure); |
4014 HeapObject* result; | 3953 HeapObject* result; |
4015 { | 3954 { |
4016 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE); | 3955 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE); |
4017 if (!allocation.To(&result)) return allocation; | 3956 if (!allocation.To(&result)) return allocation; |
4018 } | 3957 } |
4019 | 3958 |
4020 result->set_map_no_write_barrier(MapForExternalArrayType(array_type)); | 3959 result->set_map_no_write_barrier(MapForFixedTypedArray(array_type)); |
4021 ExternalArray::cast(result)->set_length(length); | 3960 FixedTypedArrayBase* elements = FixedTypedArrayBase::cast(result); |
4022 ExternalArray::cast(result)->set_external_pointer(external_pointer); | 3961 elements->set_base_pointer(Smi::FromInt(0), SKIP_WRITE_BARRIER); |
4023 return result; | 3962 elements->set_external_pointer(external_pointer, SKIP_WRITE_BARRIER); |
| 3963 elements->set_length(length); |
| 3964 return elements; |
4024 } | 3965 } |
4025 | 3966 |
4026 static void ForFixedTypedArray(ExternalArrayType array_type, int* element_size, | 3967 static void ForFixedTypedArray(ExternalArrayType array_type, int* element_size, |
4027 ElementsKind* element_kind) { | 3968 ElementsKind* element_kind) { |
4028 switch (array_type) { | 3969 switch (array_type) { |
4029 #define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ | 3970 #define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ |
4030 case kExternal##Type##Array: \ | 3971 case kExternal##Type##Array: \ |
4031 *element_size = size; \ | 3972 *element_size = size; \ |
4032 *element_kind = TYPE##_ELEMENTS; \ | 3973 *element_kind = TYPE##_ELEMENTS; \ |
4033 return; | 3974 return; |
(...skipping 19 matching lines...) Expand all Loading... |
4053 int size = OBJECT_POINTER_ALIGN(length * element_size + | 3994 int size = OBJECT_POINTER_ALIGN(length * element_size + |
4054 FixedTypedArrayBase::kDataOffset); | 3995 FixedTypedArrayBase::kDataOffset); |
4055 AllocationSpace space = SelectSpace(size, pretenure); | 3996 AllocationSpace space = SelectSpace(size, pretenure); |
4056 | 3997 |
4057 HeapObject* object; | 3998 HeapObject* object; |
4058 AllocationResult allocation = AllocateRaw( | 3999 AllocationResult allocation = AllocateRaw( |
4059 size, space, OLD_SPACE, | 4000 size, space, OLD_SPACE, |
4060 array_type == kExternalFloat64Array ? kDoubleAligned : kWordAligned); | 4001 array_type == kExternalFloat64Array ? kDoubleAligned : kWordAligned); |
4061 if (!allocation.To(&object)) return allocation; | 4002 if (!allocation.To(&object)) return allocation; |
4062 | 4003 |
4063 object->set_map(MapForFixedTypedArray(array_type)); | 4004 object->set_map_no_write_barrier(MapForFixedTypedArray(array_type)); |
4064 FixedTypedArrayBase* elements = FixedTypedArrayBase::cast(object); | 4005 FixedTypedArrayBase* elements = FixedTypedArrayBase::cast(object); |
4065 elements->set_base_pointer(elements, SKIP_WRITE_BARRIER); | 4006 elements->set_base_pointer(elements, SKIP_WRITE_BARRIER); |
4066 elements->set_external_pointer( | 4007 elements->set_external_pointer( |
4067 ExternalReference::fixed_typed_array_base_data_offset().address(), | 4008 ExternalReference::fixed_typed_array_base_data_offset().address(), |
4068 SKIP_WRITE_BARRIER); | 4009 SKIP_WRITE_BARRIER); |
4069 elements->set_length(length); | 4010 elements->set_length(length); |
4070 if (initialize) memset(elements->DataPtr(), 0, elements->DataSize()); | 4011 if (initialize) memset(elements->DataPtr(), 0, elements->DataSize()); |
4071 return elements; | 4012 return elements; |
4072 } | 4013 } |
4073 | 4014 |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4268 | 4209 |
4269 // Allocate the JSObject. | 4210 // Allocate the JSObject. |
4270 int size = map->instance_size(); | 4211 int size = map->instance_size(); |
4271 AllocationSpace space = SelectSpace(size, pretenure); | 4212 AllocationSpace space = SelectSpace(size, pretenure); |
4272 JSObject* js_obj; | 4213 JSObject* js_obj; |
4273 AllocationResult allocation = Allocate(map, space, allocation_site); | 4214 AllocationResult allocation = Allocate(map, space, allocation_site); |
4274 if (!allocation.To(&js_obj)) return allocation; | 4215 if (!allocation.To(&js_obj)) return allocation; |
4275 | 4216 |
4276 // Initialize the JSObject. | 4217 // Initialize the JSObject. |
4277 InitializeJSObjectFromMap(js_obj, properties, map); | 4218 InitializeJSObjectFromMap(js_obj, properties, map); |
4278 DCHECK(js_obj->HasFastElements() || js_obj->HasExternalArrayElements() || | 4219 DCHECK(js_obj->HasFastElements() || js_obj->HasFixedTypedArrayElements()); |
4279 js_obj->HasFixedTypedArrayElements()); | |
4280 return js_obj; | 4220 return js_obj; |
4281 } | 4221 } |
4282 | 4222 |
4283 | 4223 |
4284 AllocationResult Heap::AllocateJSObject(JSFunction* constructor, | 4224 AllocationResult Heap::AllocateJSObject(JSFunction* constructor, |
4285 PretenureFlag pretenure, | 4225 PretenureFlag pretenure, |
4286 AllocationSite* allocation_site) { | 4226 AllocationSite* allocation_site) { |
4287 DCHECK(constructor->has_initial_map()); | 4227 DCHECK(constructor->has_initial_map()); |
4288 | 4228 |
4289 // Allocate the object based on the constructors initial map. | 4229 // Allocate the object based on the constructors initial map. |
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4561 AllocationResult allocation = AllocateRaw(size, OLD_SPACE, OLD_SPACE); | 4501 AllocationResult allocation = AllocateRaw(size, OLD_SPACE, OLD_SPACE); |
4562 if (!allocation.To(&result)) return allocation; | 4502 if (!allocation.To(&result)) return allocation; |
4563 } | 4503 } |
4564 // Initialize the object. | 4504 // Initialize the object. |
4565 result->set_map_no_write_barrier(fixed_array_map()); | 4505 result->set_map_no_write_barrier(fixed_array_map()); |
4566 FixedArray::cast(result)->set_length(0); | 4506 FixedArray::cast(result)->set_length(0); |
4567 return result; | 4507 return result; |
4568 } | 4508 } |
4569 | 4509 |
4570 | 4510 |
4571 AllocationResult Heap::AllocateEmptyExternalArray( | |
4572 ExternalArrayType array_type) { | |
4573 return AllocateExternalArray(0, array_type, NULL, TENURED); | |
4574 } | |
4575 | |
4576 | |
4577 AllocationResult Heap::CopyAndTenureFixedCOWArray(FixedArray* src) { | 4511 AllocationResult Heap::CopyAndTenureFixedCOWArray(FixedArray* src) { |
4578 if (!InNewSpace(src)) { | 4512 if (!InNewSpace(src)) { |
4579 return src; | 4513 return src; |
4580 } | 4514 } |
4581 | 4515 |
4582 int len = src->length(); | 4516 int len = src->length(); |
4583 HeapObject* obj; | 4517 HeapObject* obj; |
4584 { | 4518 { |
4585 AllocationResult allocation = AllocateRawFixedArray(len, TENURED); | 4519 AllocationResult allocation = AllocateRawFixedArray(len, TENURED); |
4586 if (!allocation.To(&obj)) return allocation; | 4520 if (!allocation.To(&obj)) return allocation; |
(...skipping 2402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6989 *object_type = "CODE_TYPE"; \ | 6923 *object_type = "CODE_TYPE"; \ |
6990 *object_sub_type = "CODE_AGE/" #name; \ | 6924 *object_sub_type = "CODE_AGE/" #name; \ |
6991 return true; | 6925 return true; |
6992 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) | 6926 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) |
6993 #undef COMPARE_AND_RETURN_NAME | 6927 #undef COMPARE_AND_RETURN_NAME |
6994 } | 6928 } |
6995 return false; | 6929 return false; |
6996 } | 6930 } |
6997 } // namespace internal | 6931 } // namespace internal |
6998 } // namespace v8 | 6932 } // namespace v8 |
OLD | NEW |