Index: src/objects.h |
=================================================================== |
--- src/objects.h (revision 3095) |
+++ src/objects.h (working copy) |
@@ -56,6 +56,14 @@ |
// - Array |
// - ByteArray |
// - PixelArray |
+// - ExternalArray |
+// - ExternalByteArray |
+// - ExternalUnsignedByteArray |
+// - ExternalShortArray |
+// - ExternalUnsignedShortArray |
+// - ExternalIntArray |
+// - ExternalUnsignedIntArray |
+// - ExternalFloatArray |
// - FixedArray |
// - DescriptorArray |
// - HashTable |
@@ -274,6 +282,16 @@ |
V(PROXY_TYPE) \ |
V(BYTE_ARRAY_TYPE) \ |
V(PIXEL_ARRAY_TYPE) \ |
+ /* Note: the order of these external array */ \ |
+ /* types is relied upon in */ \ |
+ /* Object::IsExternalArray(). */ \ |
+ V(EXTERNAL_BYTE_ARRAY_TYPE) \ |
+ V(EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE) \ |
+ V(EXTERNAL_SHORT_ARRAY_TYPE) \ |
+ V(EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE) \ |
+ V(EXTERNAL_INT_ARRAY_TYPE) \ |
+ V(EXTERNAL_UNSIGNED_INT_ARRAY_TYPE) \ |
+ V(EXTERNAL_FLOAT_ARRAY_TYPE) \ |
V(FILLER_TYPE) \ |
\ |
V(ACCESSOR_INFO_TYPE) \ |
@@ -673,6 +691,13 @@ |
PROXY_TYPE, |
BYTE_ARRAY_TYPE, |
PIXEL_ARRAY_TYPE, |
+ EXTERNAL_BYTE_ARRAY_TYPE, |
+ EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE, |
+ EXTERNAL_SHORT_ARRAY_TYPE, |
+ EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE, |
+ EXTERNAL_INT_ARRAY_TYPE, |
+ EXTERNAL_UNSIGNED_INT_ARRAY_TYPE, |
+ EXTERNAL_FLOAT_ARRAY_TYPE, |
FILLER_TYPE, |
SMI_TYPE, |
@@ -780,6 +805,14 @@ |
inline bool IsNumber(); |
inline bool IsByteArray(); |
inline bool IsPixelArray(); |
+ inline bool IsExternalArray(); |
+ inline bool IsExternalByteArray(); |
+ inline bool IsExternalUnsignedByteArray(); |
+ inline bool IsExternalShortArray(); |
+ inline bool IsExternalUnsignedShortArray(); |
+ inline bool IsExternalIntArray(); |
+ inline bool IsExternalUnsignedIntArray(); |
+ inline bool IsExternalFloatArray(); |
inline bool IsFailure(); |
inline bool IsRetryAfterGC(); |
inline bool IsOutOfMemoryFailure(); |
@@ -1323,7 +1356,14 @@ |
enum ElementsKind { |
FAST_ELEMENTS, |
DICTIONARY_ELEMENTS, |
- PIXEL_ELEMENTS |
+ PIXEL_ELEMENTS, |
+ EXTERNAL_BYTE_ELEMENTS, |
+ EXTERNAL_UNSIGNED_BYTE_ELEMENTS, |
+ EXTERNAL_SHORT_ELEMENTS, |
+ EXTERNAL_UNSIGNED_SHORT_ELEMENTS, |
+ EXTERNAL_INT_ELEMENTS, |
+ EXTERNAL_UNSIGNED_INT_ELEMENTS, |
+ EXTERNAL_FLOAT_ELEMENTS |
}; |
// [properties]: Backing storage for properties. |
@@ -1343,6 +1383,14 @@ |
inline bool HasFastElements(); |
inline bool HasDictionaryElements(); |
inline bool HasPixelElements(); |
+ inline bool HasExternalArrayElements(); |
+ inline bool HasExternalByteElements(); |
+ inline bool HasExternalUnsignedByteElements(); |
+ inline bool HasExternalShortElements(); |
+ inline bool HasExternalUnsignedShortElements(); |
+ inline bool HasExternalIntElements(); |
+ inline bool HasExternalUnsignedIntElements(); |
+ inline bool HasExternalFloatElements(); |
inline NumberDictionary* element_dictionary(); // Gets slow elements. |
// Collects elements starting at index 0. |
@@ -2507,6 +2555,200 @@ |
}; |
+// An ExternalArray represents a fixed-size array of primitive values |
+// which live outside the JavaScript heap. Its subclasses are used to |
+// implement the CanvasArray types being defined in the WebGL |
+// specification. As of this writing the first public draft is not yet |
+// available, but Khronos members can access the draft at: |
+// https://cvs.khronos.org/svn/repos/3dweb/trunk/doc/spec/WebGL-spec.html |
+// |
+// The semantics of these arrays differ from CanvasPixelArray. |
+// Out-of-range values passed to the setter are converted via a C |
+// cast, not clamping. Out-of-range indices cause exceptions to be |
+// raised rather than being silently ignored. |
+class ExternalArray: public Array { |
+ public: |
+ // [external_pointer]: The pointer to the external memory area backing this |
+ // external array. |
+ DECL_ACCESSORS(external_pointer, void) // Pointer to the data store. |
+ |
+ // Casting. |
+ static inline ExternalArray* cast(Object* obj); |
+ |
+ // Maximal acceptable length for an external array. |
+ static const int kMaxLength = 0x3fffffff; |
+ |
+ // ExternalArray headers are not quadword aligned. |
+ static const int kExternalPointerOffset = Array::kAlignedSize; |
+ static const int kHeaderSize = kExternalPointerOffset + kPointerSize; |
+ static const int kAlignedSize = OBJECT_SIZE_ALIGN(kHeaderSize); |
+ |
+ private: |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalArray); |
+}; |
+ |
+ |
+class ExternalByteArray: public ExternalArray { |
+ public: |
+ // Setter and getter. |
+ inline int8_t get(int index); |
+ inline void set(int index, int8_t value); |
+ |
+ // This accessor applies the correct conversion from Smi, HeapNumber |
+ // and undefined. |
+ Object* SetValue(uint32_t index, Object* value); |
+ |
+ // Casting. |
+ static inline ExternalByteArray* cast(Object* obj); |
+ |
+#ifdef DEBUG |
+ void ExternalByteArrayPrint(); |
+ void ExternalByteArrayVerify(); |
+#endif // DEBUG |
+ |
+ private: |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalByteArray); |
+}; |
+ |
+ |
+class ExternalUnsignedByteArray: public ExternalArray { |
+ public: |
+ // Setter and getter. |
+ inline uint8_t get(int index); |
+ inline void set(int index, uint8_t value); |
+ |
+ // This accessor applies the correct conversion from Smi, HeapNumber |
+ // and undefined. |
+ Object* SetValue(uint32_t index, Object* value); |
+ |
+ // Casting. |
+ static inline ExternalUnsignedByteArray* cast(Object* obj); |
+ |
+#ifdef DEBUG |
+ void ExternalUnsignedByteArrayPrint(); |
+ void ExternalUnsignedByteArrayVerify(); |
+#endif // DEBUG |
+ |
+ private: |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalUnsignedByteArray); |
+}; |
+ |
+ |
+class ExternalShortArray: public ExternalArray { |
+ public: |
+ // Setter and getter. |
+ inline int16_t get(int index); |
+ inline void set(int index, int16_t value); |
+ |
+ // This accessor applies the correct conversion from Smi, HeapNumber |
+ // and undefined. |
+ Object* SetValue(uint32_t index, Object* value); |
+ |
+ // Casting. |
+ static inline ExternalShortArray* cast(Object* obj); |
+ |
+#ifdef DEBUG |
+ void ExternalShortArrayPrint(); |
+ void ExternalShortArrayVerify(); |
+#endif // DEBUG |
+ |
+ private: |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalShortArray); |
+}; |
+ |
+ |
+class ExternalUnsignedShortArray: public ExternalArray { |
+ public: |
+ // Setter and getter. |
+ inline uint16_t get(int index); |
+ inline void set(int index, uint16_t value); |
+ |
+ // This accessor applies the correct conversion from Smi, HeapNumber |
+ // and undefined. |
+ Object* SetValue(uint32_t index, Object* value); |
+ |
+ // Casting. |
+ static inline ExternalUnsignedShortArray* cast(Object* obj); |
+ |
+#ifdef DEBUG |
+ void ExternalUnsignedShortArrayPrint(); |
+ void ExternalUnsignedShortArrayVerify(); |
+#endif // DEBUG |
+ |
+ private: |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalUnsignedShortArray); |
+}; |
+ |
+ |
+class ExternalIntArray: public ExternalArray { |
+ public: |
+ // Setter and getter. |
+ inline int32_t get(int index); |
+ inline void set(int index, int32_t value); |
+ |
+ // This accessor applies the correct conversion from Smi, HeapNumber |
+ // and undefined. |
+ Object* SetValue(uint32_t index, Object* value); |
+ |
+ // Casting. |
+ static inline ExternalIntArray* cast(Object* obj); |
+ |
+#ifdef DEBUG |
+ void ExternalIntArrayPrint(); |
+ void ExternalIntArrayVerify(); |
+#endif // DEBUG |
+ |
+ private: |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalIntArray); |
+}; |
+ |
+ |
+class ExternalUnsignedIntArray: public ExternalArray { |
+ public: |
+ // Setter and getter. |
+ inline uint32_t get(int index); |
+ inline void set(int index, uint32_t value); |
+ |
+ // This accessor applies the correct conversion from Smi, HeapNumber |
+ // and undefined. |
+ Object* SetValue(uint32_t index, Object* value); |
+ |
+ // Casting. |
+ static inline ExternalUnsignedIntArray* cast(Object* obj); |
+ |
+#ifdef DEBUG |
+ void ExternalUnsignedIntArrayPrint(); |
+ void ExternalUnsignedIntArrayVerify(); |
+#endif // DEBUG |
+ |
+ private: |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalUnsignedIntArray); |
+}; |
+ |
+ |
+class ExternalFloatArray: public ExternalArray { |
+ public: |
+ // Setter and getter. |
+ inline float get(int index); |
+ inline void set(int index, float value); |
+ |
+ // This accessor applies the correct conversion from Smi, HeapNumber |
+ // and undefined. |
+ Object* SetValue(uint32_t index, Object* value); |
+ |
+ // Casting. |
+ static inline ExternalFloatArray* cast(Object* obj); |
+ |
+#ifdef DEBUG |
+ void ExternalFloatArrayPrint(); |
+ void ExternalFloatArrayVerify(); |
+#endif // DEBUG |
+ |
+ private: |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalFloatArray); |
+}; |
+ |
+ |
// Code describes objects with on-the-fly generated machine code. |
class Code: public HeapObject { |
public: |