Chromium Code Reviews| Index: src/builtins.cc |
| diff --git a/src/builtins.cc b/src/builtins.cc |
| index 43cf358d4fdeb195699866bef5503d39d8c9191c..0ca7864cb35e580959c543e3a5372ecf6debbf64 100644 |
| --- a/src/builtins.cc |
| +++ b/src/builtins.cc |
| @@ -233,30 +233,59 @@ BUILTIN(ArrayCodeGeneric) { |
| return array->Initialize(JSArray::kPreallocatedArrayElements); |
| } |
| - // Take the arguments as elements. |
| - int number_of_elements = args.length() - 1; |
| - Smi* len = Smi::FromInt(number_of_elements); |
| - Object* obj; |
| - { MaybeObject* maybe_obj = heap->AllocateFixedArrayWithHoles(len->value()); |
| - if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| - } |
| - |
| // Set length and elements on the array. |
| + int number_of_elements = args.length() - 1; |
| + array->set_length(Smi::FromInt(0)); |
|
Jakob Kummerow
2011/12/07 17:02:47
A comment explaining why the length must be set to
danno
2011/12/08 15:09:09
It's actually unneeded. Removed.
On 2011/12/07 17:
|
| MaybeObject* maybe_object = |
| - array->EnsureCanContainElements(FixedArray::cast(obj)); |
| + array->EnsureCanContainElements(&args, 1, number_of_elements, |
| + ALLOW_CONVERTED_DOUBLE_ELEMENTS); |
| if (maybe_object->IsFailure()) return maybe_object; |
| - AssertNoAllocation no_gc; |
| - FixedArray* elms = FixedArray::cast(obj); |
| - WriteBarrierMode mode = elms->GetWriteBarrierMode(no_gc); |
| - // Fill in the content |
| - for (int index = 0; index < number_of_elements; index++) { |
| - elms->set(index, args[index+1], mode); |
| + // Allocate an appropriately typed elements array. |
| + Object* obj; |
| + MaybeObject* maybe_obj; |
| + ElementsKind elements_kind = array->GetElementsKind(); |
| + if (elements_kind == FAST_DOUBLE_ELEMENTS) { |
| + maybe_obj = heap->AllocateUninitializedFixedDoubleArray( |
| + number_of_elements); |
| + } else { |
| + maybe_obj = heap->AllocateFixedArrayWithHoles(number_of_elements); |
| } |
| + if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| + FixedArrayBase* elms = FixedArrayBase::cast(obj); |
|
Jakob Kummerow
2011/12/07 17:02:47
Thanks to templates, you can clean this up a littl
danno
2011/12/08 15:09:09
Done.
|
| - array->set_elements(FixedArray::cast(obj)); |
| - array->set_length(len); |
| + // Fill in the content |
| + switch (array->GetElementsKind()) { |
| + case FAST_SMI_ONLY_ELEMENTS: { |
| + FixedArray* smi_elms = FixedArray::cast(elms); |
| + for (int index = 0; index < number_of_elements; index++) { |
| + smi_elms->set(index, args[index+1], SKIP_WRITE_BARRIER); |
| + } |
| + break; |
| + } |
| + case FAST_ELEMENTS: { |
| + AssertNoAllocation no_gc; |
| + WriteBarrierMode mode = elms->GetWriteBarrierMode(no_gc); |
| + FixedArray* object_elms = FixedArray::cast(elms); |
| + for (int index = 0; index < number_of_elements; index++) { |
| + object_elms->set(index, args[index+1], mode); |
| + } |
| + break; |
| + } |
| + case FAST_DOUBLE_ELEMENTS: { |
| + FixedDoubleArray* double_elms = FixedDoubleArray::cast(elms); |
| + for (int index = 0; index < number_of_elements; index++) { |
| + double_elms->set(index, args[index+1]->Number()); |
| + } |
| + break; |
| + } |
| + default: |
| + UNREACHABLE(); |
| + break; |
| + } |
| + array->set_elements(elms); |
| + array->set_length(Smi::FromInt(number_of_elements)); |
| return array; |
| } |
| @@ -424,7 +453,8 @@ static inline MaybeObject* EnsureJSArrayWithWritableFastElements( |
| MaybeObject* maybe_array = array->EnsureCanContainElements( |
| args, |
| first_added_arg, |
| - args_length - first_added_arg); |
| + args_length - first_added_arg, |
| + DONT_ALLOW_DOUBLE_ELEMENTS); |
| if (maybe_array->IsFailure()) return maybe_array; |
| return array->elements(); |
| } |
| @@ -627,7 +657,8 @@ BUILTIN(ArrayUnshift) { |
| ASSERT(to_add <= (Smi::kMaxValue - len)); |
| MaybeObject* maybe_object = |
| - array->EnsureCanContainElements(&args, 1, to_add); |
| + array->EnsureCanContainElements(&args, 1, to_add, |
| + DONT_ALLOW_DOUBLE_ELEMENTS); |
| if (maybe_object->IsFailure()) return maybe_object; |
| if (new_length > elms->length()) { |
| @@ -758,7 +789,8 @@ BUILTIN(ArraySlice) { |
| FixedArray* result_elms = FixedArray::cast(result); |
| MaybeObject* maybe_object = |
| - result_array->EnsureCanContainElements(result_elms); |
| + result_array->EnsureCanContainElements(result_elms, |
| + DONT_ALLOW_DOUBLE_ELEMENTS); |
| if (maybe_object->IsFailure()) return maybe_object; |
| AssertNoAllocation no_gc; |
| @@ -1022,7 +1054,7 @@ BUILTIN(ArrayConcat) { |
| for (int i = 0; i < n_arguments; i++) { |
| JSArray* array = JSArray::cast(args[i]); |
| if (!array->HasFastSmiOnlyElements()) { |
| - result_array->EnsureCanContainNonSmiElements(); |
| + result_array->EnsureCanContainHeapObjectElements(); |
| break; |
| } |
| } |