Index: src/objects-inl.h |
=================================================================== |
--- src/objects-inl.h (revision 2544) |
+++ src/objects-inl.h (working copy) |
@@ -321,6 +321,12 @@ |
} |
+bool Object::IsPixelArray() { |
+ return Object::IsHeapObject() && |
+ HeapObject::cast(this)->map()->instance_type() == PIXEL_ARRAY_TYPE; |
+} |
+ |
+ |
bool Object::IsFailure() { |
return HAS_FAILURE_TAG(this); |
} |
@@ -1043,9 +1049,24 @@ |
ACCESSORS(JSObject, properties, FixedArray, kPropertiesOffset) |
-ACCESSORS(JSObject, elements, FixedArray, kElementsOffset) |
+Array* JSObject::elements() { |
+ Object* array = READ_FIELD(this, kElementsOffset); |
+ // In the assert below Dictionary is covered under FixedArray. |
+ ASSERT(array->IsFixedArray() || array->IsPixelArray()); |
+ 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()); |
+ WRITE_FIELD(this, kElementsOffset, value); |
+ CONDITIONAL_WRITE_BARRIER(this, kElementsOffset, mode); |
+} |
+ |
+ |
void JSObject::initialize_properties() { |
ASSERT(!Heap::InNewSpace(Heap::empty_fixed_array())); |
WRITE_FIELD(this, kPropertiesOffset, Heap::empty_fixed_array()); |
@@ -1502,6 +1523,7 @@ |
CAST_ACCESSOR(JSRegExp) |
CAST_ACCESSOR(Proxy) |
CAST_ACCESSOR(ByteArray) |
+CAST_ACCESSOR(PixelArray) |
CAST_ACCESSOR(Struct) |
@@ -1860,6 +1882,32 @@ |
} |
+uint8_t* PixelArray::external_pointer() { |
+ intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset); |
+ return reinterpret_cast<uint8_t*>(ptr); |
+} |
+ |
+ |
+void PixelArray::set_external_pointer(uint8_t* value, WriteBarrierMode mode) { |
+ intptr_t ptr = reinterpret_cast<intptr_t>(value); |
+ WRITE_INTPTR_FIELD(this, kExternalPointerOffset, ptr); |
+} |
+ |
+ |
+uint8_t PixelArray::get(int index) { |
+ ASSERT((index >= 0) && (index < this->length())); |
+ uint8_t* ptr = external_pointer(); |
+ return ptr[index]; |
+} |
+ |
+ |
+void PixelArray::set(int index, uint8_t value) { |
+ ASSERT((index >= 0) && (index < this->length())); |
+ uint8_t* ptr = external_pointer(); |
+ ptr[index] = value; |
+} |
+ |
+ |
int Map::instance_size() { |
return READ_BYTE_FIELD(this, kInstanceSizeOffset) << kPointerSizeLog2; |
} |
@@ -2523,11 +2571,36 @@ |
} |
+JSObject::ElementsKind JSObject::GetElementsKind() { |
+ Array* array = elements(); |
+ if (array->IsFixedArray()) { |
+ // FAST_ELEMENTS or DICTIONARY_ELEMENTS are both stored in a FixedArray. |
+ if (array->map() == Heap::fixed_array_map()) { |
+ return FAST_ELEMENTS; |
+ } |
+ ASSERT(array->IsDictionary()); |
+ return DICTIONARY_ELEMENTS; |
+ } |
+ ASSERT(array->IsPixelArray()); |
+ return PIXEL_ELEMENTS; |
+} |
+ |
+ |
bool JSObject::HasFastElements() { |
- return !elements()->IsDictionary(); |
+ return GetElementsKind() == FAST_ELEMENTS; |
} |
+bool JSObject::HasDictionaryElements() { |
+ return GetElementsKind() == DICTIONARY_ELEMENTS; |
+} |
+ |
+ |
+bool JSObject::HasPixelElements() { |
+ return GetElementsKind() == PIXEL_ELEMENTS; |
+} |
+ |
+ |
bool JSObject::HasNamedInterceptor() { |
return map()->has_named_interceptor(); |
} |
@@ -2545,7 +2618,7 @@ |
NumberDictionary* JSObject::element_dictionary() { |
- ASSERT(!HasFastElements()); |
+ ASSERT(HasDictionaryElements()); |
return NumberDictionary::cast(elements()); |
} |