Handlify Heap::AllocateJSArrayStorage and friends.
R=yangguo@chromium.org Review URL: https://codereview.chromium.org/236983002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20735 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
4792f61042
commit
8178dbd1f7
@ -30,7 +30,9 @@ Handle<FixedArray> Factory::NewFixedArrayWithHoles(int size,
|
||||
ASSERT(0 <= size);
|
||||
CALL_HEAP_FUNCTION(
|
||||
isolate(),
|
||||
isolate()->heap()->AllocateFixedArrayWithHoles(size, pretenure),
|
||||
isolate()->heap()->AllocateFixedArrayWithFiller(size,
|
||||
pretenure,
|
||||
*the_hole_value()),
|
||||
FixedArray);
|
||||
}
|
||||
|
||||
@ -53,6 +55,18 @@ Handle<FixedDoubleArray> Factory::NewFixedDoubleArray(int size,
|
||||
}
|
||||
|
||||
|
||||
Handle<FixedDoubleArray> Factory::NewFixedDoubleArrayWithHoles(
|
||||
int size,
|
||||
PretenureFlag pretenure) {
|
||||
ASSERT(0 <= size);
|
||||
Handle<FixedDoubleArray> array = NewFixedDoubleArray(size, pretenure);
|
||||
for (int i = 0; i < size; ++i) {
|
||||
array->set_the_hole(i);
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
|
||||
Handle<ConstantPoolArray> Factory::NewConstantPoolArray(
|
||||
int number_of_int64_entries,
|
||||
int number_of_code_ptr_entries,
|
||||
@ -1446,14 +1460,38 @@ Handle<JSArray> Factory::NewJSArrayWithElements(Handle<FixedArrayBase> elements,
|
||||
|
||||
|
||||
void Factory::NewJSArrayStorage(Handle<JSArray> array,
|
||||
int length,
|
||||
int capacity,
|
||||
ArrayStorageAllocationMode mode) {
|
||||
CALL_HEAP_FUNCTION_VOID(isolate(),
|
||||
isolate()->heap()->AllocateJSArrayStorage(*array,
|
||||
length,
|
||||
capacity,
|
||||
mode));
|
||||
int length,
|
||||
int capacity,
|
||||
ArrayStorageAllocationMode mode) {
|
||||
ASSERT(capacity >= length);
|
||||
|
||||
if (capacity == 0) {
|
||||
array->set_length(Smi::FromInt(0));
|
||||
array->set_elements(*empty_fixed_array());
|
||||
return;
|
||||
}
|
||||
|
||||
Handle<FixedArrayBase> elms;
|
||||
ElementsKind elements_kind = array->GetElementsKind();
|
||||
if (IsFastDoubleElementsKind(elements_kind)) {
|
||||
if (mode == DONT_INITIALIZE_ARRAY_ELEMENTS) {
|
||||
elms = NewFixedDoubleArray(capacity);
|
||||
} else {
|
||||
ASSERT(mode == INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE);
|
||||
elms = NewFixedDoubleArrayWithHoles(capacity);
|
||||
}
|
||||
} else {
|
||||
ASSERT(IsFastSmiOrObjectElementsKind(elements_kind));
|
||||
if (mode == DONT_INITIALIZE_ARRAY_ELEMENTS) {
|
||||
elms = NewUninitializedFixedArray(capacity);
|
||||
} else {
|
||||
ASSERT(mode == INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE);
|
||||
elms = NewFixedArrayWithHoles(capacity);
|
||||
}
|
||||
}
|
||||
|
||||
array->set_elements(*elms);
|
||||
array->set_length(Smi::FromInt(length));
|
||||
}
|
||||
|
||||
|
||||
|
@ -32,6 +32,11 @@ class Factory V8_FINAL {
|
||||
int size,
|
||||
PretenureFlag pretenure = NOT_TENURED);
|
||||
|
||||
// Allocate a new fixed double array with hole values.
|
||||
Handle<FixedDoubleArray> NewFixedDoubleArrayWithHoles(
|
||||
int size,
|
||||
PretenureFlag pretenure = NOT_TENURED);
|
||||
|
||||
Handle<ConstantPoolArray> NewConstantPoolArray(
|
||||
int number_of_int64_entries,
|
||||
int number_of_code_ptr_entries,
|
||||
|
67
src/heap.cc
67
src/heap.cc
@ -4275,46 +4275,6 @@ MaybeObject* Heap::AllocateJSObject(JSFunction* constructor,
|
||||
}
|
||||
|
||||
|
||||
MaybeObject* Heap::AllocateJSArrayStorage(
|
||||
JSArray* array,
|
||||
int length,
|
||||
int capacity,
|
||||
ArrayStorageAllocationMode mode) {
|
||||
ASSERT(capacity >= length);
|
||||
|
||||
if (capacity == 0) {
|
||||
array->set_length(Smi::FromInt(0));
|
||||
array->set_elements(empty_fixed_array());
|
||||
return array;
|
||||
}
|
||||
|
||||
FixedArrayBase* elms;
|
||||
MaybeObject* maybe_elms = NULL;
|
||||
ElementsKind elements_kind = array->GetElementsKind();
|
||||
if (IsFastDoubleElementsKind(elements_kind)) {
|
||||
if (mode == DONT_INITIALIZE_ARRAY_ELEMENTS) {
|
||||
maybe_elms = AllocateUninitializedFixedDoubleArray(capacity);
|
||||
} else {
|
||||
ASSERT(mode == INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE);
|
||||
maybe_elms = AllocateFixedDoubleArrayWithHoles(capacity);
|
||||
}
|
||||
} else {
|
||||
ASSERT(IsFastSmiOrObjectElementsKind(elements_kind));
|
||||
if (mode == DONT_INITIALIZE_ARRAY_ELEMENTS) {
|
||||
maybe_elms = AllocateUninitializedFixedArray(capacity);
|
||||
} else {
|
||||
ASSERT(mode == INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE);
|
||||
maybe_elms = AllocateFixedArrayWithHoles(capacity);
|
||||
}
|
||||
}
|
||||
if (!maybe_elms->To(&elms)) return maybe_elms;
|
||||
|
||||
array->set_elements(elms);
|
||||
array->set_length(Smi::FromInt(length));
|
||||
return array;
|
||||
}
|
||||
|
||||
|
||||
MaybeObject* Heap::AllocateJSProxy(Object* handler, Object* prototype) {
|
||||
// Allocate map.
|
||||
// TODO(rossberg): Once we optimize proxies, think about a scheme to share
|
||||
@ -4937,12 +4897,6 @@ MaybeObject* Heap::AllocateFixedArray(int length, PretenureFlag pretenure) {
|
||||
}
|
||||
|
||||
|
||||
MaybeObject* Heap::AllocateFixedArrayWithHoles(int length,
|
||||
PretenureFlag pretenure) {
|
||||
return AllocateFixedArrayWithFiller(length, pretenure, the_hole_value());
|
||||
}
|
||||
|
||||
|
||||
MaybeObject* Heap::AllocateUninitializedFixedArray(int length) {
|
||||
if (length == 0) return empty_fixed_array();
|
||||
|
||||
@ -4990,27 +4944,6 @@ MaybeObject* Heap::AllocateUninitializedFixedDoubleArray(
|
||||
}
|
||||
|
||||
|
||||
MaybeObject* Heap::AllocateFixedDoubleArrayWithHoles(
|
||||
int length,
|
||||
PretenureFlag pretenure) {
|
||||
if (length == 0) return empty_fixed_array();
|
||||
|
||||
Object* elements_object;
|
||||
MaybeObject* maybe_obj = AllocateRawFixedDoubleArray(length, pretenure);
|
||||
if (!maybe_obj->ToObject(&elements_object)) return maybe_obj;
|
||||
FixedDoubleArray* elements =
|
||||
reinterpret_cast<FixedDoubleArray*>(elements_object);
|
||||
|
||||
for (int i = 0; i < length; ++i) {
|
||||
elements->set_the_hole(i);
|
||||
}
|
||||
|
||||
elements->set_map_no_write_barrier(fixed_double_array_map());
|
||||
elements->set_length(length);
|
||||
return elements;
|
||||
}
|
||||
|
||||
|
||||
MaybeObject* Heap::AllocateRawFixedDoubleArray(int length,
|
||||
PretenureFlag pretenure) {
|
||||
if (length < 0 || length > FixedDoubleArray::kMaxLength) {
|
||||
|
21
src/heap.h
21
src/heap.h
@ -716,12 +716,6 @@ class Heap {
|
||||
PretenureFlag pretenure = NOT_TENURED,
|
||||
AllocationSite* allocation_site = NULL);
|
||||
|
||||
MUST_USE_RESULT MaybeObject* AllocateJSArrayStorage(
|
||||
JSArray* array,
|
||||
int length,
|
||||
int capacity,
|
||||
ArrayStorageAllocationMode mode = DONT_INITIALIZE_ARRAY_ELEMENTS);
|
||||
|
||||
// Returns a deep copy of the JavaScript object.
|
||||
// Properties and elements are copied too.
|
||||
// Returns failure if allocation failed.
|
||||
@ -983,14 +977,6 @@ class Heap {
|
||||
MUST_USE_RESULT MaybeObject* CopyConstantPoolArrayWithMap(
|
||||
ConstantPoolArray* src, Map* map);
|
||||
|
||||
// Allocates a fixed array initialized with the hole values.
|
||||
// Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation
|
||||
// failed.
|
||||
// Please note this does not perform a garbage collection.
|
||||
MUST_USE_RESULT MaybeObject* AllocateFixedArrayWithHoles(
|
||||
int length,
|
||||
PretenureFlag pretenure = NOT_TENURED);
|
||||
|
||||
MUST_USE_RESULT MaybeObject* AllocateConstantPoolArray(
|
||||
int number_of_int64_entries,
|
||||
int number_of_code_ptr_entries,
|
||||
@ -1004,13 +990,6 @@ class Heap {
|
||||
int length,
|
||||
PretenureFlag pretenure = NOT_TENURED);
|
||||
|
||||
// Allocates a fixed double array with hole values. Returns
|
||||
// Failure::RetryAfterGC(requested_bytes, space) if the allocation failed.
|
||||
// Please note this does not perform a garbage collection.
|
||||
MUST_USE_RESULT MaybeObject* AllocateFixedDoubleArrayWithHoles(
|
||||
int length,
|
||||
PretenureFlag pretenure = NOT_TENURED);
|
||||
|
||||
// AllocateHashTable is identical to AllocateFixedArray except
|
||||
// that the resulting object has hash_table_map as map.
|
||||
MUST_USE_RESULT MaybeObject* AllocateHashTable(
|
||||
|
Loading…
Reference in New Issue
Block a user