OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 return IsSmi() || IsHeapNumber(); | 323 return IsSmi() || IsHeapNumber(); |
324 } | 324 } |
325 | 325 |
326 | 326 |
327 bool Object::IsByteArray() { | 327 bool Object::IsByteArray() { |
328 return Object::IsHeapObject() | 328 return Object::IsHeapObject() |
329 && HeapObject::cast(this)->map()->instance_type() == BYTE_ARRAY_TYPE; | 329 && HeapObject::cast(this)->map()->instance_type() == BYTE_ARRAY_TYPE; |
330 } | 330 } |
331 | 331 |
332 | 332 |
333 bool Object::IsPixelArray() { | 333 bool Object::IsExternalPixelArray() { |
334 return Object::IsHeapObject() && | 334 return Object::IsHeapObject() && |
335 HeapObject::cast(this)->map()->instance_type() == PIXEL_ARRAY_TYPE; | 335 HeapObject::cast(this)->map()->instance_type() == |
| 336 EXTERNAL_PIXEL_ARRAY_TYPE; |
336 } | 337 } |
337 | 338 |
338 | 339 |
339 bool Object::IsExternalArray() { | 340 bool Object::IsExternalArray() { |
340 if (!Object::IsHeapObject()) | 341 if (!Object::IsHeapObject()) |
341 return false; | 342 return false; |
342 InstanceType instance_type = | 343 InstanceType instance_type = |
343 HeapObject::cast(this)->map()->instance_type(); | 344 HeapObject::cast(this)->map()->instance_type(); |
344 return (instance_type >= FIRST_EXTERNAL_ARRAY_TYPE && | 345 return (instance_type >= FIRST_EXTERNAL_ARRAY_TYPE && |
345 instance_type <= LAST_EXTERNAL_ARRAY_TYPE); | 346 instance_type <= LAST_EXTERNAL_ARRAY_TYPE); |
(...skipping 858 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1204 return READ_INT_FIELD(this, kExponentOffset) & kSignMask; | 1205 return READ_INT_FIELD(this, kExponentOffset) & kSignMask; |
1205 } | 1206 } |
1206 | 1207 |
1207 | 1208 |
1208 ACCESSORS(JSObject, properties, FixedArray, kPropertiesOffset) | 1209 ACCESSORS(JSObject, properties, FixedArray, kPropertiesOffset) |
1209 | 1210 |
1210 | 1211 |
1211 HeapObject* JSObject::elements() { | 1212 HeapObject* JSObject::elements() { |
1212 Object* array = READ_FIELD(this, kElementsOffset); | 1213 Object* array = READ_FIELD(this, kElementsOffset); |
1213 // In the assert below Dictionary is covered under FixedArray. | 1214 // In the assert below Dictionary is covered under FixedArray. |
1214 ASSERT(array->IsFixedArray() || array->IsPixelArray() || | 1215 ASSERT(array->IsFixedArray() || array->IsExternalArray()); |
1215 array->IsExternalArray()); | |
1216 return reinterpret_cast<HeapObject*>(array); | 1216 return reinterpret_cast<HeapObject*>(array); |
1217 } | 1217 } |
1218 | 1218 |
1219 | 1219 |
1220 void JSObject::set_elements(HeapObject* value, WriteBarrierMode mode) { | 1220 void JSObject::set_elements(HeapObject* value, WriteBarrierMode mode) { |
1221 ASSERT(map()->has_fast_elements() == | 1221 ASSERT(map()->has_fast_elements() == |
1222 (value->map() == Heap::fixed_array_map() || | 1222 (value->map() == Heap::fixed_array_map() || |
1223 value->map() == Heap::fixed_cow_array_map())); | 1223 value->map() == Heap::fixed_cow_array_map())); |
1224 // In the assert below Dictionary is covered under FixedArray. | 1224 // In the assert below Dictionary is covered under FixedArray. |
1225 ASSERT(value->IsFixedArray() || value->IsPixelArray() || | 1225 ASSERT(value->IsFixedArray() || value->IsExternalArray()); |
1226 value->IsExternalArray()); | |
1227 WRITE_FIELD(this, kElementsOffset, value); | 1226 WRITE_FIELD(this, kElementsOffset, value); |
1228 CONDITIONAL_WRITE_BARRIER(this, kElementsOffset, mode); | 1227 CONDITIONAL_WRITE_BARRIER(this, kElementsOffset, mode); |
1229 } | 1228 } |
1230 | 1229 |
1231 | 1230 |
1232 void JSObject::initialize_properties() { | 1231 void JSObject::initialize_properties() { |
1233 ASSERT(!Heap::InNewSpace(Heap::empty_fixed_array())); | 1232 ASSERT(!Heap::InNewSpace(Heap::empty_fixed_array())); |
1234 WRITE_FIELD(this, kPropertiesOffset, Heap::empty_fixed_array()); | 1233 WRITE_FIELD(this, kPropertiesOffset, Heap::empty_fixed_array()); |
1235 } | 1234 } |
1236 | 1235 |
(...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1749 CAST_ACCESSOR(JSFunction) | 1748 CAST_ACCESSOR(JSFunction) |
1750 CAST_ACCESSOR(GlobalObject) | 1749 CAST_ACCESSOR(GlobalObject) |
1751 CAST_ACCESSOR(JSGlobalProxy) | 1750 CAST_ACCESSOR(JSGlobalProxy) |
1752 CAST_ACCESSOR(JSGlobalObject) | 1751 CAST_ACCESSOR(JSGlobalObject) |
1753 CAST_ACCESSOR(JSBuiltinsObject) | 1752 CAST_ACCESSOR(JSBuiltinsObject) |
1754 CAST_ACCESSOR(Code) | 1753 CAST_ACCESSOR(Code) |
1755 CAST_ACCESSOR(JSArray) | 1754 CAST_ACCESSOR(JSArray) |
1756 CAST_ACCESSOR(JSRegExp) | 1755 CAST_ACCESSOR(JSRegExp) |
1757 CAST_ACCESSOR(Proxy) | 1756 CAST_ACCESSOR(Proxy) |
1758 CAST_ACCESSOR(ByteArray) | 1757 CAST_ACCESSOR(ByteArray) |
1759 CAST_ACCESSOR(PixelArray) | |
1760 CAST_ACCESSOR(ExternalArray) | 1758 CAST_ACCESSOR(ExternalArray) |
1761 CAST_ACCESSOR(ExternalByteArray) | 1759 CAST_ACCESSOR(ExternalByteArray) |
1762 CAST_ACCESSOR(ExternalUnsignedByteArray) | 1760 CAST_ACCESSOR(ExternalUnsignedByteArray) |
1763 CAST_ACCESSOR(ExternalShortArray) | 1761 CAST_ACCESSOR(ExternalShortArray) |
1764 CAST_ACCESSOR(ExternalUnsignedShortArray) | 1762 CAST_ACCESSOR(ExternalUnsignedShortArray) |
1765 CAST_ACCESSOR(ExternalIntArray) | 1763 CAST_ACCESSOR(ExternalIntArray) |
1766 CAST_ACCESSOR(ExternalUnsignedIntArray) | 1764 CAST_ACCESSOR(ExternalUnsignedIntArray) |
1767 CAST_ACCESSOR(ExternalFloatArray) | 1765 CAST_ACCESSOR(ExternalFloatArray) |
| 1766 CAST_ACCESSOR(ExternalPixelArray) |
1768 CAST_ACCESSOR(Struct) | 1767 CAST_ACCESSOR(Struct) |
1769 | 1768 |
1770 | 1769 |
1771 #define MAKE_STRUCT_CAST(NAME, Name, name) CAST_ACCESSOR(Name) | 1770 #define MAKE_STRUCT_CAST(NAME, Name, name) CAST_ACCESSOR(Name) |
1772 STRUCT_LIST(MAKE_STRUCT_CAST) | 1771 STRUCT_LIST(MAKE_STRUCT_CAST) |
1773 #undef MAKE_STRUCT_CAST | 1772 #undef MAKE_STRUCT_CAST |
1774 | 1773 |
1775 | 1774 |
1776 template <typename Shape, typename Key> | 1775 template <typename Shape, typename Key> |
1777 HashTable<Shape, Key>* HashTable<Shape, Key>::cast(Object* obj) { | 1776 HashTable<Shape, Key>* HashTable<Shape, Key>::cast(Object* obj) { |
1778 ASSERT(obj->IsHashTable()); | 1777 ASSERT(obj->IsHashTable()); |
1779 return reinterpret_cast<HashTable*>(obj); | 1778 return reinterpret_cast<HashTable*>(obj); |
1780 } | 1779 } |
1781 | 1780 |
1782 | 1781 |
1783 SMI_ACCESSORS(FixedArray, length, kLengthOffset) | 1782 SMI_ACCESSORS(FixedArray, length, kLengthOffset) |
1784 SMI_ACCESSORS(ByteArray, length, kLengthOffset) | 1783 SMI_ACCESSORS(ByteArray, length, kLengthOffset) |
1785 | 1784 |
1786 INT_ACCESSORS(PixelArray, length, kLengthOffset) | |
1787 INT_ACCESSORS(ExternalArray, length, kLengthOffset) | 1785 INT_ACCESSORS(ExternalArray, length, kLengthOffset) |
1788 | 1786 |
1789 | 1787 |
1790 SMI_ACCESSORS(String, length, kLengthOffset) | 1788 SMI_ACCESSORS(String, length, kLengthOffset) |
1791 | 1789 |
1792 | 1790 |
1793 uint32_t String::hash_field() { | 1791 uint32_t String::hash_field() { |
1794 return READ_UINT32_FIELD(this, kHashFieldOffset); | 1792 return READ_UINT32_FIELD(this, kHashFieldOffset); |
1795 } | 1793 } |
1796 | 1794 |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2043 ASSERT_TAG_ALIGNED(address); | 2041 ASSERT_TAG_ALIGNED(address); |
2044 return reinterpret_cast<ByteArray*>(address - kHeaderSize + kHeapObjectTag); | 2042 return reinterpret_cast<ByteArray*>(address - kHeaderSize + kHeapObjectTag); |
2045 } | 2043 } |
2046 | 2044 |
2047 | 2045 |
2048 Address ByteArray::GetDataStartAddress() { | 2046 Address ByteArray::GetDataStartAddress() { |
2049 return reinterpret_cast<Address>(this) - kHeapObjectTag + kHeaderSize; | 2047 return reinterpret_cast<Address>(this) - kHeapObjectTag + kHeaderSize; |
2050 } | 2048 } |
2051 | 2049 |
2052 | 2050 |
2053 uint8_t* PixelArray::external_pointer() { | 2051 uint8_t* ExternalPixelArray::external_pixel_pointer() { |
2054 intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset); | 2052 return reinterpret_cast<uint8_t*>(external_pointer()); |
2055 return reinterpret_cast<uint8_t*>(ptr); | |
2056 } | 2053 } |
2057 | 2054 |
2058 | 2055 |
2059 void PixelArray::set_external_pointer(uint8_t* value, WriteBarrierMode mode) { | 2056 uint8_t ExternalPixelArray::get(int index) { |
2060 intptr_t ptr = reinterpret_cast<intptr_t>(value); | |
2061 WRITE_INTPTR_FIELD(this, kExternalPointerOffset, ptr); | |
2062 } | |
2063 | |
2064 | |
2065 uint8_t PixelArray::get(int index) { | |
2066 ASSERT((index >= 0) && (index < this->length())); | 2057 ASSERT((index >= 0) && (index < this->length())); |
2067 uint8_t* ptr = external_pointer(); | 2058 uint8_t* ptr = external_pixel_pointer(); |
2068 return ptr[index]; | 2059 return ptr[index]; |
2069 } | 2060 } |
2070 | 2061 |
2071 | 2062 |
2072 void PixelArray::set(int index, uint8_t value) { | 2063 void ExternalPixelArray::set(int index, uint8_t value) { |
2073 ASSERT((index >= 0) && (index < this->length())); | 2064 ASSERT((index >= 0) && (index < this->length())); |
2074 uint8_t* ptr = external_pointer(); | 2065 uint8_t* ptr = external_pixel_pointer(); |
2075 ptr[index] = value; | 2066 ptr[index] = value; |
2076 } | 2067 } |
2077 | 2068 |
2078 | 2069 |
2079 void* ExternalArray::external_pointer() { | 2070 void* ExternalArray::external_pointer() { |
2080 intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset); | 2071 intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset); |
2081 return reinterpret_cast<void*>(ptr); | 2072 return reinterpret_cast<void*>(ptr); |
2082 } | 2073 } |
2083 | 2074 |
2084 | 2075 |
(...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2742 { MaybeObject* maybe_obj = CopyDropTransitions(); | 2733 { MaybeObject* maybe_obj = CopyDropTransitions(); |
2743 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 2734 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
2744 } | 2735 } |
2745 Map* new_map = Map::cast(obj); | 2736 Map* new_map = Map::cast(obj); |
2746 new_map->set_has_fast_elements(false); | 2737 new_map->set_has_fast_elements(false); |
2747 Counters::map_fast_to_slow_elements.Increment(); | 2738 Counters::map_fast_to_slow_elements.Increment(); |
2748 return new_map; | 2739 return new_map; |
2749 } | 2740 } |
2750 | 2741 |
2751 | 2742 |
2752 MaybeObject* Map::GetPixelArrayElementsMap() { | 2743 MaybeObject* Map::GetExternalPixelArrayElementsMap() { |
2753 if (has_pixel_array_elements()) return this; | 2744 if (has_pixel_array_elements()) return this; |
2754 // TODO(danno): Special case empty object map (or most common case) | 2745 // TODO(danno): Special case empty object map (or most common case) |
2755 // to return a pre-canned pixel array map. | 2746 // to return a pre-canned pixel array map. |
2756 Object* obj; | 2747 Object* obj; |
2757 { MaybeObject* maybe_obj = CopyDropTransitions(); | 2748 { MaybeObject* maybe_obj = CopyDropTransitions(); |
2758 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 2749 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
2759 } | 2750 } |
2760 Map* new_map = Map::cast(obj); | 2751 Map* new_map = Map::cast(obj); |
2761 new_map->set_has_fast_elements(false); | 2752 new_map->set_has_fast_elements(false); |
2762 new_map->set_has_pixel_array_elements(true); | 2753 new_map->set_has_pixel_array_elements(true); |
(...skipping 709 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3472 case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE: | 3463 case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE: |
3473 return EXTERNAL_UNSIGNED_BYTE_ELEMENTS; | 3464 return EXTERNAL_UNSIGNED_BYTE_ELEMENTS; |
3474 case EXTERNAL_SHORT_ARRAY_TYPE: | 3465 case EXTERNAL_SHORT_ARRAY_TYPE: |
3475 return EXTERNAL_SHORT_ELEMENTS; | 3466 return EXTERNAL_SHORT_ELEMENTS; |
3476 case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE: | 3467 case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE: |
3477 return EXTERNAL_UNSIGNED_SHORT_ELEMENTS; | 3468 return EXTERNAL_UNSIGNED_SHORT_ELEMENTS; |
3478 case EXTERNAL_INT_ARRAY_TYPE: | 3469 case EXTERNAL_INT_ARRAY_TYPE: |
3479 return EXTERNAL_INT_ELEMENTS; | 3470 return EXTERNAL_INT_ELEMENTS; |
3480 case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE: | 3471 case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE: |
3481 return EXTERNAL_UNSIGNED_INT_ELEMENTS; | 3472 return EXTERNAL_UNSIGNED_INT_ELEMENTS; |
| 3473 case EXTERNAL_PIXEL_ARRAY_TYPE: |
| 3474 return EXTERNAL_PIXEL_ELEMENTS; |
3482 default: | 3475 default: |
3483 ASSERT(array->map()->instance_type() == EXTERNAL_FLOAT_ARRAY_TYPE); | 3476 ASSERT(array->map()->instance_type() == EXTERNAL_FLOAT_ARRAY_TYPE); |
3484 return EXTERNAL_FLOAT_ELEMENTS; | 3477 return EXTERNAL_FLOAT_ELEMENTS; |
3485 } | 3478 } |
3486 } | 3479 } |
3487 ASSERT(array->IsPixelArray()); | 3480 UNREACHABLE(); |
3488 return PIXEL_ELEMENTS; | 3481 // This code is never reached, but some type has to be returned to make the |
| 3482 // compiler happy. |
| 3483 return EXTERNAL_BYTE_ELEMENTS; |
3489 } | 3484 } |
3490 | 3485 |
3491 | 3486 |
3492 bool JSObject::HasFastElements() { | 3487 bool JSObject::HasFastElements() { |
3493 return GetElementsKind() == FAST_ELEMENTS; | 3488 return GetElementsKind() == FAST_ELEMENTS; |
3494 } | 3489 } |
3495 | 3490 |
3496 | 3491 |
3497 bool JSObject::HasDictionaryElements() { | 3492 bool JSObject::HasDictionaryElements() { |
3498 return GetElementsKind() == DICTIONARY_ELEMENTS; | 3493 return GetElementsKind() == DICTIONARY_ELEMENTS; |
3499 } | 3494 } |
3500 | 3495 |
3501 | 3496 |
3502 bool JSObject::HasPixelElements() { | |
3503 return GetElementsKind() == PIXEL_ELEMENTS; | |
3504 } | |
3505 | |
3506 | |
3507 bool JSObject::HasExternalArrayElements() { | 3497 bool JSObject::HasExternalArrayElements() { |
3508 return (HasExternalByteElements() || | 3498 return (HasExternalByteElements() || |
3509 HasExternalUnsignedByteElements() || | 3499 HasExternalUnsignedByteElements() || |
3510 HasExternalShortElements() || | 3500 HasExternalShortElements() || |
3511 HasExternalUnsignedShortElements() || | 3501 HasExternalUnsignedShortElements() || |
3512 HasExternalIntElements() || | 3502 HasExternalIntElements() || |
3513 HasExternalUnsignedIntElements() || | 3503 HasExternalUnsignedIntElements() || |
3514 HasExternalFloatElements()); | 3504 HasExternalFloatElements() || |
| 3505 HasExternalPixelElements()); |
3515 } | 3506 } |
3516 | 3507 |
3517 | 3508 |
| 3509 bool JSObject::HasExternalPixelElements() { |
| 3510 return GetElementsKind() == EXTERNAL_PIXEL_ELEMENTS; |
| 3511 } |
| 3512 |
| 3513 |
3518 bool JSObject::HasExternalByteElements() { | 3514 bool JSObject::HasExternalByteElements() { |
3519 return GetElementsKind() == EXTERNAL_BYTE_ELEMENTS; | 3515 return GetElementsKind() == EXTERNAL_BYTE_ELEMENTS; |
3520 } | 3516 } |
3521 | 3517 |
3522 | 3518 |
3523 bool JSObject::HasExternalUnsignedByteElements() { | 3519 bool JSObject::HasExternalUnsignedByteElements() { |
3524 return GetElementsKind() == EXTERNAL_UNSIGNED_BYTE_ELEMENTS; | 3520 return GetElementsKind() == EXTERNAL_UNSIGNED_BYTE_ELEMENTS; |
3525 } | 3521 } |
3526 | 3522 |
3527 | 3523 |
(...skipping 27 matching lines...) Expand all Loading... |
3555 } | 3551 } |
3556 | 3552 |
3557 | 3553 |
3558 bool JSObject::HasIndexedInterceptor() { | 3554 bool JSObject::HasIndexedInterceptor() { |
3559 return map()->has_indexed_interceptor(); | 3555 return map()->has_indexed_interceptor(); |
3560 } | 3556 } |
3561 | 3557 |
3562 | 3558 |
3563 bool JSObject::AllowsSetElementsLength() { | 3559 bool JSObject::AllowsSetElementsLength() { |
3564 bool result = elements()->IsFixedArray(); | 3560 bool result = elements()->IsFixedArray(); |
3565 ASSERT(result == (!HasPixelElements() && !HasExternalArrayElements())); | 3561 ASSERT(result == !HasExternalArrayElements()); |
3566 return result; | 3562 return result; |
3567 } | 3563 } |
3568 | 3564 |
3569 | 3565 |
3570 MaybeObject* JSObject::EnsureWritableFastElements() { | 3566 MaybeObject* JSObject::EnsureWritableFastElements() { |
3571 ASSERT(HasFastElements()); | 3567 ASSERT(HasFastElements()); |
3572 FixedArray* elems = FixedArray::cast(elements()); | 3568 FixedArray* elems = FixedArray::cast(elements()); |
3573 if (elems->map() != Heap::fixed_cow_array_map()) return elems; | 3569 if (elems->map() != Heap::fixed_cow_array_map()) return elems; |
3574 Object* writable_elems; | 3570 Object* writable_elems; |
3575 { MaybeObject* maybe_writable_elems = | 3571 { MaybeObject* maybe_writable_elems = |
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3931 #undef WRITE_INT_FIELD | 3927 #undef WRITE_INT_FIELD |
3932 #undef READ_SHORT_FIELD | 3928 #undef READ_SHORT_FIELD |
3933 #undef WRITE_SHORT_FIELD | 3929 #undef WRITE_SHORT_FIELD |
3934 #undef READ_BYTE_FIELD | 3930 #undef READ_BYTE_FIELD |
3935 #undef WRITE_BYTE_FIELD | 3931 #undef WRITE_BYTE_FIELD |
3936 | 3932 |
3937 | 3933 |
3938 } } // namespace v8::internal | 3934 } } // namespace v8::internal |
3939 | 3935 |
3940 #endif // V8_OBJECTS_INL_H_ | 3936 #endif // V8_OBJECTS_INL_H_ |
OLD | NEW |