| 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());
|
| }
|
|
|
|
|