| 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 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 326 return IsSmi() || IsHeapNumber(); | 326 return IsSmi() || IsHeapNumber(); |
| 327 } | 327 } |
| 328 | 328 |
| 329 | 329 |
| 330 bool Object::IsByteArray() { | 330 bool Object::IsByteArray() { |
| 331 return Object::IsHeapObject() | 331 return Object::IsHeapObject() |
| 332 && HeapObject::cast(this)->map()->instance_type() == BYTE_ARRAY_TYPE; | 332 && HeapObject::cast(this)->map()->instance_type() == BYTE_ARRAY_TYPE; |
| 333 } | 333 } |
| 334 | 334 |
| 335 | 335 |
| 336 bool Object::IsPixelArray() { | 336 bool Object::IsExternalPixelArray() { |
| 337 return Object::IsHeapObject() && | 337 return Object::IsHeapObject() && |
| 338 HeapObject::cast(this)->map()->instance_type() == PIXEL_ARRAY_TYPE; | 338 HeapObject::cast(this)->map()->instance_type() == |
| 339 EXTERNAL_PIXEL_ARRAY_TYPE; |
| 339 } | 340 } |
| 340 | 341 |
| 341 | 342 |
| 342 bool Object::IsExternalArray() { | 343 bool Object::IsExternalArray() { |
| 343 if (!Object::IsHeapObject()) | 344 if (!Object::IsHeapObject()) |
| 344 return false; | 345 return false; |
| 345 InstanceType instance_type = | 346 InstanceType instance_type = |
| 346 HeapObject::cast(this)->map()->instance_type(); | 347 HeapObject::cast(this)->map()->instance_type(); |
| 347 return (instance_type >= FIRST_EXTERNAL_ARRAY_TYPE && | 348 return (instance_type >= FIRST_EXTERNAL_ARRAY_TYPE && |
| 348 instance_type <= LAST_EXTERNAL_ARRAY_TYPE); | 349 instance_type <= LAST_EXTERNAL_ARRAY_TYPE); |
| (...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 765 return Failure::Exception(); | 766 return Failure::Exception(); |
| 766 } | 767 } |
| 767 | 768 |
| 768 | 769 |
| 769 bool Object::HasSpecificClassOf(String* name) { | 770 bool Object::HasSpecificClassOf(String* name) { |
| 770 return this->IsJSObject() && (JSObject::cast(this)->class_name() == name); | 771 return this->IsJSObject() && (JSObject::cast(this)->class_name() == name); |
| 771 } | 772 } |
| 772 | 773 |
| 773 | 774 |
| 774 MaybeObject* Object::GetElement(uint32_t index) { | 775 MaybeObject* Object::GetElement(uint32_t index) { |
| 776 // GetElement can trigger a getter which can cause allocation. |
| 777 // This was not always the case. This ASSERT is here to catch |
| 778 // leftover incorrect uses. |
| 779 ASSERT(Heap::IsAllocationAllowed()); |
| 775 return GetElementWithReceiver(this, index); | 780 return GetElementWithReceiver(this, index); |
| 776 } | 781 } |
| 777 | 782 |
| 778 | 783 |
| 779 Object* Object::GetElementNoExceptionThrown(uint32_t index) { | 784 Object* Object::GetElementNoExceptionThrown(uint32_t index) { |
| 780 MaybeObject* maybe = GetElementWithReceiver(this, index); | 785 MaybeObject* maybe = GetElementWithReceiver(this, index); |
| 781 ASSERT(!maybe->IsFailure()); | 786 ASSERT(!maybe->IsFailure()); |
| 782 Object* result = NULL; // Initialization to please compiler. | 787 Object* result = NULL; // Initialization to please compiler. |
| 783 maybe->ToObject(&result); | 788 maybe->ToObject(&result); |
| 784 return result; | 789 return result; |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1069 return READ_INT_FIELD(this, kExponentOffset) & kSignMask; | 1074 return READ_INT_FIELD(this, kExponentOffset) & kSignMask; |
| 1070 } | 1075 } |
| 1071 | 1076 |
| 1072 | 1077 |
| 1073 ACCESSORS(JSObject, properties, FixedArray, kPropertiesOffset) | 1078 ACCESSORS(JSObject, properties, FixedArray, kPropertiesOffset) |
| 1074 | 1079 |
| 1075 | 1080 |
| 1076 HeapObject* JSObject::elements() { | 1081 HeapObject* JSObject::elements() { |
| 1077 Object* array = READ_FIELD(this, kElementsOffset); | 1082 Object* array = READ_FIELD(this, kElementsOffset); |
| 1078 // In the assert below Dictionary is covered under FixedArray. | 1083 // In the assert below Dictionary is covered under FixedArray. |
| 1079 ASSERT(array->IsFixedArray() || array->IsPixelArray() || | 1084 ASSERT(array->IsFixedArray() || array->IsExternalArray()); |
| 1080 array->IsExternalArray()); | |
| 1081 return reinterpret_cast<HeapObject*>(array); | 1085 return reinterpret_cast<HeapObject*>(array); |
| 1082 } | 1086 } |
| 1083 | 1087 |
| 1084 | 1088 |
| 1085 void JSObject::set_elements(HeapObject* value, WriteBarrierMode mode) { | 1089 void JSObject::set_elements(HeapObject* value, WriteBarrierMode mode) { |
| 1086 ASSERT(map()->has_fast_elements() == | 1090 ASSERT(map()->has_fast_elements() == |
| 1087 (value->map() == Heap::fixed_array_map() || | 1091 (value->map() == Heap::fixed_array_map() || |
| 1088 value->map() == Heap::fixed_cow_array_map())); | 1092 value->map() == Heap::fixed_cow_array_map())); |
| 1089 // In the assert below Dictionary is covered under FixedArray. | 1093 // In the assert below Dictionary is covered under FixedArray. |
| 1090 ASSERT(value->IsFixedArray() || value->IsPixelArray() || | 1094 ASSERT(value->IsFixedArray() || value->IsExternalArray()); |
| 1091 value->IsExternalArray()); | |
| 1092 WRITE_FIELD(this, kElementsOffset, value); | 1095 WRITE_FIELD(this, kElementsOffset, value); |
| 1093 WRITE_BARRIER(this, kElementsOffset, value); | 1096 WRITE_BARRIER(this, kElementsOffset, value); |
| 1094 } | 1097 } |
| 1095 | 1098 |
| 1096 | 1099 |
| 1097 void JSObject::initialize_properties() { | 1100 void JSObject::initialize_properties() { |
| 1098 ASSERT(!Heap::InNewSpace(Heap::empty_fixed_array())); | 1101 ASSERT(!Heap::InNewSpace(Heap::empty_fixed_array())); |
| 1099 WRITE_FIELD(this, kPropertiesOffset, Heap::empty_fixed_array()); | 1102 WRITE_FIELD(this, kPropertiesOffset, Heap::empty_fixed_array()); |
| 1100 } | 1103 } |
| 1101 | 1104 |
| (...skipping 514 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1616 CAST_ACCESSOR(JSFunction) | 1619 CAST_ACCESSOR(JSFunction) |
| 1617 CAST_ACCESSOR(GlobalObject) | 1620 CAST_ACCESSOR(GlobalObject) |
| 1618 CAST_ACCESSOR(JSGlobalProxy) | 1621 CAST_ACCESSOR(JSGlobalProxy) |
| 1619 CAST_ACCESSOR(JSGlobalObject) | 1622 CAST_ACCESSOR(JSGlobalObject) |
| 1620 CAST_ACCESSOR(JSBuiltinsObject) | 1623 CAST_ACCESSOR(JSBuiltinsObject) |
| 1621 CAST_ACCESSOR(Code) | 1624 CAST_ACCESSOR(Code) |
| 1622 CAST_ACCESSOR(JSArray) | 1625 CAST_ACCESSOR(JSArray) |
| 1623 CAST_ACCESSOR(JSRegExp) | 1626 CAST_ACCESSOR(JSRegExp) |
| 1624 CAST_ACCESSOR(Proxy) | 1627 CAST_ACCESSOR(Proxy) |
| 1625 CAST_ACCESSOR(ByteArray) | 1628 CAST_ACCESSOR(ByteArray) |
| 1626 CAST_ACCESSOR(PixelArray) | |
| 1627 CAST_ACCESSOR(ExternalArray) | 1629 CAST_ACCESSOR(ExternalArray) |
| 1628 CAST_ACCESSOR(ExternalByteArray) | 1630 CAST_ACCESSOR(ExternalByteArray) |
| 1629 CAST_ACCESSOR(ExternalUnsignedByteArray) | 1631 CAST_ACCESSOR(ExternalUnsignedByteArray) |
| 1630 CAST_ACCESSOR(ExternalShortArray) | 1632 CAST_ACCESSOR(ExternalShortArray) |
| 1631 CAST_ACCESSOR(ExternalUnsignedShortArray) | 1633 CAST_ACCESSOR(ExternalUnsignedShortArray) |
| 1632 CAST_ACCESSOR(ExternalIntArray) | 1634 CAST_ACCESSOR(ExternalIntArray) |
| 1633 CAST_ACCESSOR(ExternalUnsignedIntArray) | 1635 CAST_ACCESSOR(ExternalUnsignedIntArray) |
| 1634 CAST_ACCESSOR(ExternalFloatArray) | 1636 CAST_ACCESSOR(ExternalFloatArray) |
| 1637 CAST_ACCESSOR(ExternalPixelArray) |
| 1635 CAST_ACCESSOR(Struct) | 1638 CAST_ACCESSOR(Struct) |
| 1636 | 1639 |
| 1637 | 1640 |
| 1638 #define MAKE_STRUCT_CAST(NAME, Name, name) CAST_ACCESSOR(Name) | 1641 #define MAKE_STRUCT_CAST(NAME, Name, name) CAST_ACCESSOR(Name) |
| 1639 STRUCT_LIST(MAKE_STRUCT_CAST) | 1642 STRUCT_LIST(MAKE_STRUCT_CAST) |
| 1640 #undef MAKE_STRUCT_CAST | 1643 #undef MAKE_STRUCT_CAST |
| 1641 | 1644 |
| 1642 | 1645 |
| 1643 template <typename Shape, typename Key> | 1646 template <typename Shape, typename Key> |
| 1644 HashTable<Shape, Key>* HashTable<Shape, Key>::cast(Object* obj) { | 1647 HashTable<Shape, Key>* HashTable<Shape, Key>::cast(Object* obj) { |
| 1645 ASSERT(obj->IsHashTable()); | 1648 ASSERT(obj->IsHashTable()); |
| 1646 return reinterpret_cast<HashTable*>(obj); | 1649 return reinterpret_cast<HashTable*>(obj); |
| 1647 } | 1650 } |
| 1648 | 1651 |
| 1649 | 1652 |
| 1650 SMI_ACCESSORS(FixedArray, length, kLengthOffset) | 1653 SMI_ACCESSORS(FixedArray, length, kLengthOffset) |
| 1651 SMI_ACCESSORS(ByteArray, length, kLengthOffset) | 1654 SMI_ACCESSORS(ByteArray, length, kLengthOffset) |
| 1652 | 1655 |
| 1653 INT_ACCESSORS(PixelArray, length, kLengthOffset) | |
| 1654 INT_ACCESSORS(ExternalArray, length, kLengthOffset) | 1656 INT_ACCESSORS(ExternalArray, length, kLengthOffset) |
| 1655 | 1657 |
| 1656 | 1658 |
| 1657 SMI_ACCESSORS(String, length, kLengthOffset) | 1659 SMI_ACCESSORS(String, length, kLengthOffset) |
| 1658 | 1660 |
| 1659 | 1661 |
| 1660 uint32_t String::hash_field() { | 1662 uint32_t String::hash_field() { |
| 1661 return READ_UINT32_FIELD(this, kHashFieldOffset); | 1663 return READ_UINT32_FIELD(this, kHashFieldOffset); |
| 1662 } | 1664 } |
| 1663 | 1665 |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1910 ASSERT_TAG_ALIGNED(address); | 1912 ASSERT_TAG_ALIGNED(address); |
| 1911 return reinterpret_cast<ByteArray*>(address - kHeaderSize + kHeapObjectTag); | 1913 return reinterpret_cast<ByteArray*>(address - kHeaderSize + kHeapObjectTag); |
| 1912 } | 1914 } |
| 1913 | 1915 |
| 1914 | 1916 |
| 1915 Address ByteArray::GetDataStartAddress() { | 1917 Address ByteArray::GetDataStartAddress() { |
| 1916 return reinterpret_cast<Address>(this) - kHeapObjectTag + kHeaderSize; | 1918 return reinterpret_cast<Address>(this) - kHeapObjectTag + kHeaderSize; |
| 1917 } | 1919 } |
| 1918 | 1920 |
| 1919 | 1921 |
| 1920 uint8_t* PixelArray::external_pointer() { | 1922 uint8_t* ExternalPixelArray::external_pixel_pointer() { |
| 1921 intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset); | 1923 return reinterpret_cast<uint8_t*>(external_pointer()); |
| 1922 return reinterpret_cast<uint8_t*>(ptr); | |
| 1923 } | 1924 } |
| 1924 | 1925 |
| 1925 | 1926 |
| 1926 void PixelArray::set_external_pointer(uint8_t* value, WriteBarrierMode mode) { | 1927 uint8_t ExternalPixelArray::get(int index) { |
| 1927 intptr_t ptr = reinterpret_cast<intptr_t>(value); | |
| 1928 WRITE_INTPTR_FIELD(this, kExternalPointerOffset, ptr); | |
| 1929 } | |
| 1930 | |
| 1931 | |
| 1932 uint8_t PixelArray::get(int index) { | |
| 1933 ASSERT((index >= 0) && (index < this->length())); | 1928 ASSERT((index >= 0) && (index < this->length())); |
| 1934 uint8_t* ptr = external_pointer(); | 1929 uint8_t* ptr = external_pixel_pointer(); |
| 1935 return ptr[index]; | 1930 return ptr[index]; |
| 1936 } | 1931 } |
| 1937 | 1932 |
| 1938 | 1933 |
| 1939 void PixelArray::set(int index, uint8_t value) { | 1934 void ExternalPixelArray::set(int index, uint8_t value) { |
| 1940 ASSERT((index >= 0) && (index < this->length())); | 1935 ASSERT((index >= 0) && (index < this->length())); |
| 1941 uint8_t* ptr = external_pointer(); | 1936 uint8_t* ptr = external_pixel_pointer(); |
| 1942 ptr[index] = value; | 1937 ptr[index] = value; |
| 1943 } | 1938 } |
| 1944 | 1939 |
| 1945 | 1940 |
| 1946 void* ExternalArray::external_pointer() { | 1941 void* ExternalArray::external_pointer() { |
| 1947 intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset); | 1942 intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset); |
| 1948 return reinterpret_cast<void*>(ptr); | 1943 return reinterpret_cast<void*>(ptr); |
| 1949 } | 1944 } |
| 1950 | 1945 |
| 1951 | 1946 |
| (...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2409 return static_cast<CheckType>(type); | 2404 return static_cast<CheckType>(type); |
| 2410 } | 2405 } |
| 2411 | 2406 |
| 2412 | 2407 |
| 2413 void Code::set_check_type(CheckType value) { | 2408 void Code::set_check_type(CheckType value) { |
| 2414 ASSERT(is_call_stub() || is_keyed_call_stub()); | 2409 ASSERT(is_call_stub() || is_keyed_call_stub()); |
| 2415 WRITE_BYTE_FIELD(this, kCheckTypeOffset, value); | 2410 WRITE_BYTE_FIELD(this, kCheckTypeOffset, value); |
| 2416 } | 2411 } |
| 2417 | 2412 |
| 2418 | 2413 |
| 2414 ExternalArrayType Code::external_array_type() { |
| 2415 ASSERT(is_external_array_load_stub() || is_external_array_store_stub()); |
| 2416 byte type = READ_BYTE_FIELD(this, kExternalArrayTypeOffset); |
| 2417 return static_cast<ExternalArrayType>(type); |
| 2418 } |
| 2419 |
| 2420 |
| 2421 void Code::set_external_array_type(ExternalArrayType value) { |
| 2422 ASSERT(is_external_array_load_stub() || is_external_array_store_stub()); |
| 2423 WRITE_BYTE_FIELD(this, kExternalArrayTypeOffset, value); |
| 2424 } |
| 2425 |
| 2426 |
| 2419 byte Code::binary_op_type() { | 2427 byte Code::binary_op_type() { |
| 2420 ASSERT(is_binary_op_stub()); | 2428 ASSERT(is_binary_op_stub()); |
| 2421 return READ_BYTE_FIELD(this, kBinaryOpTypeOffset); | 2429 return READ_BYTE_FIELD(this, kBinaryOpTypeOffset); |
| 2422 } | 2430 } |
| 2423 | 2431 |
| 2424 | 2432 |
| 2425 void Code::set_binary_op_type(byte value) { | 2433 void Code::set_binary_op_type(byte value) { |
| 2426 ASSERT(is_binary_op_stub()); | 2434 ASSERT(is_binary_op_stub()); |
| 2427 WRITE_BYTE_FIELD(this, kBinaryOpTypeOffset, value); | 2435 WRITE_BYTE_FIELD(this, kBinaryOpTypeOffset, value); |
| 2428 } | 2436 } |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2475 InlineCacheState ic_state, | 2483 InlineCacheState ic_state, |
| 2476 ExtraICState extra_ic_state, | 2484 ExtraICState extra_ic_state, |
| 2477 PropertyType type, | 2485 PropertyType type, |
| 2478 int argc, | 2486 int argc, |
| 2479 InlineCacheHolderFlag holder) { | 2487 InlineCacheHolderFlag holder) { |
| 2480 // Extra IC state is only allowed for monomorphic call IC stubs | 2488 // Extra IC state is only allowed for monomorphic call IC stubs |
| 2481 // or for store IC stubs. | 2489 // or for store IC stubs. |
| 2482 ASSERT(extra_ic_state == kNoExtraICState || | 2490 ASSERT(extra_ic_state == kNoExtraICState || |
| 2483 (kind == CALL_IC && (ic_state == MONOMORPHIC || | 2491 (kind == CALL_IC && (ic_state == MONOMORPHIC || |
| 2484 ic_state == MONOMORPHIC_PROTOTYPE_FAILURE)) || | 2492 ic_state == MONOMORPHIC_PROTOTYPE_FAILURE)) || |
| 2485 (kind == STORE_IC)); | 2493 (kind == STORE_IC) || |
| 2494 (kind == KEYED_STORE_IC)); |
| 2486 // Compute the bit mask. | 2495 // Compute the bit mask. |
| 2487 int bits = kind << kFlagsKindShift; | 2496 int bits = kind << kFlagsKindShift; |
| 2488 if (in_loop) bits |= kFlagsICInLoopMask; | 2497 if (in_loop) bits |= kFlagsICInLoopMask; |
| 2489 bits |= ic_state << kFlagsICStateShift; | 2498 bits |= ic_state << kFlagsICStateShift; |
| 2490 bits |= type << kFlagsTypeShift; | 2499 bits |= type << kFlagsTypeShift; |
| 2491 bits |= extra_ic_state << kFlagsExtraICStateShift; | 2500 bits |= extra_ic_state << kFlagsExtraICStateShift; |
| 2492 bits |= argc << kFlagsArgumentsCountShift; | 2501 bits |= argc << kFlagsArgumentsCountShift; |
| 2493 if (holder == PROTOTYPE_MAP) bits |= kFlagsCacheInPrototypeMapMask; | 2502 if (holder == PROTOTYPE_MAP) bits |= kFlagsCacheInPrototypeMapMask; |
| 2494 // Cast to flags and validate result before returning it. | 2503 // Cast to flags and validate result before returning it. |
| 2495 Flags result = static_cast<Flags>(bits); | 2504 Flags result = static_cast<Flags>(bits); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2609 { MaybeObject* maybe_obj = CopyDropTransitions(); | 2618 { MaybeObject* maybe_obj = CopyDropTransitions(); |
| 2610 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 2619 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| 2611 } | 2620 } |
| 2612 Map* new_map = Map::cast(obj); | 2621 Map* new_map = Map::cast(obj); |
| 2613 new_map->set_has_fast_elements(false); | 2622 new_map->set_has_fast_elements(false); |
| 2614 Counters::map_fast_to_slow_elements.Increment(); | 2623 Counters::map_fast_to_slow_elements.Increment(); |
| 2615 return new_map; | 2624 return new_map; |
| 2616 } | 2625 } |
| 2617 | 2626 |
| 2618 | 2627 |
| 2619 MaybeObject* Map::GetPixelArrayElementsMap() { | 2628 MaybeObject* Map::NewExternalArrayElementsMap() { |
| 2620 if (has_pixel_array_elements()) return this; | |
| 2621 // TODO(danno): Special case empty object map (or most common case) | 2629 // TODO(danno): Special case empty object map (or most common case) |
| 2622 // to return a pre-canned pixel array map. | 2630 // to return a pre-canned pixel array map. |
| 2623 Object* obj; | 2631 Object* obj; |
| 2624 { MaybeObject* maybe_obj = CopyDropTransitions(); | 2632 { MaybeObject* maybe_obj = CopyDropTransitions(); |
| 2625 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 2633 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| 2626 } | 2634 } |
| 2627 Map* new_map = Map::cast(obj); | 2635 Map* new_map = Map::cast(obj); |
| 2628 new_map->set_has_fast_elements(false); | 2636 new_map->set_has_fast_elements(false); |
| 2629 new_map->set_has_pixel_array_elements(true); | 2637 new_map->set_has_external_array_elements(true); |
| 2630 Counters::map_to_pixel_array_elements.Increment(); | 2638 Counters::map_to_external_array_elements.Increment(); |
| 2631 return new_map; | 2639 return new_map; |
| 2632 } | 2640 } |
| 2633 | 2641 |
| 2634 | 2642 |
| 2635 ACCESSORS(Map, instance_descriptors, DescriptorArray, | 2643 ACCESSORS(Map, instance_descriptors, DescriptorArray, |
| 2636 kInstanceDescriptorsOffset) | 2644 kInstanceDescriptorsOffset) |
| 2637 ACCESSORS(Map, code_cache, Object, kCodeCacheOffset) | 2645 ACCESSORS(Map, code_cache, Object, kCodeCacheOffset) |
| 2638 ACCESSORS(Map, constructor, Object, kConstructorOffset) | 2646 ACCESSORS(Map, constructor, Object, kConstructorOffset) |
| 2639 | 2647 |
| 2640 ACCESSORS(JSFunction, shared, SharedFunctionInfo, kSharedFunctionInfoOffset) | 2648 ACCESSORS(JSFunction, shared, SharedFunctionInfo, kSharedFunctionInfoOffset) |
| (...skipping 699 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3340 case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE: | 3348 case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE: |
| 3341 return EXTERNAL_UNSIGNED_BYTE_ELEMENTS; | 3349 return EXTERNAL_UNSIGNED_BYTE_ELEMENTS; |
| 3342 case EXTERNAL_SHORT_ARRAY_TYPE: | 3350 case EXTERNAL_SHORT_ARRAY_TYPE: |
| 3343 return EXTERNAL_SHORT_ELEMENTS; | 3351 return EXTERNAL_SHORT_ELEMENTS; |
| 3344 case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE: | 3352 case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE: |
| 3345 return EXTERNAL_UNSIGNED_SHORT_ELEMENTS; | 3353 return EXTERNAL_UNSIGNED_SHORT_ELEMENTS; |
| 3346 case EXTERNAL_INT_ARRAY_TYPE: | 3354 case EXTERNAL_INT_ARRAY_TYPE: |
| 3347 return EXTERNAL_INT_ELEMENTS; | 3355 return EXTERNAL_INT_ELEMENTS; |
| 3348 case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE: | 3356 case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE: |
| 3349 return EXTERNAL_UNSIGNED_INT_ELEMENTS; | 3357 return EXTERNAL_UNSIGNED_INT_ELEMENTS; |
| 3358 case EXTERNAL_PIXEL_ARRAY_TYPE: |
| 3359 return EXTERNAL_PIXEL_ELEMENTS; |
| 3350 default: | 3360 default: |
| 3351 ASSERT(array->map()->instance_type() == EXTERNAL_FLOAT_ARRAY_TYPE); | 3361 break; |
| 3352 return EXTERNAL_FLOAT_ELEMENTS; | |
| 3353 } | 3362 } |
| 3354 } | 3363 } |
| 3355 ASSERT(array->IsPixelArray()); | 3364 ASSERT(array->map()->instance_type() == EXTERNAL_FLOAT_ARRAY_TYPE); |
| 3356 return PIXEL_ELEMENTS; | 3365 return EXTERNAL_FLOAT_ELEMENTS; |
| 3357 } | 3366 } |
| 3358 | 3367 |
| 3359 | 3368 |
| 3360 bool JSObject::HasFastElements() { | 3369 bool JSObject::HasFastElements() { |
| 3361 return GetElementsKind() == FAST_ELEMENTS; | 3370 return GetElementsKind() == FAST_ELEMENTS; |
| 3362 } | 3371 } |
| 3363 | 3372 |
| 3364 | 3373 |
| 3365 bool JSObject::HasDictionaryElements() { | 3374 bool JSObject::HasDictionaryElements() { |
| 3366 return GetElementsKind() == DICTIONARY_ELEMENTS; | 3375 return GetElementsKind() == DICTIONARY_ELEMENTS; |
| 3367 } | 3376 } |
| 3368 | 3377 |
| 3369 | 3378 |
| 3370 bool JSObject::HasPixelElements() { | |
| 3371 return GetElementsKind() == PIXEL_ELEMENTS; | |
| 3372 } | |
| 3373 | |
| 3374 | |
| 3375 bool JSObject::HasExternalArrayElements() { | 3379 bool JSObject::HasExternalArrayElements() { |
| 3376 return (HasExternalByteElements() || | 3380 HeapObject* array = elements(); |
| 3377 HasExternalUnsignedByteElements() || | 3381 ASSERT(array != NULL); |
| 3378 HasExternalShortElements() || | 3382 return array->IsExternalArray(); |
| 3379 HasExternalUnsignedShortElements() || | |
| 3380 HasExternalIntElements() || | |
| 3381 HasExternalUnsignedIntElements() || | |
| 3382 HasExternalFloatElements()); | |
| 3383 } | 3383 } |
| 3384 | 3384 |
| 3385 | 3385 |
| 3386 bool JSObject::HasExternalByteElements() { | 3386 #define EXTERNAL_ELEMENTS_CHECK(name, type) \ |
| 3387 return GetElementsKind() == EXTERNAL_BYTE_ELEMENTS; | 3387 bool JSObject::HasExternal##name##Elements() { \ |
| 3388 HeapObject* array = elements(); \ |
| 3389 ASSERT(array != NULL); \ |
| 3390 if (!array->IsHeapObject()) \ |
| 3391 return false; \ |
| 3392 return array->map()->instance_type() == type; \ |
| 3388 } | 3393 } |
| 3389 | 3394 |
| 3390 | 3395 |
| 3391 bool JSObject::HasExternalUnsignedByteElements() { | 3396 EXTERNAL_ELEMENTS_CHECK(Byte, EXTERNAL_BYTE_ARRAY_TYPE) |
| 3392 return GetElementsKind() == EXTERNAL_UNSIGNED_BYTE_ELEMENTS; | 3397 EXTERNAL_ELEMENTS_CHECK(UnsignedByte, EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE) |
| 3393 } | 3398 EXTERNAL_ELEMENTS_CHECK(Short, EXTERNAL_SHORT_ARRAY_TYPE) |
| 3394 | 3399 EXTERNAL_ELEMENTS_CHECK(UnsignedShort, |
| 3395 | 3400 EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE) |
| 3396 bool JSObject::HasExternalShortElements() { | 3401 EXTERNAL_ELEMENTS_CHECK(Int, EXTERNAL_INT_ARRAY_TYPE) |
| 3397 return GetElementsKind() == EXTERNAL_SHORT_ELEMENTS; | 3402 EXTERNAL_ELEMENTS_CHECK(UnsignedInt, |
| 3398 } | 3403 EXTERNAL_UNSIGNED_INT_ARRAY_TYPE) |
| 3399 | 3404 EXTERNAL_ELEMENTS_CHECK(Float, |
| 3400 | 3405 EXTERNAL_FLOAT_ARRAY_TYPE) |
| 3401 bool JSObject::HasExternalUnsignedShortElements() { | 3406 EXTERNAL_ELEMENTS_CHECK(Pixel, EXTERNAL_PIXEL_ARRAY_TYPE) |
| 3402 return GetElementsKind() == EXTERNAL_UNSIGNED_SHORT_ELEMENTS; | |
| 3403 } | |
| 3404 | |
| 3405 | |
| 3406 bool JSObject::HasExternalIntElements() { | |
| 3407 return GetElementsKind() == EXTERNAL_INT_ELEMENTS; | |
| 3408 } | |
| 3409 | |
| 3410 | |
| 3411 bool JSObject::HasExternalUnsignedIntElements() { | |
| 3412 return GetElementsKind() == EXTERNAL_UNSIGNED_INT_ELEMENTS; | |
| 3413 } | |
| 3414 | |
| 3415 | |
| 3416 bool JSObject::HasExternalFloatElements() { | |
| 3417 return GetElementsKind() == EXTERNAL_FLOAT_ELEMENTS; | |
| 3418 } | |
| 3419 | 3407 |
| 3420 | 3408 |
| 3421 bool JSObject::HasNamedInterceptor() { | 3409 bool JSObject::HasNamedInterceptor() { |
| 3422 return map()->has_named_interceptor(); | 3410 return map()->has_named_interceptor(); |
| 3423 } | 3411 } |
| 3424 | 3412 |
| 3425 | 3413 |
| 3426 bool JSObject::HasIndexedInterceptor() { | 3414 bool JSObject::HasIndexedInterceptor() { |
| 3427 return map()->has_indexed_interceptor(); | 3415 return map()->has_indexed_interceptor(); |
| 3428 } | 3416 } |
| 3429 | 3417 |
| 3430 | 3418 |
| 3431 bool JSObject::AllowsSetElementsLength() { | 3419 bool JSObject::AllowsSetElementsLength() { |
| 3432 bool result = elements()->IsFixedArray(); | 3420 bool result = elements()->IsFixedArray(); |
| 3433 ASSERT(result == (!HasPixelElements() && !HasExternalArrayElements())); | 3421 ASSERT(result == !HasExternalArrayElements()); |
| 3434 return result; | 3422 return result; |
| 3435 } | 3423 } |
| 3436 | 3424 |
| 3437 | 3425 |
| 3438 MaybeObject* JSObject::EnsureWritableFastElements() { | 3426 MaybeObject* JSObject::EnsureWritableFastElements() { |
| 3439 ASSERT(HasFastElements()); | 3427 ASSERT(HasFastElements()); |
| 3440 FixedArray* elems = FixedArray::cast(elements()); | 3428 FixedArray* elems = FixedArray::cast(elements()); |
| 3441 if (elems->map() != Heap::fixed_cow_array_map()) return elems; | 3429 if (elems->map() != Heap::fixed_cow_array_map()) return elems; |
| 3442 Object* writable_elems; | 3430 Object* writable_elems; |
| 3443 { MaybeObject* maybe_writable_elems = | 3431 { MaybeObject* maybe_writable_elems = |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3541 result += (result << 3); | 3529 result += (result << 3); |
| 3542 result ^= (result >> 11); | 3530 result ^= (result >> 11); |
| 3543 result += (result << 15); | 3531 result += (result << 15); |
| 3544 if (result == 0) { | 3532 if (result == 0) { |
| 3545 result = 27; | 3533 result = 27; |
| 3546 } | 3534 } |
| 3547 return result; | 3535 return result; |
| 3548 } | 3536 } |
| 3549 | 3537 |
| 3550 | 3538 |
| 3539 template <typename schar> |
| 3540 uint32_t HashSequentialString(const schar* chars, int length) { |
| 3541 StringHasher hasher(length); |
| 3542 if (!hasher.has_trivial_hash()) { |
| 3543 int i; |
| 3544 for (i = 0; hasher.is_array_index() && (i < length); i++) { |
| 3545 hasher.AddCharacter(chars[i]); |
| 3546 } |
| 3547 for (; i < length; i++) { |
| 3548 hasher.AddCharacterNoIndex(chars[i]); |
| 3549 } |
| 3550 } |
| 3551 return hasher.GetHashField(); |
| 3552 } |
| 3553 |
| 3554 |
| 3551 bool String::AsArrayIndex(uint32_t* index) { | 3555 bool String::AsArrayIndex(uint32_t* index) { |
| 3552 uint32_t field = hash_field(); | 3556 uint32_t field = hash_field(); |
| 3553 if (IsHashFieldComputed(field) && (field & kIsNotArrayIndexMask)) { | 3557 if (IsHashFieldComputed(field) && (field & kIsNotArrayIndexMask)) { |
| 3554 return false; | 3558 return false; |
| 3555 } | 3559 } |
| 3556 return SlowAsArrayIndex(index); | 3560 return SlowAsArrayIndex(index); |
| 3557 } | 3561 } |
| 3558 | 3562 |
| 3559 | 3563 |
| 3560 Object* JSObject::GetPrototype() { | 3564 Object* JSObject::GetPrototype() { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3598 Heap::hidden_symbol(), | 3602 Heap::hidden_symbol(), |
| 3599 &attributes)->ToObjectUnchecked(); | 3603 &attributes)->ToObjectUnchecked(); |
| 3600 return result; | 3604 return result; |
| 3601 } | 3605 } |
| 3602 | 3606 |
| 3603 | 3607 |
| 3604 MaybeObject* JSObject::SetHiddenPropertiesObject(Object* hidden_obj) { | 3608 MaybeObject* JSObject::SetHiddenPropertiesObject(Object* hidden_obj) { |
| 3605 ASSERT(!IsJSGlobalProxy()); | 3609 ASSERT(!IsJSGlobalProxy()); |
| 3606 return SetPropertyPostInterceptor(Heap::hidden_symbol(), | 3610 return SetPropertyPostInterceptor(Heap::hidden_symbol(), |
| 3607 hidden_obj, | 3611 hidden_obj, |
| 3608 DONT_ENUM); | 3612 DONT_ENUM, |
| 3613 kNonStrictMode); |
| 3609 } | 3614 } |
| 3610 | 3615 |
| 3611 | 3616 |
| 3612 bool JSObject::HasElement(uint32_t index) { | 3617 bool JSObject::HasElement(uint32_t index) { |
| 3613 return HasElementWithReceiver(this, index); | 3618 return HasElementWithReceiver(this, index); |
| 3614 } | 3619 } |
| 3615 | 3620 |
| 3616 | 3621 |
| 3617 bool AccessorInfo::all_can_read() { | 3622 bool AccessorInfo::all_can_read() { |
| 3618 return BooleanBit::get(flag(), kAllCanReadBit); | 3623 return BooleanBit::get(flag(), kAllCanReadBit); |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3798 #undef WRITE_INT_FIELD | 3803 #undef WRITE_INT_FIELD |
| 3799 #undef READ_SHORT_FIELD | 3804 #undef READ_SHORT_FIELD |
| 3800 #undef WRITE_SHORT_FIELD | 3805 #undef WRITE_SHORT_FIELD |
| 3801 #undef READ_BYTE_FIELD | 3806 #undef READ_BYTE_FIELD |
| 3802 #undef WRITE_BYTE_FIELD | 3807 #undef WRITE_BYTE_FIELD |
| 3803 | 3808 |
| 3804 | 3809 |
| 3805 } } // namespace v8::internal | 3810 } } // namespace v8::internal |
| 3806 | 3811 |
| 3807 #endif // V8_OBJECTS_INL_H_ | 3812 #endif // V8_OBJECTS_INL_H_ |
| OLD | NEW |