Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(284)

Side by Side Diff: src/objects-inl.h

Issue 6546036: Combine typed and pixel arrays. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: fix wrong external element call Created 9 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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_
OLDNEW
« src/objects.cc ('K') | « src/objects-debug.cc ('k') | src/objects-printer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698