Index: src/elements.cc |
diff --git a/src/elements.cc b/src/elements.cc |
index 79f58735ff2d7b9426f2bed5a280e1bbcd5a6dd1..710ad8567ed662eedeb860c4661e94fb6222a537 100644 |
--- a/src/elements.cc |
+++ b/src/elements.cc |
@@ -686,7 +686,7 @@ class ElementsAccessorBase : public ElementsAccessor { |
MUST_USE_RESULT static MaybeObject* CopyElementsImpl(FixedArrayBase* from, |
uint32_t from_start, |
FixedArrayBase* to, |
- ElementsKind to_kind, |
+ ElementsKind from_kind, |
uint32_t to_start, |
int packed_size, |
int copy_size) { |
@@ -696,8 +696,8 @@ class ElementsAccessorBase : public ElementsAccessor { |
MUST_USE_RESULT virtual MaybeObject* CopyElements(JSObject* from_holder, |
uint32_t from_start, |
+ ElementsKind from_kind, |
FixedArrayBase* to, |
- ElementsKind to_kind, |
uint32_t to_start, |
int copy_size, |
FixedArrayBase* from) { |
@@ -707,8 +707,7 @@ class ElementsAccessorBase : public ElementsAccessor { |
} |
if (from_holder) { |
- ElementsKind elements_kind = from_holder->GetElementsKind(); |
- bool is_packed = IsFastPackedElementsKind(elements_kind) && |
+ bool is_packed = IsFastPackedElementsKind(from_kind) && |
from_holder->IsJSArray(); |
if (is_packed) { |
packed_size = Smi::cast(JSArray::cast(from_holder)->length())->value(); |
@@ -718,7 +717,7 @@ class ElementsAccessorBase : public ElementsAccessor { |
} |
} |
return ElementsAccessorSubclass::CopyElementsImpl( |
- from, from_start, to, to_kind, to_start, packed_size, copy_size); |
+ from, from_start, to, from_kind, to_start, packed_size, copy_size); |
} |
MUST_USE_RESULT virtual MaybeObject* AddElementsToFixedArray( |
@@ -1003,6 +1002,41 @@ class FastElementsAccessor |
}; |
+static ElementsKind ElementsKindForArray(FixedArrayBase* array) { |
danno
2012/12/11 17:07:04
Not sure how performance sensitive this is, but ho
Toon Verwaest
2012/12/14 12:39:12
Done.
|
+ switch (array->map()->instance_type()) { |
+ case FIXED_ARRAY_TYPE: |
+ if (array->IsDictionary()) { |
+ return DICTIONARY_ELEMENTS; |
+ } else { |
+ return FAST_HOLEY_ELEMENTS; |
+ } |
+ case FIXED_DOUBLE_ARRAY_TYPE: |
+ return FAST_HOLEY_DOUBLE_ELEMENTS; |
danno
2012/12/11 17:07:04
How about a lookup array instead of the switch for
Toon Verwaest
2012/12/14 12:39:12
The problem is that this switches over instances t
|
+ case EXTERNAL_BYTE_ARRAY_TYPE: |
+ return EXTERNAL_BYTE_ELEMENTS; |
+ case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE: |
+ return EXTERNAL_UNSIGNED_BYTE_ELEMENTS; |
+ case EXTERNAL_SHORT_ARRAY_TYPE: |
+ return EXTERNAL_SHORT_ELEMENTS; |
+ case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE: |
+ return EXTERNAL_UNSIGNED_SHORT_ELEMENTS; |
+ case EXTERNAL_INT_ARRAY_TYPE: |
+ return EXTERNAL_INT_ELEMENTS; |
+ case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE: |
+ return EXTERNAL_UNSIGNED_INT_ELEMENTS; |
+ case EXTERNAL_FLOAT_ARRAY_TYPE: |
+ return EXTERNAL_FLOAT_ELEMENTS; |
+ case EXTERNAL_DOUBLE_ARRAY_TYPE: |
+ return EXTERNAL_DOUBLE_ELEMENTS; |
+ case EXTERNAL_PIXEL_ARRAY_TYPE: |
+ return EXTERNAL_PIXEL_ELEMENTS; |
+ default: |
+ UNREACHABLE(); |
+ } |
+ return FAST_HOLEY_ELEMENTS; |
+} |
+ |
+ |
template<typename FastElementsAccessorSubclass, |
typename KindTraits> |
class FastSmiOrObjectElementsAccessor |
@@ -1018,29 +1052,49 @@ class FastSmiOrObjectElementsAccessor |
static MaybeObject* CopyElementsImpl(FixedArrayBase* from, |
uint32_t from_start, |
FixedArrayBase* to, |
- ElementsKind to_kind, |
+ ElementsKind from_kind, |
uint32_t to_start, |
int packed_size, |
int copy_size) { |
- if (IsFastSmiOrObjectElementsKind(to_kind)) { |
- CopyObjectToObjectElements( |
- from, KindTraits::Kind, from_start, to, to_kind, to_start, copy_size); |
- } else if (IsFastDoubleElementsKind(to_kind)) { |
- if (IsFastSmiElementsKind(KindTraits::Kind)) { |
- if (IsFastPackedElementsKind(KindTraits::Kind) && |
- packed_size != kPackedSizeNotKnown) { |
- CopyPackedSmiToDoubleElements( |
- from, from_start, to, to_start, packed_size, copy_size); |
- } else { |
- CopySmiToDoubleElements(from, from_start, to, to_start, copy_size); |
- } |
- } else { |
- CopyObjectToDoubleElements(from, from_start, to, to_start, copy_size); |
+ ElementsKind to_kind = KindTraits::Kind; |
+ switch (from_kind) { |
+ case FAST_SMI_ELEMENTS: |
+ case FAST_HOLEY_SMI_ELEMENTS: |
+ case FAST_ELEMENTS: |
+ case FAST_HOLEY_ELEMENTS: |
+ CopyObjectToObjectElements( |
+ from, from_kind, from_start, to, to_kind, to_start, copy_size); |
+ return to->GetHeap()->undefined_value(); |
+ case FAST_DOUBLE_ELEMENTS: |
+ case FAST_HOLEY_DOUBLE_ELEMENTS: |
+ return CopyDoubleToObjectElements( |
+ from, from_start, to, to_kind, to_start, copy_size); |
+ case DICTIONARY_ELEMENTS: |
+ CopyDictionaryToObjectElements( |
+ from, from_start, to, to_kind, to_start, copy_size); |
+ return to->GetHeap()->undefined_value(); |
+ case NON_STRICT_ARGUMENTS_ELEMENTS: { |
+ // TODO(verwaest): This is a temporary hack to support extending |
+ // NON_STRICT_ARGUMENTS_ELEMENTS in SetFastElementsCapacityAndLength. |
+ // This case should be UNREACHABLE(). |
danno
2012/12/11 17:07:04
Yikes, this is totally scary.
Toon Verwaest
2012/12/14 12:39:12
Indeed. This should be cleaned up sometime; but th
|
+ FixedArray* parameter_map = FixedArray::cast(from); |
+ FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1)); |
+ ElementsKind from_kind = ElementsKindForArray(arguments); |
+ return CopyElementsImpl(arguments, from_start, to, from_kind, |
+ to_start, packed_size, copy_size); |
} |
- } else { |
- UNREACHABLE(); |
+ case EXTERNAL_BYTE_ELEMENTS: |
+ case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
+ case EXTERNAL_SHORT_ELEMENTS: |
+ case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
+ case EXTERNAL_INT_ELEMENTS: |
+ case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
+ case EXTERNAL_FLOAT_ELEMENTS: |
+ case EXTERNAL_DOUBLE_ELEMENTS: |
+ case EXTERNAL_PIXEL_ELEMENTS: |
+ UNREACHABLE(); |
} |
- return to->GetHeap()->undefined_value(); |
+ return NULL; |
} |
@@ -1129,22 +1183,40 @@ class FastDoubleElementsAccessor |
static MaybeObject* CopyElementsImpl(FixedArrayBase* from, |
uint32_t from_start, |
FixedArrayBase* to, |
- ElementsKind to_kind, |
+ ElementsKind from_kind, |
uint32_t to_start, |
int packed_size, |
int copy_size) { |
- switch (to_kind) { |
+ switch (from_kind) { |
case FAST_SMI_ELEMENTS: |
- case FAST_ELEMENTS: |
+ CopyPackedSmiToDoubleElements( |
+ from, from_start, to, to_start, packed_size, copy_size); |
+ break; |
case FAST_HOLEY_SMI_ELEMENTS: |
- case FAST_HOLEY_ELEMENTS: |
- return CopyDoubleToObjectElements( |
- from, from_start, to, to_kind, to_start, copy_size); |
+ CopySmiToDoubleElements(from, from_start, to, to_start, copy_size); |
+ break; |
case FAST_DOUBLE_ELEMENTS: |
case FAST_HOLEY_DOUBLE_ELEMENTS: |
CopyDoubleToDoubleElements(from, from_start, to, to_start, copy_size); |
- return from; |
- default: |
+ break; |
+ case FAST_ELEMENTS: |
+ case FAST_HOLEY_ELEMENTS: |
+ CopyObjectToDoubleElements(from, from_start, to, to_start, copy_size); |
+ break; |
+ case DICTIONARY_ELEMENTS: |
+ CopyDictionaryToDoubleElements( |
+ from, from_start, to, to_start, copy_size); |
+ break; |
+ case NON_STRICT_ARGUMENTS_ELEMENTS: |
+ case EXTERNAL_BYTE_ELEMENTS: |
+ case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
+ case EXTERNAL_SHORT_ELEMENTS: |
+ case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
+ case EXTERNAL_INT_ELEMENTS: |
+ case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
+ case EXTERNAL_FLOAT_ELEMENTS: |
+ case EXTERNAL_DOUBLE_ELEMENTS: |
+ case EXTERNAL_PIXEL_ELEMENTS: |
UNREACHABLE(); |
} |
return to->GetHeap()->undefined_value(); |
@@ -1460,27 +1532,12 @@ class DictionaryElementsAccessor |
MUST_USE_RESULT static MaybeObject* CopyElementsImpl(FixedArrayBase* from, |
uint32_t from_start, |
FixedArrayBase* to, |
- ElementsKind to_kind, |
+ ElementsKind from_kind, |
uint32_t to_start, |
int packed_size, |
int copy_size) { |
- switch (to_kind) { |
- case FAST_SMI_ELEMENTS: |
- case FAST_ELEMENTS: |
- case FAST_HOLEY_SMI_ELEMENTS: |
- case FAST_HOLEY_ELEMENTS: |
- CopyDictionaryToObjectElements( |
- from, from_start, to, to_kind, to_start, copy_size); |
- return from; |
- case FAST_DOUBLE_ELEMENTS: |
- case FAST_HOLEY_DOUBLE_ELEMENTS: |
- CopyDictionaryToDoubleElements( |
- from, from_start, to, to_start, copy_size); |
- return from; |
- default: |
- UNREACHABLE(); |
- } |
- return to->GetHeap()->undefined_value(); |
+ UNREACHABLE(); |
+ return NULL; |
} |
@@ -1707,15 +1764,12 @@ class NonStrictArgumentsElementsAccessor : public ElementsAccessorBase< |
MUST_USE_RESULT static MaybeObject* CopyElementsImpl(FixedArrayBase* from, |
uint32_t from_start, |
FixedArrayBase* to, |
- ElementsKind to_kind, |
+ ElementsKind from_kind, |
uint32_t to_start, |
int packed_size, |
int copy_size) { |
- FixedArray* parameter_map = FixedArray::cast(from); |
- FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1)); |
- ElementsAccessor* accessor = ElementsAccessor::ForArray(arguments); |
- return accessor->CopyElements(NULL, from_start, to, to_kind, |
- to_start, copy_size, arguments); |
+ UNREACHABLE(); |
+ return NULL; |
} |
static uint32_t GetCapacityImpl(FixedArrayBase* backing_store) { |
@@ -1761,35 +1815,7 @@ class NonStrictArgumentsElementsAccessor : public ElementsAccessorBase< |
ElementsAccessor* ElementsAccessor::ForArray(FixedArrayBase* array) { |
- switch (array->map()->instance_type()) { |
- case FIXED_ARRAY_TYPE: |
- if (array->IsDictionary()) { |
- return elements_accessors_[DICTIONARY_ELEMENTS]; |
- } else { |
- return elements_accessors_[FAST_HOLEY_ELEMENTS]; |
- } |
- case EXTERNAL_BYTE_ARRAY_TYPE: |
- return elements_accessors_[EXTERNAL_BYTE_ELEMENTS]; |
- case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE: |
- return elements_accessors_[EXTERNAL_UNSIGNED_BYTE_ELEMENTS]; |
- case EXTERNAL_SHORT_ARRAY_TYPE: |
- return elements_accessors_[EXTERNAL_SHORT_ELEMENTS]; |
- case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE: |
- return elements_accessors_[EXTERNAL_UNSIGNED_SHORT_ELEMENTS]; |
- case EXTERNAL_INT_ARRAY_TYPE: |
- return elements_accessors_[EXTERNAL_INT_ELEMENTS]; |
- case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE: |
- return elements_accessors_[EXTERNAL_UNSIGNED_INT_ELEMENTS]; |
- case EXTERNAL_FLOAT_ARRAY_TYPE: |
- return elements_accessors_[EXTERNAL_FLOAT_ELEMENTS]; |
- case EXTERNAL_DOUBLE_ARRAY_TYPE: |
- return elements_accessors_[EXTERNAL_DOUBLE_ELEMENTS]; |
- case EXTERNAL_PIXEL_ARRAY_TYPE: |
- return elements_accessors_[EXTERNAL_PIXEL_ELEMENTS]; |
- default: |
- UNREACHABLE(); |
- return NULL; |
- } |
+ return elements_accessors_[ElementsKindForArray(array)]; |
} |