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

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

Issue 6697023: Merge 6800:7180 from the bleeding edge branch to the experimental/gc branch. (Closed) Base URL: http://v8.googlecode.com/svn/branches/experimental/gc/
Patch Set: Created 9 years, 9 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
« no previous file with comments | « src/objects-debug.cc ('k') | src/objects-printer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
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
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
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
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
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_
OLDNEW
« no previous file with comments | « src/objects-debug.cc ('k') | src/objects-printer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698