| 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 1958 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1969 // Take another spin if there are now unswept objects in new space | 1969 // Take another spin if there are now unswept objects in new space |
| 1970 // (there are currently no more unswept promoted objects). | 1970 // (there are currently no more unswept promoted objects). |
| 1971 } while (new_space_front != new_space_.top()); | 1971 } while (new_space_front != new_space_.top()); |
| 1972 | 1972 |
| 1973 return new_space_front; | 1973 return new_space_front; |
| 1974 } | 1974 } |
| 1975 | 1975 |
| 1976 | 1976 |
| 1977 STATIC_ASSERT((FixedDoubleArray::kHeaderSize & kDoubleAlignmentMask) == | 1977 STATIC_ASSERT((FixedDoubleArray::kHeaderSize & kDoubleAlignmentMask) == |
| 1978 0); // NOLINT | 1978 0); // NOLINT |
| 1979 STATIC_ASSERT((ConstantPoolArray::kFirstEntryOffset & kDoubleAlignmentMask) == | |
| 1980 0); // NOLINT | |
| 1981 STATIC_ASSERT((ConstantPoolArray::kExtendedFirstOffset & | |
| 1982 kDoubleAlignmentMask) == 0); // NOLINT | |
| 1983 STATIC_ASSERT((FixedTypedArrayBase::kDataOffset & kDoubleAlignmentMask) == | 1979 STATIC_ASSERT((FixedTypedArrayBase::kDataOffset & kDoubleAlignmentMask) == |
| 1984 0); // NOLINT | 1980 0); // NOLINT |
| 1985 #ifdef V8_HOST_ARCH_32_BIT | 1981 #ifdef V8_HOST_ARCH_32_BIT |
| 1986 STATIC_ASSERT((HeapNumber::kValueOffset & kDoubleAlignmentMask) != | 1982 STATIC_ASSERT((HeapNumber::kValueOffset & kDoubleAlignmentMask) != |
| 1987 0); // NOLINT | 1983 0); // NOLINT |
| 1988 #endif | 1984 #endif |
| 1989 | 1985 |
| 1990 | 1986 |
| 1991 int Heap::GetMaximumFillToAlign(AllocationAlignment alignment) { | 1987 int Heap::GetMaximumFillToAlign(AllocationAlignment alignment) { |
| 1992 switch (alignment) { | 1988 switch (alignment) { |
| (...skipping 613 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2606 #define ALLOCATE_PARTIAL_MAP(instance_type, size, field_name) \ | 2602 #define ALLOCATE_PARTIAL_MAP(instance_type, size, field_name) \ |
| 2607 { \ | 2603 { \ |
| 2608 Map* map; \ | 2604 Map* map; \ |
| 2609 if (!AllocatePartialMap((instance_type), (size)).To(&map)) return false; \ | 2605 if (!AllocatePartialMap((instance_type), (size)).To(&map)) return false; \ |
| 2610 set_##field_name##_map(map); \ | 2606 set_##field_name##_map(map); \ |
| 2611 } | 2607 } |
| 2612 | 2608 |
| 2613 ALLOCATE_PARTIAL_MAP(FIXED_ARRAY_TYPE, kVariableSizeSentinel, fixed_array); | 2609 ALLOCATE_PARTIAL_MAP(FIXED_ARRAY_TYPE, kVariableSizeSentinel, fixed_array); |
| 2614 ALLOCATE_PARTIAL_MAP(ODDBALL_TYPE, Oddball::kSize, undefined); | 2610 ALLOCATE_PARTIAL_MAP(ODDBALL_TYPE, Oddball::kSize, undefined); |
| 2615 ALLOCATE_PARTIAL_MAP(ODDBALL_TYPE, Oddball::kSize, null); | 2611 ALLOCATE_PARTIAL_MAP(ODDBALL_TYPE, Oddball::kSize, null); |
| 2616 ALLOCATE_PARTIAL_MAP(CONSTANT_POOL_ARRAY_TYPE, kVariableSizeSentinel, | |
| 2617 constant_pool_array); | |
| 2618 | 2612 |
| 2619 #undef ALLOCATE_PARTIAL_MAP | 2613 #undef ALLOCATE_PARTIAL_MAP |
| 2620 } | 2614 } |
| 2621 | 2615 |
| 2622 // Allocate the empty array. | 2616 // Allocate the empty array. |
| 2623 { | 2617 { |
| 2624 AllocationResult allocation = AllocateEmptyFixedArray(); | 2618 AllocationResult allocation = AllocateEmptyFixedArray(); |
| 2625 if (!allocation.To(&obj)) return false; | 2619 if (!allocation.To(&obj)) return false; |
| 2626 } | 2620 } |
| 2627 set_empty_fixed_array(FixedArray::cast(obj)); | 2621 set_empty_fixed_array(FixedArray::cast(obj)); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2644 // Set preliminary exception sentinel value before actually initializing it. | 2638 // Set preliminary exception sentinel value before actually initializing it. |
| 2645 set_exception(null_value()); | 2639 set_exception(null_value()); |
| 2646 | 2640 |
| 2647 // Allocate the empty descriptor array. | 2641 // Allocate the empty descriptor array. |
| 2648 { | 2642 { |
| 2649 AllocationResult allocation = AllocateEmptyFixedArray(); | 2643 AllocationResult allocation = AllocateEmptyFixedArray(); |
| 2650 if (!allocation.To(&obj)) return false; | 2644 if (!allocation.To(&obj)) return false; |
| 2651 } | 2645 } |
| 2652 set_empty_descriptor_array(DescriptorArray::cast(obj)); | 2646 set_empty_descriptor_array(DescriptorArray::cast(obj)); |
| 2653 | 2647 |
| 2654 // Allocate the constant pool array. | |
| 2655 { | |
| 2656 AllocationResult allocation = AllocateEmptyConstantPoolArray(); | |
| 2657 if (!allocation.To(&obj)) return false; | |
| 2658 } | |
| 2659 set_empty_constant_pool_array(ConstantPoolArray::cast(obj)); | |
| 2660 | |
| 2661 // Fix the instance_descriptors for the existing maps. | 2648 // Fix the instance_descriptors for the existing maps. |
| 2662 meta_map()->set_code_cache(empty_fixed_array()); | 2649 meta_map()->set_code_cache(empty_fixed_array()); |
| 2663 meta_map()->set_dependent_code(DependentCode::cast(empty_fixed_array())); | 2650 meta_map()->set_dependent_code(DependentCode::cast(empty_fixed_array())); |
| 2664 meta_map()->set_raw_transitions(Smi::FromInt(0)); | 2651 meta_map()->set_raw_transitions(Smi::FromInt(0)); |
| 2665 meta_map()->set_instance_descriptors(empty_descriptor_array()); | 2652 meta_map()->set_instance_descriptors(empty_descriptor_array()); |
| 2666 if (FLAG_unbox_double_fields) { | 2653 if (FLAG_unbox_double_fields) { |
| 2667 meta_map()->set_layout_descriptor(LayoutDescriptor::FastPointerLayout()); | 2654 meta_map()->set_layout_descriptor(LayoutDescriptor::FastPointerLayout()); |
| 2668 } | 2655 } |
| 2669 | 2656 |
| 2670 fixed_array_map()->set_code_cache(empty_fixed_array()); | 2657 fixed_array_map()->set_code_cache(empty_fixed_array()); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2687 } | 2674 } |
| 2688 | 2675 |
| 2689 null_map()->set_code_cache(empty_fixed_array()); | 2676 null_map()->set_code_cache(empty_fixed_array()); |
| 2690 null_map()->set_dependent_code(DependentCode::cast(empty_fixed_array())); | 2677 null_map()->set_dependent_code(DependentCode::cast(empty_fixed_array())); |
| 2691 null_map()->set_raw_transitions(Smi::FromInt(0)); | 2678 null_map()->set_raw_transitions(Smi::FromInt(0)); |
| 2692 null_map()->set_instance_descriptors(empty_descriptor_array()); | 2679 null_map()->set_instance_descriptors(empty_descriptor_array()); |
| 2693 if (FLAG_unbox_double_fields) { | 2680 if (FLAG_unbox_double_fields) { |
| 2694 null_map()->set_layout_descriptor(LayoutDescriptor::FastPointerLayout()); | 2681 null_map()->set_layout_descriptor(LayoutDescriptor::FastPointerLayout()); |
| 2695 } | 2682 } |
| 2696 | 2683 |
| 2697 constant_pool_array_map()->set_code_cache(empty_fixed_array()); | |
| 2698 constant_pool_array_map()->set_dependent_code( | |
| 2699 DependentCode::cast(empty_fixed_array())); | |
| 2700 constant_pool_array_map()->set_raw_transitions(Smi::FromInt(0)); | |
| 2701 constant_pool_array_map()->set_instance_descriptors(empty_descriptor_array()); | |
| 2702 if (FLAG_unbox_double_fields) { | |
| 2703 constant_pool_array_map()->set_layout_descriptor( | |
| 2704 LayoutDescriptor::FastPointerLayout()); | |
| 2705 } | |
| 2706 | |
| 2707 // Fix prototype object for existing maps. | 2684 // Fix prototype object for existing maps. |
| 2708 meta_map()->set_prototype(null_value()); | 2685 meta_map()->set_prototype(null_value()); |
| 2709 meta_map()->set_constructor_or_backpointer(null_value()); | 2686 meta_map()->set_constructor_or_backpointer(null_value()); |
| 2710 | 2687 |
| 2711 fixed_array_map()->set_prototype(null_value()); | 2688 fixed_array_map()->set_prototype(null_value()); |
| 2712 fixed_array_map()->set_constructor_or_backpointer(null_value()); | 2689 fixed_array_map()->set_constructor_or_backpointer(null_value()); |
| 2713 | 2690 |
| 2714 undefined_map()->set_prototype(null_value()); | 2691 undefined_map()->set_prototype(null_value()); |
| 2715 undefined_map()->set_constructor_or_backpointer(null_value()); | 2692 undefined_map()->set_constructor_or_backpointer(null_value()); |
| 2716 | 2693 |
| 2717 null_map()->set_prototype(null_value()); | 2694 null_map()->set_prototype(null_value()); |
| 2718 null_map()->set_constructor_or_backpointer(null_value()); | 2695 null_map()->set_constructor_or_backpointer(null_value()); |
| 2719 | 2696 |
| 2720 constant_pool_array_map()->set_prototype(null_value()); | |
| 2721 constant_pool_array_map()->set_constructor_or_backpointer(null_value()); | |
| 2722 | |
| 2723 { // Map allocation | 2697 { // Map allocation |
| 2724 #define ALLOCATE_MAP(instance_type, size, field_name) \ | 2698 #define ALLOCATE_MAP(instance_type, size, field_name) \ |
| 2725 { \ | 2699 { \ |
| 2726 Map* map; \ | 2700 Map* map; \ |
| 2727 if (!AllocateMap((instance_type), size).To(&map)) return false; \ | 2701 if (!AllocateMap((instance_type), size).To(&map)) return false; \ |
| 2728 set_##field_name##_map(map); \ | 2702 set_##field_name##_map(map); \ |
| 2729 } | 2703 } |
| 2730 | 2704 |
| 2731 #define ALLOCATE_VARSIZE_MAP(instance_type, field_name) \ | 2705 #define ALLOCATE_VARSIZE_MAP(instance_type, field_name) \ |
| 2732 ALLOCATE_MAP(instance_type, kVariableSizeSentinel, field_name) | 2706 ALLOCATE_MAP(instance_type, kVariableSizeSentinel, field_name) |
| (...skipping 1050 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3783 DCHECK(isolate_->code_range() == NULL || !isolate_->code_range()->valid() || | 3757 DCHECK(isolate_->code_range() == NULL || !isolate_->code_range()->valid() || |
| 3784 isolate_->code_range()->contains(code->address())); | 3758 isolate_->code_range()->contains(code->address())); |
| 3785 code->set_gc_metadata(Smi::FromInt(0)); | 3759 code->set_gc_metadata(Smi::FromInt(0)); |
| 3786 code->set_ic_age(global_ic_age_); | 3760 code->set_ic_age(global_ic_age_); |
| 3787 return code; | 3761 return code; |
| 3788 } | 3762 } |
| 3789 | 3763 |
| 3790 | 3764 |
| 3791 AllocationResult Heap::CopyCode(Code* code) { | 3765 AllocationResult Heap::CopyCode(Code* code) { |
| 3792 AllocationResult allocation; | 3766 AllocationResult allocation; |
| 3793 HeapObject* new_constant_pool; | |
| 3794 if (FLAG_enable_ool_constant_pool && | |
| 3795 code->constant_pool() != empty_constant_pool_array()) { | |
| 3796 // Copy the constant pool, since edits to the copied code may modify | |
| 3797 // the constant pool. | |
| 3798 allocation = CopyConstantPoolArray(code->constant_pool()); | |
| 3799 if (!allocation.To(&new_constant_pool)) return allocation; | |
| 3800 } else { | |
| 3801 new_constant_pool = empty_constant_pool_array(); | |
| 3802 } | |
| 3803 | 3767 |
| 3804 HeapObject* result = NULL; | 3768 HeapObject* result = NULL; |
| 3805 // Allocate an object the same size as the code object. | 3769 // Allocate an object the same size as the code object. |
| 3806 int obj_size = code->Size(); | 3770 int obj_size = code->Size(); |
| 3807 allocation = AllocateRaw(obj_size, CODE_SPACE, CODE_SPACE); | 3771 allocation = AllocateRaw(obj_size, CODE_SPACE, CODE_SPACE); |
| 3808 if (!allocation.To(&result)) return allocation; | 3772 if (!allocation.To(&result)) return allocation; |
| 3809 | 3773 |
| 3810 // Copy code object. | 3774 // Copy code object. |
| 3811 Address old_addr = code->address(); | 3775 Address old_addr = code->address(); |
| 3812 Address new_addr = result->address(); | 3776 Address new_addr = result->address(); |
| 3813 CopyBlock(new_addr, old_addr, obj_size); | 3777 CopyBlock(new_addr, old_addr, obj_size); |
| 3814 Code* new_code = Code::cast(result); | 3778 Code* new_code = Code::cast(result); |
| 3815 | 3779 |
| 3816 // Update the constant pool. | |
| 3817 new_code->set_constant_pool(new_constant_pool); | |
| 3818 | |
| 3819 // Relocate the copy. | 3780 // Relocate the copy. |
| 3820 DCHECK(IsAligned(bit_cast<intptr_t>(new_code->address()), kCodeAlignment)); | 3781 DCHECK(IsAligned(bit_cast<intptr_t>(new_code->address()), kCodeAlignment)); |
| 3821 DCHECK(isolate_->code_range() == NULL || !isolate_->code_range()->valid() || | 3782 DCHECK(isolate_->code_range() == NULL || !isolate_->code_range()->valid() || |
| 3822 isolate_->code_range()->contains(code->address())); | 3783 isolate_->code_range()->contains(code->address())); |
| 3823 new_code->Relocate(new_addr - old_addr); | 3784 new_code->Relocate(new_addr - old_addr); |
| 3824 return new_code; | 3785 return new_code; |
| 3825 } | 3786 } |
| 3826 | 3787 |
| 3827 | 3788 |
| 3828 AllocationResult Heap::CopyCode(Code* code, Vector<byte> reloc_info) { | 3789 AllocationResult Heap::CopyCode(Code* code, Vector<byte> reloc_info) { |
| 3829 // Allocate ByteArray and ConstantPoolArray before the Code object, so that we | 3790 // Allocate ByteArray before the Code object, so that we do not risk |
| 3830 // do not risk leaving uninitialized Code object (and breaking the heap). | 3791 // leaving uninitialized Code object (and breaking the heap). |
| 3831 ByteArray* reloc_info_array; | 3792 ByteArray* reloc_info_array; |
| 3832 { | 3793 { |
| 3833 AllocationResult allocation = | 3794 AllocationResult allocation = |
| 3834 AllocateByteArray(reloc_info.length(), TENURED); | 3795 AllocateByteArray(reloc_info.length(), TENURED); |
| 3835 if (!allocation.To(&reloc_info_array)) return allocation; | 3796 if (!allocation.To(&reloc_info_array)) return allocation; |
| 3836 } | 3797 } |
| 3837 HeapObject* new_constant_pool; | |
| 3838 if (FLAG_enable_ool_constant_pool && | |
| 3839 code->constant_pool() != empty_constant_pool_array()) { | |
| 3840 // Copy the constant pool, since edits to the copied code may modify | |
| 3841 // the constant pool. | |
| 3842 AllocationResult allocation = CopyConstantPoolArray(code->constant_pool()); | |
| 3843 if (!allocation.To(&new_constant_pool)) return allocation; | |
| 3844 } else { | |
| 3845 new_constant_pool = empty_constant_pool_array(); | |
| 3846 } | |
| 3847 | 3798 |
| 3848 int new_body_size = RoundUp(code->instruction_size(), kObjectAlignment); | 3799 int new_body_size = RoundUp(code->instruction_size(), kObjectAlignment); |
| 3849 | 3800 |
| 3850 int new_obj_size = Code::SizeFor(new_body_size); | 3801 int new_obj_size = Code::SizeFor(new_body_size); |
| 3851 | 3802 |
| 3852 Address old_addr = code->address(); | 3803 Address old_addr = code->address(); |
| 3853 | 3804 |
| 3854 size_t relocation_offset = | 3805 size_t relocation_offset = |
| 3855 static_cast<size_t>(code->instruction_end() - old_addr); | 3806 static_cast<size_t>(code->instruction_end() - old_addr); |
| 3856 | 3807 |
| 3857 HeapObject* result; | 3808 HeapObject* result; |
| 3858 AllocationResult allocation = | 3809 AllocationResult allocation = |
| 3859 AllocateRaw(new_obj_size, CODE_SPACE, CODE_SPACE); | 3810 AllocateRaw(new_obj_size, CODE_SPACE, CODE_SPACE); |
| 3860 if (!allocation.To(&result)) return allocation; | 3811 if (!allocation.To(&result)) return allocation; |
| 3861 | 3812 |
| 3862 // Copy code object. | 3813 // Copy code object. |
| 3863 Address new_addr = result->address(); | 3814 Address new_addr = result->address(); |
| 3864 | 3815 |
| 3865 // Copy header and instructions. | 3816 // Copy header and instructions. |
| 3866 CopyBytes(new_addr, old_addr, relocation_offset); | 3817 CopyBytes(new_addr, old_addr, relocation_offset); |
| 3867 | 3818 |
| 3868 Code* new_code = Code::cast(result); | 3819 Code* new_code = Code::cast(result); |
| 3869 new_code->set_relocation_info(reloc_info_array); | 3820 new_code->set_relocation_info(reloc_info_array); |
| 3870 | 3821 |
| 3871 // Update constant pool. | |
| 3872 new_code->set_constant_pool(new_constant_pool); | |
| 3873 | |
| 3874 // Copy patched rinfo. | 3822 // Copy patched rinfo. |
| 3875 CopyBytes(new_code->relocation_start(), reloc_info.start(), | 3823 CopyBytes(new_code->relocation_start(), reloc_info.start(), |
| 3876 static_cast<size_t>(reloc_info.length())); | 3824 static_cast<size_t>(reloc_info.length())); |
| 3877 | 3825 |
| 3878 // Relocate the copy. | 3826 // Relocate the copy. |
| 3879 DCHECK(IsAligned(bit_cast<intptr_t>(new_code->address()), kCodeAlignment)); | 3827 DCHECK(IsAligned(bit_cast<intptr_t>(new_code->address()), kCodeAlignment)); |
| 3880 DCHECK(isolate_->code_range() == NULL || !isolate_->code_range()->valid() || | 3828 DCHECK(isolate_->code_range() == NULL || !isolate_->code_range()->valid() || |
| 3881 isolate_->code_range()->contains(code->address())); | 3829 isolate_->code_range()->contains(code->address())); |
| 3882 new_code->Relocate(new_addr - old_addr); | 3830 new_code->Relocate(new_addr - old_addr); |
| 3883 | 3831 |
| (...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4356 if (!allocation.To(&obj)) return allocation; | 4304 if (!allocation.To(&obj)) return allocation; |
| 4357 } | 4305 } |
| 4358 obj->set_map_no_write_barrier(map); | 4306 obj->set_map_no_write_barrier(map); |
| 4359 CopyBlock(obj->address() + FixedDoubleArray::kLengthOffset, | 4307 CopyBlock(obj->address() + FixedDoubleArray::kLengthOffset, |
| 4360 src->address() + FixedDoubleArray::kLengthOffset, | 4308 src->address() + FixedDoubleArray::kLengthOffset, |
| 4361 FixedDoubleArray::SizeFor(len) - FixedDoubleArray::kLengthOffset); | 4309 FixedDoubleArray::SizeFor(len) - FixedDoubleArray::kLengthOffset); |
| 4362 return obj; | 4310 return obj; |
| 4363 } | 4311 } |
| 4364 | 4312 |
| 4365 | 4313 |
| 4366 AllocationResult Heap::CopyConstantPoolArrayWithMap(ConstantPoolArray* src, | |
| 4367 Map* map) { | |
| 4368 HeapObject* obj; | |
| 4369 if (src->is_extended_layout()) { | |
| 4370 ConstantPoolArray::NumberOfEntries small(src, | |
| 4371 ConstantPoolArray::SMALL_SECTION); | |
| 4372 ConstantPoolArray::NumberOfEntries extended( | |
| 4373 src, ConstantPoolArray::EXTENDED_SECTION); | |
| 4374 AllocationResult allocation = | |
| 4375 AllocateExtendedConstantPoolArray(small, extended); | |
| 4376 if (!allocation.To(&obj)) return allocation; | |
| 4377 } else { | |
| 4378 ConstantPoolArray::NumberOfEntries small(src, | |
| 4379 ConstantPoolArray::SMALL_SECTION); | |
| 4380 AllocationResult allocation = AllocateConstantPoolArray(small); | |
| 4381 if (!allocation.To(&obj)) return allocation; | |
| 4382 } | |
| 4383 obj->set_map_no_write_barrier(map); | |
| 4384 CopyBlock(obj->address() + ConstantPoolArray::kFirstEntryOffset, | |
| 4385 src->address() + ConstantPoolArray::kFirstEntryOffset, | |
| 4386 src->size() - ConstantPoolArray::kFirstEntryOffset); | |
| 4387 return obj; | |
| 4388 } | |
| 4389 | |
| 4390 | |
| 4391 AllocationResult Heap::AllocateRawFixedArray(int length, | 4314 AllocationResult Heap::AllocateRawFixedArray(int length, |
| 4392 PretenureFlag pretenure) { | 4315 PretenureFlag pretenure) { |
| 4393 if (length < 0 || length > FixedArray::kMaxLength) { | 4316 if (length < 0 || length > FixedArray::kMaxLength) { |
| 4394 v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", true); | 4317 v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", true); |
| 4395 } | 4318 } |
| 4396 int size = FixedArray::SizeFor(length); | 4319 int size = FixedArray::SizeFor(length); |
| 4397 AllocationSpace space = SelectSpace(size, pretenure); | 4320 AllocationSpace space = SelectSpace(size, pretenure); |
| 4398 | 4321 |
| 4399 return AllocateRaw(size, space, OLD_SPACE); | 4322 return AllocateRaw(size, space, OLD_SPACE); |
| 4400 } | 4323 } |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4469 { | 4392 { |
| 4470 AllocationResult allocation = | 4393 AllocationResult allocation = |
| 4471 AllocateRaw(size, space, OLD_SPACE, kDoubleAligned); | 4394 AllocateRaw(size, space, OLD_SPACE, kDoubleAligned); |
| 4472 if (!allocation.To(&object)) return allocation; | 4395 if (!allocation.To(&object)) return allocation; |
| 4473 } | 4396 } |
| 4474 | 4397 |
| 4475 return object; | 4398 return object; |
| 4476 } | 4399 } |
| 4477 | 4400 |
| 4478 | 4401 |
| 4479 AllocationResult Heap::AllocateConstantPoolArray( | |
| 4480 const ConstantPoolArray::NumberOfEntries& small) { | |
| 4481 CHECK(small.are_in_range(0, ConstantPoolArray::kMaxSmallEntriesPerType)); | |
| 4482 int size = ConstantPoolArray::SizeFor(small); | |
| 4483 AllocationSpace space = SelectSpace(size, TENURED); | |
| 4484 | |
| 4485 HeapObject* object = nullptr; | |
| 4486 { | |
| 4487 AllocationResult allocation = | |
| 4488 AllocateRaw(size, space, OLD_SPACE, kDoubleAligned); | |
| 4489 if (!allocation.To(&object)) return allocation; | |
| 4490 } | |
| 4491 object->set_map_no_write_barrier(constant_pool_array_map()); | |
| 4492 | |
| 4493 ConstantPoolArray* constant_pool = ConstantPoolArray::cast(object); | |
| 4494 constant_pool->Init(small); | |
| 4495 constant_pool->ClearPtrEntries(isolate()); | |
| 4496 return constant_pool; | |
| 4497 } | |
| 4498 | |
| 4499 | |
| 4500 AllocationResult Heap::AllocateExtendedConstantPoolArray( | |
| 4501 const ConstantPoolArray::NumberOfEntries& small, | |
| 4502 const ConstantPoolArray::NumberOfEntries& extended) { | |
| 4503 CHECK(small.are_in_range(0, ConstantPoolArray::kMaxSmallEntriesPerType)); | |
| 4504 CHECK(extended.are_in_range(0, kMaxInt)); | |
| 4505 int size = ConstantPoolArray::SizeForExtended(small, extended); | |
| 4506 AllocationSpace space = SelectSpace(size, TENURED); | |
| 4507 | |
| 4508 HeapObject* object; | |
| 4509 { | |
| 4510 AllocationResult allocation = | |
| 4511 AllocateRaw(size, space, OLD_SPACE, kDoubleAligned); | |
| 4512 if (!allocation.To(&object)) return allocation; | |
| 4513 } | |
| 4514 object->set_map_no_write_barrier(constant_pool_array_map()); | |
| 4515 | |
| 4516 ConstantPoolArray* constant_pool = ConstantPoolArray::cast(object); | |
| 4517 constant_pool->InitExtended(small, extended); | |
| 4518 constant_pool->ClearPtrEntries(isolate()); | |
| 4519 return constant_pool; | |
| 4520 } | |
| 4521 | |
| 4522 | |
| 4523 AllocationResult Heap::AllocateEmptyConstantPoolArray() { | |
| 4524 ConstantPoolArray::NumberOfEntries small(0, 0, 0, 0); | |
| 4525 int size = ConstantPoolArray::SizeFor(small); | |
| 4526 HeapObject* result = NULL; | |
| 4527 { | |
| 4528 AllocationResult allocation = AllocateRaw(size, OLD_SPACE, OLD_SPACE); | |
| 4529 if (!allocation.To(&result)) return allocation; | |
| 4530 } | |
| 4531 result->set_map_no_write_barrier(constant_pool_array_map()); | |
| 4532 ConstantPoolArray::cast(result)->Init(small); | |
| 4533 return result; | |
| 4534 } | |
| 4535 | |
| 4536 | |
| 4537 AllocationResult Heap::AllocateSymbol() { | 4402 AllocationResult Heap::AllocateSymbol() { |
| 4538 // Statically ensure that it is safe to allocate symbols in paged spaces. | 4403 // Statically ensure that it is safe to allocate symbols in paged spaces. |
| 4539 STATIC_ASSERT(Symbol::kSize <= Page::kMaxRegularHeapObjectSize); | 4404 STATIC_ASSERT(Symbol::kSize <= Page::kMaxRegularHeapObjectSize); |
| 4540 | 4405 |
| 4541 HeapObject* result = NULL; | 4406 HeapObject* result = NULL; |
| 4542 AllocationResult allocation = | 4407 AllocationResult allocation = |
| 4543 AllocateRaw(Symbol::kSize, OLD_SPACE, OLD_SPACE); | 4408 AllocateRaw(Symbol::kSize, OLD_SPACE, OLD_SPACE); |
| 4544 if (!allocation.To(&result)) return allocation; | 4409 if (!allocation.To(&result)) return allocation; |
| 4545 | 4410 |
| 4546 result->set_map_no_write_barrier(symbol_map()); | 4411 result->set_map_no_write_barrier(symbol_map()); |
| (...skipping 2119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6666 *object_type = "CODE_TYPE"; \ | 6531 *object_type = "CODE_TYPE"; \ |
| 6667 *object_sub_type = "CODE_AGE/" #name; \ | 6532 *object_sub_type = "CODE_AGE/" #name; \ |
| 6668 return true; | 6533 return true; |
| 6669 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) | 6534 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) |
| 6670 #undef COMPARE_AND_RETURN_NAME | 6535 #undef COMPARE_AND_RETURN_NAME |
| 6671 } | 6536 } |
| 6672 return false; | 6537 return false; |
| 6673 } | 6538 } |
| 6674 } // namespace internal | 6539 } // namespace internal |
| 6675 } // namespace v8 | 6540 } // namespace v8 |
| OLD | NEW |