| Index: src/objects-inl.h
|
| ===================================================================
|
| --- src/objects-inl.h (revision 3095)
|
| +++ src/objects-inl.h (working copy)
|
| @@ -360,6 +360,65 @@
|
| }
|
|
|
|
|
| +bool Object::IsExternalArray() {
|
| + if (!Object::IsHeapObject())
|
| + return false;
|
| + InstanceType instance_type =
|
| + HeapObject::cast(this)->map()->instance_type();
|
| + return (instance_type >= EXTERNAL_BYTE_ARRAY_TYPE &&
|
| + instance_type <= EXTERNAL_FLOAT_ARRAY_TYPE);
|
| +}
|
| +
|
| +
|
| +bool Object::IsExternalByteArray() {
|
| + return Object::IsHeapObject() &&
|
| + HeapObject::cast(this)->map()->instance_type() ==
|
| + EXTERNAL_BYTE_ARRAY_TYPE;
|
| +}
|
| +
|
| +
|
| +bool Object::IsExternalUnsignedByteArray() {
|
| + return Object::IsHeapObject() &&
|
| + HeapObject::cast(this)->map()->instance_type() ==
|
| + EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE;
|
| +}
|
| +
|
| +
|
| +bool Object::IsExternalShortArray() {
|
| + return Object::IsHeapObject() &&
|
| + HeapObject::cast(this)->map()->instance_type() ==
|
| + EXTERNAL_SHORT_ARRAY_TYPE;
|
| +}
|
| +
|
| +
|
| +bool Object::IsExternalUnsignedShortArray() {
|
| + return Object::IsHeapObject() &&
|
| + HeapObject::cast(this)->map()->instance_type() ==
|
| + EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE;
|
| +}
|
| +
|
| +
|
| +bool Object::IsExternalIntArray() {
|
| + return Object::IsHeapObject() &&
|
| + HeapObject::cast(this)->map()->instance_type() ==
|
| + EXTERNAL_INT_ARRAY_TYPE;
|
| +}
|
| +
|
| +
|
| +bool Object::IsExternalUnsignedIntArray() {
|
| + return Object::IsHeapObject() &&
|
| + HeapObject::cast(this)->map()->instance_type() ==
|
| + EXTERNAL_UNSIGNED_INT_ARRAY_TYPE;
|
| +}
|
| +
|
| +
|
| +bool Object::IsExternalFloatArray() {
|
| + return Object::IsHeapObject() &&
|
| + HeapObject::cast(this)->map()->instance_type() ==
|
| + EXTERNAL_FLOAT_ARRAY_TYPE;
|
| +}
|
| +
|
| +
|
| bool Object::IsFailure() {
|
| return HAS_FAILURE_TAG(this);
|
| }
|
| @@ -1084,14 +1143,16 @@
|
| Array* JSObject::elements() {
|
| Object* array = READ_FIELD(this, kElementsOffset);
|
| // In the assert below Dictionary is covered under FixedArray.
|
| - ASSERT(array->IsFixedArray() || array->IsPixelArray());
|
| + ASSERT(array->IsFixedArray() || array->IsPixelArray() ||
|
| + array->IsExternalArray());
|
| return reinterpret_cast<Array*>(array);
|
| }
|
|
|
|
|
| void JSObject::set_elements(Array* value, WriteBarrierMode mode) {
|
| // In the assert below Dictionary is covered under FixedArray.
|
| - ASSERT(value->IsFixedArray() || value->IsPixelArray());
|
| + ASSERT(value->IsFixedArray() || value->IsPixelArray() ||
|
| + value->IsExternalArray());
|
| WRITE_FIELD(this, kElementsOffset, value);
|
| CONDITIONAL_WRITE_BARRIER(this, kElementsOffset, mode);
|
| }
|
| @@ -1554,6 +1615,14 @@
|
| CAST_ACCESSOR(Proxy)
|
| CAST_ACCESSOR(ByteArray)
|
| CAST_ACCESSOR(PixelArray)
|
| +CAST_ACCESSOR(ExternalArray)
|
| +CAST_ACCESSOR(ExternalByteArray)
|
| +CAST_ACCESSOR(ExternalUnsignedByteArray)
|
| +CAST_ACCESSOR(ExternalShortArray)
|
| +CAST_ACCESSOR(ExternalUnsignedShortArray)
|
| +CAST_ACCESSOR(ExternalIntArray)
|
| +CAST_ACCESSOR(ExternalUnsignedIntArray)
|
| +CAST_ACCESSOR(ExternalFloatArray)
|
| CAST_ACCESSOR(Struct)
|
|
|
|
|
| @@ -1938,6 +2007,116 @@
|
| }
|
|
|
|
|
| +void* ExternalArray::external_pointer() {
|
| + intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset);
|
| + return reinterpret_cast<void*>(ptr);
|
| +}
|
| +
|
| +
|
| +void ExternalArray::set_external_pointer(void* value, WriteBarrierMode mode) {
|
| + intptr_t ptr = reinterpret_cast<intptr_t>(value);
|
| + WRITE_INTPTR_FIELD(this, kExternalPointerOffset, ptr);
|
| +}
|
| +
|
| +
|
| +int8_t ExternalByteArray::get(int index) {
|
| + ASSERT((index >= 0) && (index < this->length()));
|
| + int8_t* ptr = static_cast<int8_t*>(external_pointer());
|
| + return ptr[index];
|
| +}
|
| +
|
| +
|
| +void ExternalByteArray::set(int index, int8_t value) {
|
| + ASSERT((index >= 0) && (index < this->length()));
|
| + int8_t* ptr = static_cast<int8_t*>(external_pointer());
|
| + ptr[index] = value;
|
| +}
|
| +
|
| +
|
| +uint8_t ExternalUnsignedByteArray::get(int index) {
|
| + ASSERT((index >= 0) && (index < this->length()));
|
| + uint8_t* ptr = static_cast<uint8_t*>(external_pointer());
|
| + return ptr[index];
|
| +}
|
| +
|
| +
|
| +void ExternalUnsignedByteArray::set(int index, uint8_t value) {
|
| + ASSERT((index >= 0) && (index < this->length()));
|
| + uint8_t* ptr = static_cast<uint8_t*>(external_pointer());
|
| + ptr[index] = value;
|
| +}
|
| +
|
| +
|
| +int16_t ExternalShortArray::get(int index) {
|
| + ASSERT((index >= 0) && (index < this->length()));
|
| + int16_t* ptr = static_cast<int16_t*>(external_pointer());
|
| + return ptr[index];
|
| +}
|
| +
|
| +
|
| +void ExternalShortArray::set(int index, int16_t value) {
|
| + ASSERT((index >= 0) && (index < this->length()));
|
| + int16_t* ptr = static_cast<int16_t*>(external_pointer());
|
| + ptr[index] = value;
|
| +}
|
| +
|
| +
|
| +uint16_t ExternalUnsignedShortArray::get(int index) {
|
| + ASSERT((index >= 0) && (index < this->length()));
|
| + uint16_t* ptr = static_cast<uint16_t*>(external_pointer());
|
| + return ptr[index];
|
| +}
|
| +
|
| +
|
| +void ExternalUnsignedShortArray::set(int index, uint16_t value) {
|
| + ASSERT((index >= 0) && (index < this->length()));
|
| + uint16_t* ptr = static_cast<uint16_t*>(external_pointer());
|
| + ptr[index] = value;
|
| +}
|
| +
|
| +
|
| +int32_t ExternalIntArray::get(int index) {
|
| + ASSERT((index >= 0) && (index < this->length()));
|
| + int32_t* ptr = static_cast<int32_t*>(external_pointer());
|
| + return ptr[index];
|
| +}
|
| +
|
| +
|
| +void ExternalIntArray::set(int index, int32_t value) {
|
| + ASSERT((index >= 0) && (index < this->length()));
|
| + int32_t* ptr = static_cast<int32_t*>(external_pointer());
|
| + ptr[index] = value;
|
| +}
|
| +
|
| +
|
| +uint32_t ExternalUnsignedIntArray::get(int index) {
|
| + ASSERT((index >= 0) && (index < this->length()));
|
| + uint32_t* ptr = static_cast<uint32_t*>(external_pointer());
|
| + return ptr[index];
|
| +}
|
| +
|
| +
|
| +void ExternalUnsignedIntArray::set(int index, uint32_t value) {
|
| + ASSERT((index >= 0) && (index < this->length()));
|
| + uint32_t* ptr = static_cast<uint32_t*>(external_pointer());
|
| + ptr[index] = value;
|
| +}
|
| +
|
| +
|
| +float ExternalFloatArray::get(int index) {
|
| + ASSERT((index >= 0) && (index < this->length()));
|
| + float* ptr = static_cast<float*>(external_pointer());
|
| + return ptr[index];
|
| +}
|
| +
|
| +
|
| +void ExternalFloatArray::set(int index, float value) {
|
| + ASSERT((index >= 0) && (index < this->length()));
|
| + float* ptr = static_cast<float*>(external_pointer());
|
| + ptr[index] = value;
|
| +}
|
| +
|
| +
|
| int Map::instance_size() {
|
| return READ_BYTE_FIELD(this, kInstanceSizeOffset) << kPointerSizeLog2;
|
| }
|
| @@ -2646,6 +2825,25 @@
|
| ASSERT(array->IsDictionary());
|
| return DICTIONARY_ELEMENTS;
|
| }
|
| + if (array->IsExternalArray()) {
|
| + switch (array->map()->instance_type()) {
|
| + 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;
|
| + default:
|
| + ASSERT(array->map()->instance_type() == EXTERNAL_FLOAT_ARRAY_TYPE);
|
| + return EXTERNAL_FLOAT_ELEMENTS;
|
| + }
|
| + }
|
| ASSERT(array->IsPixelArray());
|
| return PIXEL_ELEMENTS;
|
| }
|
| @@ -2666,6 +2864,52 @@
|
| }
|
|
|
|
|
| +bool JSObject::HasExternalArrayElements() {
|
| + return (HasExternalByteElements() ||
|
| + HasExternalUnsignedByteElements() ||
|
| + HasExternalShortElements() ||
|
| + HasExternalUnsignedShortElements() ||
|
| + HasExternalIntElements() ||
|
| + HasExternalUnsignedIntElements() ||
|
| + HasExternalFloatElements());
|
| +}
|
| +
|
| +
|
| +bool JSObject::HasExternalByteElements() {
|
| + return GetElementsKind() == EXTERNAL_BYTE_ELEMENTS;
|
| +}
|
| +
|
| +
|
| +bool JSObject::HasExternalUnsignedByteElements() {
|
| + return GetElementsKind() == EXTERNAL_UNSIGNED_BYTE_ELEMENTS;
|
| +}
|
| +
|
| +
|
| +bool JSObject::HasExternalShortElements() {
|
| + return GetElementsKind() == EXTERNAL_SHORT_ELEMENTS;
|
| +}
|
| +
|
| +
|
| +bool JSObject::HasExternalUnsignedShortElements() {
|
| + return GetElementsKind() == EXTERNAL_UNSIGNED_SHORT_ELEMENTS;
|
| +}
|
| +
|
| +
|
| +bool JSObject::HasExternalIntElements() {
|
| + return GetElementsKind() == EXTERNAL_INT_ELEMENTS;
|
| +}
|
| +
|
| +
|
| +bool JSObject::HasExternalUnsignedIntElements() {
|
| + return GetElementsKind() == EXTERNAL_UNSIGNED_INT_ELEMENTS;
|
| +}
|
| +
|
| +
|
| +bool JSObject::HasExternalFloatElements() {
|
| + return GetElementsKind() == EXTERNAL_FLOAT_ELEMENTS;
|
| +}
|
| +
|
| +
|
| bool JSObject::HasNamedInterceptor() {
|
| return map()->has_named_interceptor();
|
| }
|
|
|