Commit 537d1d89 authored by verwaest@chromium.org's avatar verwaest@chromium.org

Move CopyElements to the accessor of the target.

Review URL: https://chromiumcodereview.appspot.com/11416238

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13292 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent bccef0c7
...@@ -576,7 +576,7 @@ BUILTIN(ArrayPush) { ...@@ -576,7 +576,7 @@ BUILTIN(ArrayPush) {
ElementsAccessor* accessor = array->GetElementsAccessor(); ElementsAccessor* accessor = array->GetElementsAccessor();
MaybeObject* maybe_failure = accessor->CopyElements( MaybeObject* maybe_failure = accessor->CopyElements(
NULL, 0, new_elms, kind, 0, NULL, 0, kind, new_elms, 0,
ElementsAccessor::kCopyToEndAndInitializeToHole, elms_obj); ElementsAccessor::kCopyToEndAndInitializeToHole, elms_obj);
ASSERT(!maybe_failure->IsFailure()); ASSERT(!maybe_failure->IsFailure());
USE(maybe_failure); USE(maybe_failure);
...@@ -623,7 +623,7 @@ BUILTIN(ArrayPush) { ...@@ -623,7 +623,7 @@ BUILTIN(ArrayPush) {
ElementsAccessor* accessor = array->GetElementsAccessor(); ElementsAccessor* accessor = array->GetElementsAccessor();
MaybeObject* maybe_failure = accessor->CopyElements( MaybeObject* maybe_failure = accessor->CopyElements(
NULL, 0, new_elms, kind, 0, NULL, 0, kind, new_elms, 0,
ElementsAccessor::kCopyToEndAndInitializeToHole, elms_obj); ElementsAccessor::kCopyToEndAndInitializeToHole, elms_obj);
ASSERT(!maybe_failure->IsFailure()); ASSERT(!maybe_failure->IsFailure());
USE(maybe_failure); USE(maybe_failure);
...@@ -785,7 +785,7 @@ BUILTIN(ArrayUnshift) { ...@@ -785,7 +785,7 @@ BUILTIN(ArrayUnshift) {
ElementsKind kind = array->GetElementsKind(); ElementsKind kind = array->GetElementsKind();
ElementsAccessor* accessor = array->GetElementsAccessor(); ElementsAccessor* accessor = array->GetElementsAccessor();
MaybeObject* maybe_failure = accessor->CopyElements( MaybeObject* maybe_failure = accessor->CopyElements(
NULL, 0, new_elms, kind, to_add, NULL, 0, kind, new_elms, to_add,
ElementsAccessor::kCopyToEndAndInitializeToHole, elms); ElementsAccessor::kCopyToEndAndInitializeToHole, elms);
ASSERT(!maybe_failure->IsFailure()); ASSERT(!maybe_failure->IsFailure());
USE(maybe_failure); USE(maybe_failure);
...@@ -934,9 +934,8 @@ BUILTIN(ArraySlice) { ...@@ -934,9 +934,8 @@ BUILTIN(ArraySlice) {
if (!maybe_array->To(&result_array)) return maybe_array; if (!maybe_array->To(&result_array)) return maybe_array;
ElementsAccessor* accessor = object->GetElementsAccessor(); ElementsAccessor* accessor = object->GetElementsAccessor();
MaybeObject* maybe_failure = MaybeObject* maybe_failure = accessor->CopyElements(
accessor->CopyElements(NULL, k, result_array->elements(), NULL, k, kind, result_array->elements(), 0, result_len, elms);
kind, 0, result_len, elms);
ASSERT(!maybe_failure->IsFailure()); ASSERT(!maybe_failure->IsFailure());
USE(maybe_failure); USE(maybe_failure);
...@@ -1037,9 +1036,9 @@ BUILTIN(ArraySplice) { ...@@ -1037,9 +1036,9 @@ BUILTIN(ArraySplice) {
if (actual_delete_count > 0) { if (actual_delete_count > 0) {
AssertNoAllocation no_gc; AssertNoAllocation no_gc;
ElementsAccessor* accessor = array->GetElementsAccessor(); ElementsAccessor* accessor = array->GetElementsAccessor();
MaybeObject* maybe_failure = MaybeObject* maybe_failure = accessor->CopyElements(
accessor->CopyElements(NULL, actual_start, result_array->elements(), NULL, actual_start, elements_kind, result_array->elements(),
elements_kind, 0, actual_delete_count, elms_obj); 0, actual_delete_count, elms_obj);
// Cannot fail since the origin and target array are of the same elements // Cannot fail since the origin and target array are of the same elements
// kind. // kind.
ASSERT(!maybe_failure->IsFailure()); ASSERT(!maybe_failure->IsFailure());
...@@ -1105,12 +1104,12 @@ BUILTIN(ArraySplice) { ...@@ -1105,12 +1104,12 @@ BUILTIN(ArraySplice) {
if (actual_start > 0) { if (actual_start > 0) {
// Copy the part before actual_start as is. // Copy the part before actual_start as is.
MaybeObject* maybe_failure = accessor->CopyElements( MaybeObject* maybe_failure = accessor->CopyElements(
NULL, 0, new_elms, kind, 0, actual_start, elms); NULL, 0, kind, new_elms, 0, actual_start, elms);
ASSERT(!maybe_failure->IsFailure()); ASSERT(!maybe_failure->IsFailure());
USE(maybe_failure); USE(maybe_failure);
} }
MaybeObject* maybe_failure = accessor->CopyElements( MaybeObject* maybe_failure = accessor->CopyElements(
NULL, actual_start + actual_delete_count, new_elms, kind, NULL, actual_start + actual_delete_count, kind, new_elms,
actual_start + item_count, actual_start + item_count,
ElementsAccessor::kCopyToEndAndInitializeToHole, elms); ElementsAccessor::kCopyToEndAndInitializeToHole, elms);
ASSERT(!maybe_failure->IsFailure()); ASSERT(!maybe_failure->IsFailure());
...@@ -1220,13 +1219,14 @@ BUILTIN(ArrayConcat) { ...@@ -1220,13 +1219,14 @@ BUILTIN(ArrayConcat) {
int j = 0; int j = 0;
FixedArrayBase* storage = result_array->elements(); FixedArrayBase* storage = result_array->elements();
ElementsAccessor* accessor = ElementsAccessor::ForKind(elements_kind);
for (int i = 0; i < n_arguments; i++) { for (int i = 0; i < n_arguments; i++) {
JSArray* array = JSArray::cast(args[i]); JSArray* array = JSArray::cast(args[i]);
int len = Smi::cast(array->length())->value(); int len = Smi::cast(array->length())->value();
ElementsKind from_kind = array->GetElementsKind();
if (len > 0) { if (len > 0) {
ElementsAccessor* accessor = array->GetElementsAccessor();
MaybeObject* maybe_failure = MaybeObject* maybe_failure =
accessor->CopyElements(array, 0, storage, elements_kind, j, len); accessor->CopyElements(array, 0, from_kind, storage, j, len);
if (maybe_failure->IsFailure()) return maybe_failure; if (maybe_failure->IsFailure()) return maybe_failure;
j += len; j += len;
} }
......
This diff is collapsed.
...@@ -143,17 +143,17 @@ class ElementsAccessor { ...@@ -143,17 +143,17 @@ class ElementsAccessor {
MUST_USE_RESULT virtual MaybeObject* CopyElements( MUST_USE_RESULT virtual MaybeObject* CopyElements(
JSObject* source_holder, JSObject* source_holder,
uint32_t source_start, uint32_t source_start,
ElementsKind source_kind,
FixedArrayBase* destination, FixedArrayBase* destination,
ElementsKind destination_kind,
uint32_t destination_start, uint32_t destination_start,
int copy_size, int copy_size,
FixedArrayBase* source = NULL) = 0; FixedArrayBase* source = NULL) = 0;
MUST_USE_RESULT MaybeObject* CopyElements(JSObject* from_holder, MUST_USE_RESULT MaybeObject* CopyElements(JSObject* from_holder,
FixedArrayBase* to, FixedArrayBase* to,
ElementsKind to_kind, ElementsKind from_kind,
FixedArrayBase* from = NULL) { FixedArrayBase* from = NULL) {
return CopyElements(from_holder, 0, to, to_kind, 0, return CopyElements(from_holder, 0, from_kind, to, 0,
kCopyToEndAndInitializeToHole, from); kCopyToEndAndInitializeToHole, from);
} }
......
...@@ -9609,9 +9609,9 @@ MaybeObject* JSObject::SetFastElementsCapacityAndLength( ...@@ -9609,9 +9609,9 @@ MaybeObject* JSObject::SetFastElementsCapacityAndLength(
} }
} }
FixedArrayBase* old_elements = elements(); FixedArrayBase* old_elements = elements();
ElementsAccessor* accessor = ElementsAccessor::ForKind(elements_kind); ElementsAccessor* accessor = ElementsAccessor::ForKind(new_elements_kind);
MaybeObject* maybe_obj = MaybeObject* maybe_obj =
accessor->CopyElements(this, new_elements, new_elements_kind); accessor->CopyElements(this, new_elements, elements_kind);
if (maybe_obj->IsFailure()) return maybe_obj; if (maybe_obj->IsFailure()) return maybe_obj;
if (elements_kind != NON_STRICT_ARGUMENTS_ELEMENTS) { if (elements_kind != NON_STRICT_ARGUMENTS_ELEMENTS) {
...@@ -9669,9 +9669,9 @@ MaybeObject* JSObject::SetFastDoubleElementsCapacityAndLength( ...@@ -9669,9 +9669,9 @@ MaybeObject* JSObject::SetFastDoubleElementsCapacityAndLength(
} }
FixedArrayBase* old_elements = elements(); FixedArrayBase* old_elements = elements();
ElementsAccessor* accessor = ElementsAccessor::ForKind(elements_kind); ElementsAccessor* accessor = ElementsAccessor::ForKind(FAST_DOUBLE_ELEMENTS);
{ MaybeObject* maybe_obj = { MaybeObject* maybe_obj =
accessor->CopyElements(this, elems, FAST_DOUBLE_ELEMENTS); accessor->CopyElements(this, elems, elements_kind);
if (maybe_obj->IsFailure()) return maybe_obj; if (maybe_obj->IsFailure()) return maybe_obj;
} }
if (elements_kind != NON_STRICT_ARGUMENTS_ELEMENTS) { if (elements_kind != NON_STRICT_ARGUMENTS_ELEMENTS) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment