| 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 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 333 return IsSmi() || IsHeapNumber(); | 333 return IsSmi() || IsHeapNumber(); |
| 334 } | 334 } |
| 335 | 335 |
| 336 | 336 |
| 337 bool Object::IsByteArray() { | 337 bool Object::IsByteArray() { |
| 338 return Object::IsHeapObject() | 338 return Object::IsHeapObject() |
| 339 && HeapObject::cast(this)->map()->instance_type() == BYTE_ARRAY_TYPE; | 339 && HeapObject::cast(this)->map()->instance_type() == BYTE_ARRAY_TYPE; |
| 340 } | 340 } |
| 341 | 341 |
| 342 | 342 |
| 343 bool Object::IsPixelArray() { | 343 bool Object::IsExternalPixelArray() { |
| 344 return Object::IsHeapObject() && | 344 return Object::IsHeapObject() && |
| 345 HeapObject::cast(this)->map()->instance_type() == PIXEL_ARRAY_TYPE; | 345 HeapObject::cast(this)->map()->instance_type() == |
| 346 EXTERNAL_PIXEL_ARRAY_TYPE; |
| 346 } | 347 } |
| 347 | 348 |
| 348 | 349 |
| 349 bool Object::IsExternalArray() { | 350 bool Object::IsExternalArray() { |
| 350 if (!Object::IsHeapObject()) | 351 if (!Object::IsHeapObject()) |
| 351 return false; | 352 return false; |
| 352 InstanceType instance_type = | 353 InstanceType instance_type = |
| 353 HeapObject::cast(this)->map()->instance_type(); | 354 HeapObject::cast(this)->map()->instance_type(); |
| 354 return (instance_type >= FIRST_EXTERNAL_ARRAY_TYPE && | 355 return (instance_type >= FIRST_EXTERNAL_ARRAY_TYPE && |
| 355 instance_type <= LAST_EXTERNAL_ARRAY_TYPE); | 356 instance_type <= LAST_EXTERNAL_ARRAY_TYPE); |
| (...skipping 893 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1249 return READ_INT_FIELD(this, kExponentOffset) & kSignMask; | 1250 return READ_INT_FIELD(this, kExponentOffset) & kSignMask; |
| 1250 } | 1251 } |
| 1251 | 1252 |
| 1252 | 1253 |
| 1253 ACCESSORS(JSObject, properties, FixedArray, kPropertiesOffset) | 1254 ACCESSORS(JSObject, properties, FixedArray, kPropertiesOffset) |
| 1254 | 1255 |
| 1255 | 1256 |
| 1256 HeapObject* JSObject::elements() { | 1257 HeapObject* JSObject::elements() { |
| 1257 Object* array = READ_FIELD(this, kElementsOffset); | 1258 Object* array = READ_FIELD(this, kElementsOffset); |
| 1258 // In the assert below Dictionary is covered under FixedArray. | 1259 // In the assert below Dictionary is covered under FixedArray. |
| 1259 ASSERT(array->IsFixedArray() || array->IsPixelArray() || | 1260 ASSERT(array->IsFixedArray() || array->IsExternalArray()); |
| 1260 array->IsExternalArray()); | |
| 1261 return reinterpret_cast<HeapObject*>(array); | 1261 return reinterpret_cast<HeapObject*>(array); |
| 1262 } | 1262 } |
| 1263 | 1263 |
| 1264 | 1264 |
| 1265 void JSObject::set_elements(HeapObject* value, WriteBarrierMode mode) { | 1265 void JSObject::set_elements(HeapObject* value, WriteBarrierMode mode) { |
| 1266 ASSERT(map()->has_fast_elements() == | 1266 ASSERT(map()->has_fast_elements() == |
| 1267 (value->map() == GetHeap()->fixed_array_map() || | 1267 (value->map() == GetHeap()->fixed_array_map() || |
| 1268 value->map() == GetHeap()->fixed_cow_array_map())); | 1268 value->map() == GetHeap()->fixed_cow_array_map())); |
| 1269 // In the assert below Dictionary is covered under FixedArray. | 1269 // In the assert below Dictionary is covered under FixedArray. |
| 1270 ASSERT(value->IsFixedArray() || value->IsPixelArray() || | 1270 ASSERT(value->IsFixedArray() || value->IsExternalArray()); |
| 1271 value->IsExternalArray()); | |
| 1272 WRITE_FIELD(this, kElementsOffset, value); | 1271 WRITE_FIELD(this, kElementsOffset, value); |
| 1273 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kElementsOffset, mode); | 1272 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kElementsOffset, mode); |
| 1274 } | 1273 } |
| 1275 | 1274 |
| 1276 | 1275 |
| 1277 void JSObject::initialize_properties() { | 1276 void JSObject::initialize_properties() { |
| 1278 ASSERT(!GetHeap()->InNewSpace(GetHeap()->empty_fixed_array())); | 1277 ASSERT(!GetHeap()->InNewSpace(GetHeap()->empty_fixed_array())); |
| 1279 WRITE_FIELD(this, kPropertiesOffset, GetHeap()->empty_fixed_array()); | 1278 WRITE_FIELD(this, kPropertiesOffset, GetHeap()->empty_fixed_array()); |
| 1280 } | 1279 } |
| 1281 | 1280 |
| (...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1840 CAST_ACCESSOR(JSFunction) | 1839 CAST_ACCESSOR(JSFunction) |
| 1841 CAST_ACCESSOR(GlobalObject) | 1840 CAST_ACCESSOR(GlobalObject) |
| 1842 CAST_ACCESSOR(JSGlobalProxy) | 1841 CAST_ACCESSOR(JSGlobalProxy) |
| 1843 CAST_ACCESSOR(JSGlobalObject) | 1842 CAST_ACCESSOR(JSGlobalObject) |
| 1844 CAST_ACCESSOR(JSBuiltinsObject) | 1843 CAST_ACCESSOR(JSBuiltinsObject) |
| 1845 CAST_ACCESSOR(Code) | 1844 CAST_ACCESSOR(Code) |
| 1846 CAST_ACCESSOR(JSArray) | 1845 CAST_ACCESSOR(JSArray) |
| 1847 CAST_ACCESSOR(JSRegExp) | 1846 CAST_ACCESSOR(JSRegExp) |
| 1848 CAST_ACCESSOR(Proxy) | 1847 CAST_ACCESSOR(Proxy) |
| 1849 CAST_ACCESSOR(ByteArray) | 1848 CAST_ACCESSOR(ByteArray) |
| 1850 CAST_ACCESSOR(PixelArray) | |
| 1851 CAST_ACCESSOR(ExternalArray) | 1849 CAST_ACCESSOR(ExternalArray) |
| 1852 CAST_ACCESSOR(ExternalByteArray) | 1850 CAST_ACCESSOR(ExternalByteArray) |
| 1853 CAST_ACCESSOR(ExternalUnsignedByteArray) | 1851 CAST_ACCESSOR(ExternalUnsignedByteArray) |
| 1854 CAST_ACCESSOR(ExternalShortArray) | 1852 CAST_ACCESSOR(ExternalShortArray) |
| 1855 CAST_ACCESSOR(ExternalUnsignedShortArray) | 1853 CAST_ACCESSOR(ExternalUnsignedShortArray) |
| 1856 CAST_ACCESSOR(ExternalIntArray) | 1854 CAST_ACCESSOR(ExternalIntArray) |
| 1857 CAST_ACCESSOR(ExternalUnsignedIntArray) | 1855 CAST_ACCESSOR(ExternalUnsignedIntArray) |
| 1858 CAST_ACCESSOR(ExternalFloatArray) | 1856 CAST_ACCESSOR(ExternalFloatArray) |
| 1857 CAST_ACCESSOR(ExternalPixelArray) |
| 1859 CAST_ACCESSOR(Struct) | 1858 CAST_ACCESSOR(Struct) |
| 1860 | 1859 |
| 1861 | 1860 |
| 1862 #define MAKE_STRUCT_CAST(NAME, Name, name) CAST_ACCESSOR(Name) | 1861 #define MAKE_STRUCT_CAST(NAME, Name, name) CAST_ACCESSOR(Name) |
| 1863 STRUCT_LIST(MAKE_STRUCT_CAST) | 1862 STRUCT_LIST(MAKE_STRUCT_CAST) |
| 1864 #undef MAKE_STRUCT_CAST | 1863 #undef MAKE_STRUCT_CAST |
| 1865 | 1864 |
| 1866 | 1865 |
| 1867 template <typename Shape, typename Key> | 1866 template <typename Shape, typename Key> |
| 1868 HashTable<Shape, Key>* HashTable<Shape, Key>::cast(Object* obj) { | 1867 HashTable<Shape, Key>* HashTable<Shape, Key>::cast(Object* obj) { |
| 1869 ASSERT(obj->IsHashTable()); | 1868 ASSERT(obj->IsHashTable()); |
| 1870 return reinterpret_cast<HashTable*>(obj); | 1869 return reinterpret_cast<HashTable*>(obj); |
| 1871 } | 1870 } |
| 1872 | 1871 |
| 1873 | 1872 |
| 1874 SMI_ACCESSORS(FixedArray, length, kLengthOffset) | 1873 SMI_ACCESSORS(FixedArray, length, kLengthOffset) |
| 1875 SMI_ACCESSORS(ByteArray, length, kLengthOffset) | 1874 SMI_ACCESSORS(ByteArray, length, kLengthOffset) |
| 1876 | 1875 |
| 1877 INT_ACCESSORS(PixelArray, length, kLengthOffset) | |
| 1878 INT_ACCESSORS(ExternalArray, length, kLengthOffset) | 1876 INT_ACCESSORS(ExternalArray, length, kLengthOffset) |
| 1879 | 1877 |
| 1880 | 1878 |
| 1881 SMI_ACCESSORS(String, length, kLengthOffset) | 1879 SMI_ACCESSORS(String, length, kLengthOffset) |
| 1882 | 1880 |
| 1883 | 1881 |
| 1884 uint32_t String::hash_field() { | 1882 uint32_t String::hash_field() { |
| 1885 return READ_UINT32_FIELD(this, kHashFieldOffset); | 1883 return READ_UINT32_FIELD(this, kHashFieldOffset); |
| 1886 } | 1884 } |
| 1887 | 1885 |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2134 ASSERT_TAG_ALIGNED(address); | 2132 ASSERT_TAG_ALIGNED(address); |
| 2135 return reinterpret_cast<ByteArray*>(address - kHeaderSize + kHeapObjectTag); | 2133 return reinterpret_cast<ByteArray*>(address - kHeaderSize + kHeapObjectTag); |
| 2136 } | 2134 } |
| 2137 | 2135 |
| 2138 | 2136 |
| 2139 Address ByteArray::GetDataStartAddress() { | 2137 Address ByteArray::GetDataStartAddress() { |
| 2140 return reinterpret_cast<Address>(this) - kHeapObjectTag + kHeaderSize; | 2138 return reinterpret_cast<Address>(this) - kHeapObjectTag + kHeaderSize; |
| 2141 } | 2139 } |
| 2142 | 2140 |
| 2143 | 2141 |
| 2144 uint8_t* PixelArray::external_pointer() { | 2142 uint8_t* ExternalPixelArray::external_pixel_pointer() { |
| 2145 intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset); | 2143 return reinterpret_cast<uint8_t*>(external_pointer()); |
| 2146 return reinterpret_cast<uint8_t*>(ptr); | |
| 2147 } | 2144 } |
| 2148 | 2145 |
| 2149 | 2146 |
| 2150 void PixelArray::set_external_pointer(uint8_t* value, WriteBarrierMode mode) { | 2147 uint8_t ExternalPixelArray::get(int index) { |
| 2151 intptr_t ptr = reinterpret_cast<intptr_t>(value); | |
| 2152 WRITE_INTPTR_FIELD(this, kExternalPointerOffset, ptr); | |
| 2153 } | |
| 2154 | |
| 2155 | |
| 2156 uint8_t PixelArray::get(int index) { | |
| 2157 ASSERT((index >= 0) && (index < this->length())); | 2148 ASSERT((index >= 0) && (index < this->length())); |
| 2158 uint8_t* ptr = external_pointer(); | 2149 uint8_t* ptr = external_pixel_pointer(); |
| 2159 return ptr[index]; | 2150 return ptr[index]; |
| 2160 } | 2151 } |
| 2161 | 2152 |
| 2162 | 2153 |
| 2163 void PixelArray::set(int index, uint8_t value) { | 2154 void ExternalPixelArray::set(int index, uint8_t value) { |
| 2164 ASSERT((index >= 0) && (index < this->length())); | 2155 ASSERT((index >= 0) && (index < this->length())); |
| 2165 uint8_t* ptr = external_pointer(); | 2156 uint8_t* ptr = external_pixel_pointer(); |
| 2166 ptr[index] = value; | 2157 ptr[index] = value; |
| 2167 } | 2158 } |
| 2168 | 2159 |
| 2169 | 2160 |
| 2170 void* ExternalArray::external_pointer() { | 2161 void* ExternalArray::external_pointer() { |
| 2171 intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset); | 2162 intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset); |
| 2172 return reinterpret_cast<void*>(ptr); | 2163 return reinterpret_cast<void*>(ptr); |
| 2173 } | 2164 } |
| 2174 | 2165 |
| 2175 | 2166 |
| (...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2633 return static_cast<CheckType>(type); | 2624 return static_cast<CheckType>(type); |
| 2634 } | 2625 } |
| 2635 | 2626 |
| 2636 | 2627 |
| 2637 void Code::set_check_type(CheckType value) { | 2628 void Code::set_check_type(CheckType value) { |
| 2638 ASSERT(is_call_stub() || is_keyed_call_stub()); | 2629 ASSERT(is_call_stub() || is_keyed_call_stub()); |
| 2639 WRITE_BYTE_FIELD(this, kCheckTypeOffset, value); | 2630 WRITE_BYTE_FIELD(this, kCheckTypeOffset, value); |
| 2640 } | 2631 } |
| 2641 | 2632 |
| 2642 | 2633 |
| 2634 ExternalArrayType Code::external_array_type() { |
| 2635 ASSERT(is_external_array_load_stub() || is_external_array_store_stub()); |
| 2636 byte type = READ_BYTE_FIELD(this, kExternalArrayTypeOffset); |
| 2637 return static_cast<ExternalArrayType>(type); |
| 2638 } |
| 2639 |
| 2640 |
| 2641 void Code::set_external_array_type(ExternalArrayType value) { |
| 2642 ASSERT(is_external_array_load_stub() || is_external_array_store_stub()); |
| 2643 WRITE_BYTE_FIELD(this, kExternalArrayTypeOffset, value); |
| 2644 } |
| 2645 |
| 2646 |
| 2643 byte Code::binary_op_type() { | 2647 byte Code::binary_op_type() { |
| 2644 ASSERT(is_binary_op_stub()); | 2648 ASSERT(is_binary_op_stub()); |
| 2645 return READ_BYTE_FIELD(this, kBinaryOpTypeOffset); | 2649 return READ_BYTE_FIELD(this, kBinaryOpTypeOffset); |
| 2646 } | 2650 } |
| 2647 | 2651 |
| 2648 | 2652 |
| 2649 void Code::set_binary_op_type(byte value) { | 2653 void Code::set_binary_op_type(byte value) { |
| 2650 ASSERT(is_binary_op_stub()); | 2654 ASSERT(is_binary_op_stub()); |
| 2651 WRITE_BYTE_FIELD(this, kBinaryOpTypeOffset, value); | 2655 WRITE_BYTE_FIELD(this, kBinaryOpTypeOffset, value); |
| 2652 } | 2656 } |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2843 { MaybeObject* maybe_obj = CopyDropTransitions(); | 2847 { MaybeObject* maybe_obj = CopyDropTransitions(); |
| 2844 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 2848 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| 2845 } | 2849 } |
| 2846 Map* new_map = Map::cast(obj); | 2850 Map* new_map = Map::cast(obj); |
| 2847 new_map->set_has_fast_elements(false); | 2851 new_map->set_has_fast_elements(false); |
| 2848 COUNTERS->map_fast_to_slow_elements()->Increment(); | 2852 COUNTERS->map_fast_to_slow_elements()->Increment(); |
| 2849 return new_map; | 2853 return new_map; |
| 2850 } | 2854 } |
| 2851 | 2855 |
| 2852 | 2856 |
| 2853 MaybeObject* Map::GetPixelArrayElementsMap() { | 2857 MaybeObject* Map::NewExternalArrayElementsMap() { |
| 2854 if (has_pixel_array_elements()) return this; | |
| 2855 // TODO(danno): Special case empty object map (or most common case) | 2858 // TODO(danno): Special case empty object map (or most common case) |
| 2856 // to return a pre-canned pixel array map. | 2859 // to return a pre-canned pixel array map. |
| 2857 Object* obj; | 2860 Object* obj; |
| 2858 { MaybeObject* maybe_obj = CopyDropTransitions(); | 2861 { MaybeObject* maybe_obj = CopyDropTransitions(); |
| 2859 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 2862 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| 2860 } | 2863 } |
| 2861 Map* new_map = Map::cast(obj); | 2864 Map* new_map = Map::cast(obj); |
| 2862 new_map->set_has_fast_elements(false); | 2865 new_map->set_has_fast_elements(false); |
| 2863 new_map->set_has_pixel_array_elements(true); | 2866 new_map->set_has_external_array_elements(true); |
| 2864 COUNTERS->map_to_pixel_array_elements()->Increment(); | 2867 COUNTERS->map_to_external_array_elements()->Increment(); |
| 2865 return new_map; | 2868 return new_map; |
| 2866 } | 2869 } |
| 2867 | 2870 |
| 2868 | 2871 |
| 2869 ACCESSORS(Map, instance_descriptors, DescriptorArray, | 2872 ACCESSORS(Map, instance_descriptors, DescriptorArray, |
| 2870 kInstanceDescriptorsOffset) | 2873 kInstanceDescriptorsOffset) |
| 2871 ACCESSORS(Map, code_cache, Object, kCodeCacheOffset) | 2874 ACCESSORS(Map, code_cache, Object, kCodeCacheOffset) |
| 2872 ACCESSORS(Map, constructor, Object, kConstructorOffset) | 2875 ACCESSORS(Map, constructor, Object, kConstructorOffset) |
| 2873 | 2876 |
| 2874 ACCESSORS(JSFunction, shared, SharedFunctionInfo, kSharedFunctionInfoOffset) | 2877 ACCESSORS(JSFunction, shared, SharedFunctionInfo, kSharedFunctionInfoOffset) |
| (...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3576 case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE: | 3579 case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE: |
| 3577 return EXTERNAL_UNSIGNED_BYTE_ELEMENTS; | 3580 return EXTERNAL_UNSIGNED_BYTE_ELEMENTS; |
| 3578 case EXTERNAL_SHORT_ARRAY_TYPE: | 3581 case EXTERNAL_SHORT_ARRAY_TYPE: |
| 3579 return EXTERNAL_SHORT_ELEMENTS; | 3582 return EXTERNAL_SHORT_ELEMENTS; |
| 3580 case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE: | 3583 case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE: |
| 3581 return EXTERNAL_UNSIGNED_SHORT_ELEMENTS; | 3584 return EXTERNAL_UNSIGNED_SHORT_ELEMENTS; |
| 3582 case EXTERNAL_INT_ARRAY_TYPE: | 3585 case EXTERNAL_INT_ARRAY_TYPE: |
| 3583 return EXTERNAL_INT_ELEMENTS; | 3586 return EXTERNAL_INT_ELEMENTS; |
| 3584 case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE: | 3587 case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE: |
| 3585 return EXTERNAL_UNSIGNED_INT_ELEMENTS; | 3588 return EXTERNAL_UNSIGNED_INT_ELEMENTS; |
| 3589 case EXTERNAL_PIXEL_ARRAY_TYPE: |
| 3590 return EXTERNAL_PIXEL_ELEMENTS; |
| 3586 default: | 3591 default: |
| 3587 ASSERT(array->map()->instance_type() == EXTERNAL_FLOAT_ARRAY_TYPE); | 3592 break; |
| 3588 return EXTERNAL_FLOAT_ELEMENTS; | |
| 3589 } | 3593 } |
| 3590 } | 3594 } |
| 3591 ASSERT(array->IsPixelArray()); | 3595 ASSERT(array->map()->instance_type() == EXTERNAL_FLOAT_ARRAY_TYPE); |
| 3592 return PIXEL_ELEMENTS; | 3596 return EXTERNAL_FLOAT_ELEMENTS; |
| 3593 } | 3597 } |
| 3594 | 3598 |
| 3595 | 3599 |
| 3596 bool JSObject::HasFastElements() { | 3600 bool JSObject::HasFastElements() { |
| 3597 return GetElementsKind() == FAST_ELEMENTS; | 3601 return GetElementsKind() == FAST_ELEMENTS; |
| 3598 } | 3602 } |
| 3599 | 3603 |
| 3600 | 3604 |
| 3601 bool JSObject::HasDictionaryElements() { | 3605 bool JSObject::HasDictionaryElements() { |
| 3602 return GetElementsKind() == DICTIONARY_ELEMENTS; | 3606 return GetElementsKind() == DICTIONARY_ELEMENTS; |
| 3603 } | 3607 } |
| 3604 | 3608 |
| 3605 | 3609 |
| 3606 bool JSObject::HasPixelElements() { | |
| 3607 return GetElementsKind() == PIXEL_ELEMENTS; | |
| 3608 } | |
| 3609 | |
| 3610 | |
| 3611 bool JSObject::HasExternalArrayElements() { | 3610 bool JSObject::HasExternalArrayElements() { |
| 3612 return (HasExternalByteElements() || | 3611 HeapObject* array = elements(); |
| 3613 HasExternalUnsignedByteElements() || | 3612 ASSERT(array != NULL); |
| 3614 HasExternalShortElements() || | 3613 return array->IsExternalArray(); |
| 3615 HasExternalUnsignedShortElements() || | |
| 3616 HasExternalIntElements() || | |
| 3617 HasExternalUnsignedIntElements() || | |
| 3618 HasExternalFloatElements()); | |
| 3619 } | 3614 } |
| 3620 | 3615 |
| 3621 | 3616 |
| 3622 bool JSObject::HasExternalByteElements() { | 3617 #define EXTERNAL_ELEMENTS_CHECK(name, type) \ |
| 3623 return GetElementsKind() == EXTERNAL_BYTE_ELEMENTS; | 3618 bool JSObject::HasExternal##name##Elements() { \ |
| 3619 HeapObject* array = elements(); \ |
| 3620 ASSERT(array != NULL); \ |
| 3621 if (!array->IsHeapObject()) \ |
| 3622 return false; \ |
| 3623 return array->map()->instance_type() == type; \ |
| 3624 } | 3624 } |
| 3625 | 3625 |
| 3626 | 3626 |
| 3627 bool JSObject::HasExternalUnsignedByteElements() { | 3627 EXTERNAL_ELEMENTS_CHECK(Byte, EXTERNAL_BYTE_ARRAY_TYPE) |
| 3628 return GetElementsKind() == EXTERNAL_UNSIGNED_BYTE_ELEMENTS; | 3628 EXTERNAL_ELEMENTS_CHECK(UnsignedByte, EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE) |
| 3629 } | 3629 EXTERNAL_ELEMENTS_CHECK(Short, EXTERNAL_SHORT_ARRAY_TYPE) |
| 3630 | 3630 EXTERNAL_ELEMENTS_CHECK(UnsignedShort, |
| 3631 | 3631 EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE) |
| 3632 bool JSObject::HasExternalShortElements() { | 3632 EXTERNAL_ELEMENTS_CHECK(Int, EXTERNAL_INT_ARRAY_TYPE) |
| 3633 return GetElementsKind() == EXTERNAL_SHORT_ELEMENTS; | 3633 EXTERNAL_ELEMENTS_CHECK(UnsignedInt, |
| 3634 } | 3634 EXTERNAL_UNSIGNED_INT_ARRAY_TYPE) |
| 3635 | 3635 EXTERNAL_ELEMENTS_CHECK(Float, |
| 3636 | 3636 EXTERNAL_FLOAT_ARRAY_TYPE) |
| 3637 bool JSObject::HasExternalUnsignedShortElements() { | 3637 EXTERNAL_ELEMENTS_CHECK(Pixel, EXTERNAL_PIXEL_ARRAY_TYPE) |
| 3638 return GetElementsKind() == EXTERNAL_UNSIGNED_SHORT_ELEMENTS; | |
| 3639 } | |
| 3640 | |
| 3641 | |
| 3642 bool JSObject::HasExternalIntElements() { | |
| 3643 return GetElementsKind() == EXTERNAL_INT_ELEMENTS; | |
| 3644 } | |
| 3645 | |
| 3646 | |
| 3647 bool JSObject::HasExternalUnsignedIntElements() { | |
| 3648 return GetElementsKind() == EXTERNAL_UNSIGNED_INT_ELEMENTS; | |
| 3649 } | |
| 3650 | |
| 3651 | |
| 3652 bool JSObject::HasExternalFloatElements() { | |
| 3653 return GetElementsKind() == EXTERNAL_FLOAT_ELEMENTS; | |
| 3654 } | |
| 3655 | 3638 |
| 3656 | 3639 |
| 3657 bool JSObject::HasNamedInterceptor() { | 3640 bool JSObject::HasNamedInterceptor() { |
| 3658 return map()->has_named_interceptor(); | 3641 return map()->has_named_interceptor(); |
| 3659 } | 3642 } |
| 3660 | 3643 |
| 3661 | 3644 |
| 3662 bool JSObject::HasIndexedInterceptor() { | 3645 bool JSObject::HasIndexedInterceptor() { |
| 3663 return map()->has_indexed_interceptor(); | 3646 return map()->has_indexed_interceptor(); |
| 3664 } | 3647 } |
| 3665 | 3648 |
| 3666 | 3649 |
| 3667 bool JSObject::AllowsSetElementsLength() { | 3650 bool JSObject::AllowsSetElementsLength() { |
| 3668 bool result = elements()->IsFixedArray(); | 3651 bool result = elements()->IsFixedArray(); |
| 3669 ASSERT(result == (!HasPixelElements() && !HasExternalArrayElements())); | 3652 ASSERT(result == !HasExternalArrayElements()); |
| 3670 return result; | 3653 return result; |
| 3671 } | 3654 } |
| 3672 | 3655 |
| 3673 | 3656 |
| 3674 MaybeObject* JSObject::EnsureWritableFastElements() { | 3657 MaybeObject* JSObject::EnsureWritableFastElements() { |
| 3675 ASSERT(HasFastElements()); | 3658 ASSERT(HasFastElements()); |
| 3676 FixedArray* elems = FixedArray::cast(elements()); | 3659 FixedArray* elems = FixedArray::cast(elements()); |
| 3677 Isolate* isolate = GetIsolate(); | 3660 Isolate* isolate = GetIsolate(); |
| 3678 if (elems->map() != isolate->heap()->fixed_cow_array_map()) return elems; | 3661 if (elems->map() != isolate->heap()->fixed_cow_array_map()) return elems; |
| 3679 Object* writable_elems; | 3662 Object* writable_elems; |
| (...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4097 #undef WRITE_INT_FIELD | 4080 #undef WRITE_INT_FIELD |
| 4098 #undef READ_SHORT_FIELD | 4081 #undef READ_SHORT_FIELD |
| 4099 #undef WRITE_SHORT_FIELD | 4082 #undef WRITE_SHORT_FIELD |
| 4100 #undef READ_BYTE_FIELD | 4083 #undef READ_BYTE_FIELD |
| 4101 #undef WRITE_BYTE_FIELD | 4084 #undef WRITE_BYTE_FIELD |
| 4102 | 4085 |
| 4103 | 4086 |
| 4104 } } // namespace v8::internal | 4087 } } // namespace v8::internal |
| 4105 | 4088 |
| 4106 #endif // V8_OBJECTS_INL_H_ | 4089 #endif // V8_OBJECTS_INL_H_ |
| OLD | NEW |