Index: src/elements.cc |
diff --git a/src/elements.cc b/src/elements.cc |
index 0b745c4505fc2fa40b32bc472eb2f405f4eefed5..5bce3b99bd961fe0f3aa1e20b71fc2965cb3ef2d 100644 |
--- a/src/elements.cc |
+++ b/src/elements.cc |
@@ -48,7 +48,7 @@ |
// - FastDoubleElementsAccessor |
// - FastPackedDoubleElementsAccessor |
// - FastHoleyDoubleElementsAccessor |
-// - ExternalElementsAccessor (abstract) |
+// - TypedElementsAccessor (abstract) |
// - ExternalByteElementsAccessor |
// - ExternalUnsignedByteElementsAccessor |
// - ExternalShortElementsAccessor |
@@ -58,6 +58,15 @@ |
// - ExternalFloatElementsAccessor |
// - ExternalDoubleElementsAccessor |
// - PixelElementsAccessor |
+// - FixedUint8ArrayAccessor |
+// - FixedInt8ArrayAccessor |
+// - FixedUint16ArrayAccessor |
+// - FixedInt16ArrayAccessor |
+// - FixedUint32ArrayAccessor |
+// - FixedInt32ArrayAccessor |
+// - FixedFloat32ArrayAccessor |
+// - FixedFloat64ArrayAccessor |
+// - FixedUint8ClampedArrayAccessor |
// - DictionaryElementsAccessor |
// - NonStrictArgumentsElementsAccessor |
@@ -104,7 +113,17 @@ static const int kPackedSizeNotKnown = -1; |
EXTERNAL_FLOAT_ELEMENTS, ExternalFloatArray) \ |
V(ExternalDoubleElementsAccessor, \ |
EXTERNAL_DOUBLE_ELEMENTS, ExternalDoubleArray) \ |
- V(PixelElementsAccessor, EXTERNAL_PIXEL_ELEMENTS, ExternalPixelArray) |
+ V(PixelElementsAccessor, EXTERNAL_PIXEL_ELEMENTS, ExternalPixelArray) \ |
+ V(FixedUint8ArrayAccessor, UINT8_ELEMENTS, FixedUint8Array) \ |
+ V(FixedInt8ArrayAccessor, INT8_ELEMENTS, FixedInt8Array) \ |
+ V(FixedUint16ArrayAccessor, UINT16_ELEMENTS, FixedUint16Array) \ |
+ V(FixedInt16ArrayAccessor, INT16_ELEMENTS, FixedInt16Array) \ |
+ V(FixedUint32ArrayAccessor, UINT32_ELEMENTS, FixedUint32Array) \ |
+ V(FixedInt32ArrayAccessor, INT32_ELEMENTS, FixedInt32Array) \ |
+ V(FixedFloat32ArrayAccessor, FLOAT32_ELEMENTS, FixedFloat32Array) \ |
+ V(FixedFloat64ArrayAccessor, FLOAT64_ELEMENTS, FixedFloat64Array) \ |
+ V(FixedUint8ClampedArrayAccessor, UINT8_CLAMPED_ELEMENTS, \ |
+ FixedUint8ClampedArray) |
template<ElementsKind Kind> class ElementsKindTraits { |
@@ -1096,6 +1115,26 @@ static inline ElementsKind ElementsKindForArray(FixedArrayBase* array) { |
return EXTERNAL_DOUBLE_ELEMENTS; |
case EXTERNAL_PIXEL_ARRAY_TYPE: |
return EXTERNAL_PIXEL_ELEMENTS; |
+ |
+ case FIXED_UINT8_ARRAY_TYPE: |
+ return UINT8_ELEMENTS; |
+ case FIXED_INT8_ARRAY_TYPE: |
+ return INT8_ELEMENTS; |
+ case FIXED_UINT16_ARRAY_TYPE: |
+ return UINT16_ELEMENTS; |
+ case FIXED_INT16_ARRAY_TYPE: |
+ return INT16_ELEMENTS; |
+ case FIXED_UINT32_ARRAY_TYPE: |
+ return UINT32_ELEMENTS; |
+ case FIXED_INT32_ARRAY_TYPE: |
+ return INT32_ELEMENTS; |
+ case FIXED_FLOAT32_ARRAY_TYPE: |
+ return FLOAT32_ELEMENTS; |
+ case FIXED_FLOAT64_ARRAY_TYPE: |
+ return FLOAT64_ELEMENTS; |
+ case FIXED_UINT8_CLAMPED_ARRAY_TYPE: |
+ return UINT8_CLAMPED_ELEMENTS; |
+ |
default: |
UNREACHABLE(); |
} |
@@ -1158,6 +1197,15 @@ class FastSmiOrObjectElementsAccessor |
case EXTERNAL_FLOAT_ELEMENTS: |
case EXTERNAL_DOUBLE_ELEMENTS: |
case EXTERNAL_PIXEL_ELEMENTS: |
+ case UINT8_ELEMENTS: |
+ case INT8_ELEMENTS: |
+ case UINT16_ELEMENTS: |
+ case INT16_ELEMENTS: |
+ case UINT32_ELEMENTS: |
+ case INT32_ELEMENTS: |
+ case FLOAT32_ELEMENTS: |
+ case FLOAT64_ELEMENTS: |
+ case UINT8_CLAMPED_ELEMENTS: |
UNREACHABLE(); |
} |
return NULL; |
@@ -1283,6 +1331,15 @@ class FastDoubleElementsAccessor |
case EXTERNAL_FLOAT_ELEMENTS: |
case EXTERNAL_DOUBLE_ELEMENTS: |
case EXTERNAL_PIXEL_ELEMENTS: |
+ case UINT8_ELEMENTS: |
+ case INT8_ELEMENTS: |
+ case UINT16_ELEMENTS: |
+ case INT16_ELEMENTS: |
+ case UINT32_ELEMENTS: |
+ case INT32_ELEMENTS: |
+ case FLOAT32_ELEMENTS: |
+ case FLOAT64_ELEMENTS: |
+ case UINT8_CLAMPED_ELEMENTS: |
UNREACHABLE(); |
} |
return to->GetHeap()->undefined_value(); |
@@ -1320,20 +1377,20 @@ class FastHoleyDoubleElementsAccessor |
// Super class for all external element arrays. |
-template<typename ExternalElementsAccessorSubclass, |
+template<typename AccessorSubclass, |
ElementsKind Kind> |
-class ExternalElementsAccessor |
- : public ElementsAccessorBase<ExternalElementsAccessorSubclass, |
+class TypedElementsAccessor |
+ : public ElementsAccessorBase<AccessorSubclass, |
ElementsKindTraits<Kind> > { |
public: |
- explicit ExternalElementsAccessor(const char* name) |
- : ElementsAccessorBase<ExternalElementsAccessorSubclass, |
+ explicit TypedElementsAccessor(const char* name) |
+ : ElementsAccessorBase<AccessorSubclass, |
ElementsKindTraits<Kind> >(name) {} |
protected: |
typedef typename ElementsKindTraits<Kind>::BackingStore BackingStore; |
- friend class ElementsAccessorBase<ExternalElementsAccessorSubclass, |
+ friend class ElementsAccessorBase<AccessorSubclass, |
ElementsKindTraits<Kind> >; |
MUST_USE_RESULT static MaybeObject* GetImpl(Object* receiver, |
@@ -1341,7 +1398,7 @@ class ExternalElementsAccessor |
uint32_t key, |
FixedArrayBase* backing_store) { |
return |
- key < ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store) |
+ key < AccessorSubclass::GetCapacityImpl(backing_store) |
? BackingStore::cast(backing_store)->get(key) |
: backing_store->GetHeap()->undefined_value(); |
} |
@@ -1352,7 +1409,7 @@ class ExternalElementsAccessor |
uint32_t key, |
FixedArrayBase* backing_store) { |
return |
- key < ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store) |
+ key < AccessorSubclass::GetCapacityImpl(backing_store) |
? NONE : ABSENT; |
} |
@@ -1362,7 +1419,7 @@ class ExternalElementsAccessor |
uint32_t key, |
FixedArrayBase* backing_store) { |
return |
- key < ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store) |
+ key < AccessorSubclass::GetCapacityImpl(backing_store) |
? FIELD : NONEXISTENT; |
} |
@@ -1387,101 +1444,175 @@ class ExternalElementsAccessor |
uint32_t key, |
FixedArrayBase* backing_store) { |
uint32_t capacity = |
- ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store); |
+ AccessorSubclass::GetCapacityImpl(backing_store); |
return key < capacity; |
} |
}; |
class ExternalByteElementsAccessor |
- : public ExternalElementsAccessor<ExternalByteElementsAccessor, |
- EXTERNAL_BYTE_ELEMENTS> { |
+ : public TypedElementsAccessor<ExternalByteElementsAccessor, |
+ EXTERNAL_BYTE_ELEMENTS> { |
public: |
explicit ExternalByteElementsAccessor(const char* name) |
- : ExternalElementsAccessor<ExternalByteElementsAccessor, |
- EXTERNAL_BYTE_ELEMENTS>(name) {} |
+ : TypedElementsAccessor<ExternalByteElementsAccessor, |
+ EXTERNAL_BYTE_ELEMENTS>(name) {} |
}; |
class ExternalUnsignedByteElementsAccessor |
- : public ExternalElementsAccessor<ExternalUnsignedByteElementsAccessor, |
- EXTERNAL_UNSIGNED_BYTE_ELEMENTS> { |
+ : public TypedElementsAccessor<ExternalUnsignedByteElementsAccessor, |
+ EXTERNAL_UNSIGNED_BYTE_ELEMENTS> { |
public: |
explicit ExternalUnsignedByteElementsAccessor(const char* name) |
- : ExternalElementsAccessor<ExternalUnsignedByteElementsAccessor, |
- EXTERNAL_UNSIGNED_BYTE_ELEMENTS>(name) {} |
+ : TypedElementsAccessor<ExternalUnsignedByteElementsAccessor, |
+ EXTERNAL_UNSIGNED_BYTE_ELEMENTS>(name) {} |
}; |
class ExternalShortElementsAccessor |
- : public ExternalElementsAccessor<ExternalShortElementsAccessor, |
- EXTERNAL_SHORT_ELEMENTS> { |
+ : public TypedElementsAccessor<ExternalShortElementsAccessor, |
+ EXTERNAL_SHORT_ELEMENTS> { |
public: |
explicit ExternalShortElementsAccessor(const char* name) |
- : ExternalElementsAccessor<ExternalShortElementsAccessor, |
- EXTERNAL_SHORT_ELEMENTS>(name) {} |
+ : TypedElementsAccessor<ExternalShortElementsAccessor, |
+ EXTERNAL_SHORT_ELEMENTS>(name) {} |
}; |
class ExternalUnsignedShortElementsAccessor |
- : public ExternalElementsAccessor<ExternalUnsignedShortElementsAccessor, |
- EXTERNAL_UNSIGNED_SHORT_ELEMENTS> { |
+ : public TypedElementsAccessor<ExternalUnsignedShortElementsAccessor, |
+ EXTERNAL_UNSIGNED_SHORT_ELEMENTS> { |
public: |
explicit ExternalUnsignedShortElementsAccessor(const char* name) |
- : ExternalElementsAccessor<ExternalUnsignedShortElementsAccessor, |
- EXTERNAL_UNSIGNED_SHORT_ELEMENTS>(name) {} |
+ : TypedElementsAccessor<ExternalUnsignedShortElementsAccessor, |
+ EXTERNAL_UNSIGNED_SHORT_ELEMENTS>(name) {} |
}; |
class ExternalIntElementsAccessor |
- : public ExternalElementsAccessor<ExternalIntElementsAccessor, |
- EXTERNAL_INT_ELEMENTS> { |
+ : public TypedElementsAccessor<ExternalIntElementsAccessor, |
+ EXTERNAL_INT_ELEMENTS> { |
public: |
explicit ExternalIntElementsAccessor(const char* name) |
- : ExternalElementsAccessor<ExternalIntElementsAccessor, |
- EXTERNAL_INT_ELEMENTS>(name) {} |
+ : TypedElementsAccessor<ExternalIntElementsAccessor, |
+ EXTERNAL_INT_ELEMENTS>(name) {} |
}; |
class ExternalUnsignedIntElementsAccessor |
- : public ExternalElementsAccessor<ExternalUnsignedIntElementsAccessor, |
- EXTERNAL_UNSIGNED_INT_ELEMENTS> { |
+ : public TypedElementsAccessor<ExternalUnsignedIntElementsAccessor, |
+ EXTERNAL_UNSIGNED_INT_ELEMENTS> { |
public: |
explicit ExternalUnsignedIntElementsAccessor(const char* name) |
- : ExternalElementsAccessor<ExternalUnsignedIntElementsAccessor, |
+ : TypedElementsAccessor<ExternalUnsignedIntElementsAccessor, |
EXTERNAL_UNSIGNED_INT_ELEMENTS>(name) {} |
}; |
class ExternalFloatElementsAccessor |
- : public ExternalElementsAccessor<ExternalFloatElementsAccessor, |
- EXTERNAL_FLOAT_ELEMENTS> { |
+ : public TypedElementsAccessor<ExternalFloatElementsAccessor, |
+ EXTERNAL_FLOAT_ELEMENTS> { |
public: |
explicit ExternalFloatElementsAccessor(const char* name) |
- : ExternalElementsAccessor<ExternalFloatElementsAccessor, |
- EXTERNAL_FLOAT_ELEMENTS>(name) {} |
+ : TypedElementsAccessor<ExternalFloatElementsAccessor, |
+ EXTERNAL_FLOAT_ELEMENTS>(name) {} |
}; |
class ExternalDoubleElementsAccessor |
- : public ExternalElementsAccessor<ExternalDoubleElementsAccessor, |
- EXTERNAL_DOUBLE_ELEMENTS> { |
+ : public TypedElementsAccessor<ExternalDoubleElementsAccessor, |
+ EXTERNAL_DOUBLE_ELEMENTS> { |
public: |
explicit ExternalDoubleElementsAccessor(const char* name) |
- : ExternalElementsAccessor<ExternalDoubleElementsAccessor, |
- EXTERNAL_DOUBLE_ELEMENTS>(name) {} |
+ : TypedElementsAccessor<ExternalDoubleElementsAccessor, |
+ EXTERNAL_DOUBLE_ELEMENTS>(name) {} |
}; |
class PixelElementsAccessor |
- : public ExternalElementsAccessor<PixelElementsAccessor, |
- EXTERNAL_PIXEL_ELEMENTS> { |
+ : public TypedElementsAccessor<PixelElementsAccessor, |
+ EXTERNAL_PIXEL_ELEMENTS> { |
public: |
explicit PixelElementsAccessor(const char* name) |
- : ExternalElementsAccessor<PixelElementsAccessor, |
- EXTERNAL_PIXEL_ELEMENTS>(name) {} |
+ : TypedElementsAccessor<PixelElementsAccessor, |
+ EXTERNAL_PIXEL_ELEMENTS>(name) {} |
+}; |
+ |
+ |
+class FixedUint8ArrayAccessor |
+ : public TypedElementsAccessor<FixedUint8ArrayAccessor, |
+ UINT8_ELEMENTS> { |
+ public: |
+ explicit FixedUint8ArrayAccessor(const char* name) |
+ : TypedElementsAccessor<FixedUint8ArrayAccessor, |
+ UINT8_ELEMENTS>(name) {} |
+}; |
+class FixedUint8ClampedArrayAccessor |
+ : public TypedElementsAccessor<FixedUint8ClampedArrayAccessor, |
+ UINT8_CLAMPED_ELEMENTS> { |
+ public: |
+ explicit FixedUint8ClampedArrayAccessor(const char* name) |
+ : TypedElementsAccessor<FixedUint8ClampedArrayAccessor, |
+ UINT8_CLAMPED_ELEMENTS>(name) {} |
+}; |
+class FixedInt8ArrayAccessor |
+ : public TypedElementsAccessor<FixedInt8ArrayAccessor, |
+ INT8_ELEMENTS> { |
+ public: |
+ explicit FixedInt8ArrayAccessor(const char* name) |
+ : TypedElementsAccessor<FixedInt8ArrayAccessor, |
+ INT8_ELEMENTS>(name) {} |
+}; |
+class FixedUint16ArrayAccessor |
+ : public TypedElementsAccessor<FixedUint16ArrayAccessor, |
+ UINT16_ELEMENTS> { |
+ public: |
+ explicit FixedUint16ArrayAccessor(const char* name) |
+ : TypedElementsAccessor<FixedUint16ArrayAccessor, |
+ UINT16_ELEMENTS>(name) {} |
+}; |
+class FixedInt16ArrayAccessor |
+ : public TypedElementsAccessor<FixedInt16ArrayAccessor, |
+ INT16_ELEMENTS> { |
+ public: |
+ explicit FixedInt16ArrayAccessor(const char* name) |
+ : TypedElementsAccessor<FixedInt16ArrayAccessor, |
+ INT16_ELEMENTS>(name) {} |
+}; |
+class FixedUint32ArrayAccessor |
+ : public TypedElementsAccessor<FixedUint32ArrayAccessor, |
+ UINT32_ELEMENTS> { |
+ public: |
+ explicit FixedUint32ArrayAccessor(const char* name) |
+ : TypedElementsAccessor<FixedUint32ArrayAccessor, |
+ UINT32_ELEMENTS>(name) {} |
+}; |
+class FixedInt32ArrayAccessor |
+ : public TypedElementsAccessor<FixedInt32ArrayAccessor, |
+ INT32_ELEMENTS> { |
+ public: |
+ explicit FixedInt32ArrayAccessor(const char* name) |
+ : TypedElementsAccessor<FixedInt32ArrayAccessor, |
+ INT32_ELEMENTS>(name) {} |
}; |
+class FixedFloat32ArrayAccessor |
+ : public TypedElementsAccessor<FixedFloat32ArrayAccessor, |
+ FLOAT32_ELEMENTS> { |
+ public: |
+ explicit FixedFloat32ArrayAccessor(const char* name) |
+ : TypedElementsAccessor<FixedFloat32ArrayAccessor, |
+ FLOAT32_ELEMENTS>(name) {} |
+}; |
+class FixedFloat64ArrayAccessor |
+ : public TypedElementsAccessor<FixedFloat64ArrayAccessor, |
+ FLOAT64_ELEMENTS> { |
+ public: |
+ explicit FixedFloat64ArrayAccessor(const char* name) |
+ : TypedElementsAccessor<FixedFloat64ArrayAccessor, |
+ FLOAT64_ELEMENTS>(name) {} |
+}; |
class DictionaryElementsAccessor |
: public ElementsAccessorBase<DictionaryElementsAccessor, |