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 3648 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3659 | 3659 |
3660 | 3660 |
3661 AllocationResult Heap::AllocateFixedTypedArray(int length, | 3661 AllocationResult Heap::AllocateFixedTypedArray(int length, |
3662 ExternalArrayType array_type, | 3662 ExternalArrayType array_type, |
3663 PretenureFlag pretenure) { | 3663 PretenureFlag pretenure) { |
3664 int element_size; | 3664 int element_size; |
3665 ElementsKind elements_kind; | 3665 ElementsKind elements_kind; |
3666 ForFixedTypedArray(array_type, &element_size, &elements_kind); | 3666 ForFixedTypedArray(array_type, &element_size, &elements_kind); |
3667 int size = OBJECT_POINTER_ALIGN(length * element_size + | 3667 int size = OBJECT_POINTER_ALIGN(length * element_size + |
3668 FixedTypedArrayBase::kDataOffset); | 3668 FixedTypedArrayBase::kDataOffset); |
3669 #ifndef V8_HOST_ARCH_64_BIT | |
3670 if (array_type == kExternalFloat64Array) { | |
3671 size += kPointerSize; | |
3672 } | |
3673 #endif | |
3674 AllocationSpace space = SelectSpace(size, pretenure); | 3669 AllocationSpace space = SelectSpace(size, pretenure); |
3675 | 3670 |
3676 HeapObject* object; | 3671 HeapObject* object; |
3677 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE); | 3672 AllocationResult allocation = AllocateRaw( |
| 3673 size, space, OLD_SPACE, |
| 3674 array_type == kExternalFloat64Array ? kDoubleAligned : kWordAligned); |
3678 if (!allocation.To(&object)) return allocation; | 3675 if (!allocation.To(&object)) return allocation; |
3679 | 3676 |
3680 if (array_type == kExternalFloat64Array) { | |
3681 object = EnsureDoubleAligned(object, size); | |
3682 } | |
3683 | |
3684 object->set_map(MapForFixedTypedArray(array_type)); | 3677 object->set_map(MapForFixedTypedArray(array_type)); |
3685 FixedTypedArrayBase* elements = FixedTypedArrayBase::cast(object); | 3678 FixedTypedArrayBase* elements = FixedTypedArrayBase::cast(object); |
3686 elements->set_length(length); | 3679 elements->set_length(length); |
3687 memset(elements->DataPtr(), 0, elements->DataSize()); | 3680 memset(elements->DataPtr(), 0, elements->DataSize()); |
3688 return elements; | 3681 return elements; |
3689 } | 3682 } |
3690 | 3683 |
3691 | 3684 |
3692 AllocationResult Heap::AllocateCode(int object_size, bool immovable) { | 3685 AllocationResult Heap::AllocateCode(int object_size, bool immovable) { |
3693 DCHECK(IsAligned(static_cast<intptr_t>(object_size), kCodeAlignment)); | 3686 DCHECK(IsAligned(static_cast<intptr_t>(object_size), kCodeAlignment)); |
(...skipping 694 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4388 | 4381 |
4389 elements->set_map_no_write_barrier(fixed_double_array_map()); | 4382 elements->set_map_no_write_barrier(fixed_double_array_map()); |
4390 FixedDoubleArray::cast(elements)->set_length(length); | 4383 FixedDoubleArray::cast(elements)->set_length(length); |
4391 return elements; | 4384 return elements; |
4392 } | 4385 } |
4393 | 4386 |
4394 | 4387 |
4395 AllocationResult Heap::AllocateRawFixedDoubleArray(int length, | 4388 AllocationResult Heap::AllocateRawFixedDoubleArray(int length, |
4396 PretenureFlag pretenure) { | 4389 PretenureFlag pretenure) { |
4397 if (length < 0 || length > FixedDoubleArray::kMaxLength) { | 4390 if (length < 0 || length > FixedDoubleArray::kMaxLength) { |
4398 v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", true); | 4391 v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", |
| 4392 kDoubleAligned); |
4399 } | 4393 } |
4400 int size = FixedDoubleArray::SizeFor(length); | 4394 int size = FixedDoubleArray::SizeFor(length); |
4401 #ifndef V8_HOST_ARCH_64_BIT | |
4402 size += kPointerSize; | |
4403 #endif | |
4404 AllocationSpace space = SelectSpace(size, pretenure); | 4395 AllocationSpace space = SelectSpace(size, pretenure); |
4405 | 4396 |
4406 HeapObject* object; | 4397 HeapObject* object; |
4407 { | 4398 { |
4408 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE); | 4399 AllocationResult allocation = |
| 4400 AllocateRaw(size, space, OLD_SPACE, kDoubleAligned); |
4409 if (!allocation.To(&object)) return allocation; | 4401 if (!allocation.To(&object)) return allocation; |
4410 } | 4402 } |
4411 | 4403 |
4412 return EnsureDoubleAligned(object, size); | 4404 return object; |
4413 } | 4405 } |
4414 | 4406 |
4415 | 4407 |
4416 AllocationResult Heap::AllocateConstantPoolArray( | 4408 AllocationResult Heap::AllocateConstantPoolArray( |
4417 const ConstantPoolArray::NumberOfEntries& small) { | 4409 const ConstantPoolArray::NumberOfEntries& small) { |
4418 CHECK(small.are_in_range(0, ConstantPoolArray::kMaxSmallEntriesPerType)); | 4410 CHECK(small.are_in_range(0, ConstantPoolArray::kMaxSmallEntriesPerType)); |
4419 int size = ConstantPoolArray::SizeFor(small); | 4411 int size = ConstantPoolArray::SizeFor(small); |
4420 #ifndef V8_HOST_ARCH_64_BIT | |
4421 size += kPointerSize; | |
4422 #endif | |
4423 AllocationSpace space = SelectSpace(size, TENURED); | 4412 AllocationSpace space = SelectSpace(size, TENURED); |
4424 | 4413 |
4425 HeapObject* object; | 4414 HeapObject* object; |
4426 { | 4415 { |
4427 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE); | 4416 AllocationResult allocation = |
| 4417 AllocateRaw(size, space, OLD_SPACE, kDoubleAligned); |
4428 if (!allocation.To(&object)) return allocation; | 4418 if (!allocation.To(&object)) return allocation; |
4429 } | 4419 } |
4430 object = EnsureDoubleAligned(object, size); | |
4431 object->set_map_no_write_barrier(constant_pool_array_map()); | 4420 object->set_map_no_write_barrier(constant_pool_array_map()); |
4432 | 4421 |
4433 ConstantPoolArray* constant_pool = ConstantPoolArray::cast(object); | 4422 ConstantPoolArray* constant_pool = ConstantPoolArray::cast(object); |
4434 constant_pool->Init(small); | 4423 constant_pool->Init(small); |
4435 constant_pool->ClearPtrEntries(isolate()); | 4424 constant_pool->ClearPtrEntries(isolate()); |
4436 return constant_pool; | 4425 return constant_pool; |
4437 } | 4426 } |
4438 | 4427 |
4439 | 4428 |
4440 AllocationResult Heap::AllocateExtendedConstantPoolArray( | 4429 AllocationResult Heap::AllocateExtendedConstantPoolArray( |
4441 const ConstantPoolArray::NumberOfEntries& small, | 4430 const ConstantPoolArray::NumberOfEntries& small, |
4442 const ConstantPoolArray::NumberOfEntries& extended) { | 4431 const ConstantPoolArray::NumberOfEntries& extended) { |
4443 CHECK(small.are_in_range(0, ConstantPoolArray::kMaxSmallEntriesPerType)); | 4432 CHECK(small.are_in_range(0, ConstantPoolArray::kMaxSmallEntriesPerType)); |
4444 CHECK(extended.are_in_range(0, kMaxInt)); | 4433 CHECK(extended.are_in_range(0, kMaxInt)); |
4445 int size = ConstantPoolArray::SizeForExtended(small, extended); | 4434 int size = ConstantPoolArray::SizeForExtended(small, extended); |
4446 #ifndef V8_HOST_ARCH_64_BIT | |
4447 size += kPointerSize; | |
4448 #endif | |
4449 AllocationSpace space = SelectSpace(size, TENURED); | 4435 AllocationSpace space = SelectSpace(size, TENURED); |
4450 | 4436 |
4451 HeapObject* object; | 4437 HeapObject* object; |
4452 { | 4438 { |
4453 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE); | 4439 AllocationResult allocation = |
| 4440 AllocateRaw(size, space, OLD_SPACE, kDoubleAligned); |
4454 if (!allocation.To(&object)) return allocation; | 4441 if (!allocation.To(&object)) return allocation; |
4455 } | 4442 } |
4456 object = EnsureDoubleAligned(object, size); | |
4457 object->set_map_no_write_barrier(constant_pool_array_map()); | 4443 object->set_map_no_write_barrier(constant_pool_array_map()); |
4458 | 4444 |
4459 ConstantPoolArray* constant_pool = ConstantPoolArray::cast(object); | 4445 ConstantPoolArray* constant_pool = ConstantPoolArray::cast(object); |
4460 constant_pool->InitExtended(small, extended); | 4446 constant_pool->InitExtended(small, extended); |
4461 constant_pool->ClearPtrEntries(isolate()); | 4447 constant_pool->ClearPtrEntries(isolate()); |
4462 return constant_pool; | 4448 return constant_pool; |
4463 } | 4449 } |
4464 | 4450 |
4465 | 4451 |
4466 AllocationResult Heap::AllocateEmptyConstantPoolArray() { | 4452 AllocationResult Heap::AllocateEmptyConstantPoolArray() { |
(...skipping 2029 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6496 } | 6482 } |
6497 delete list; | 6483 delete list; |
6498 } else { | 6484 } else { |
6499 prev = list; | 6485 prev = list; |
6500 } | 6486 } |
6501 list = next; | 6487 list = next; |
6502 } | 6488 } |
6503 } | 6489 } |
6504 } | 6490 } |
6505 } // namespace v8::internal | 6491 } // namespace v8::internal |
OLD | NEW |