| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 505 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 516 HEAP_NUMBER_TYPE, | 516 HEAP_NUMBER_TYPE, |
| 517 PROXY_TYPE, | 517 PROXY_TYPE, |
| 518 BYTE_ARRAY_TYPE, | 518 BYTE_ARRAY_TYPE, |
| 519 EXTERNAL_BYTE_ARRAY_TYPE, // FIRST_EXTERNAL_ARRAY_TYPE | 519 EXTERNAL_BYTE_ARRAY_TYPE, // FIRST_EXTERNAL_ARRAY_TYPE |
| 520 EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE, | 520 EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE, |
| 521 EXTERNAL_SHORT_ARRAY_TYPE, | 521 EXTERNAL_SHORT_ARRAY_TYPE, |
| 522 EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE, | 522 EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE, |
| 523 EXTERNAL_INT_ARRAY_TYPE, | 523 EXTERNAL_INT_ARRAY_TYPE, |
| 524 EXTERNAL_UNSIGNED_INT_ARRAY_TYPE, | 524 EXTERNAL_UNSIGNED_INT_ARRAY_TYPE, |
| 525 EXTERNAL_FLOAT_ARRAY_TYPE, | 525 EXTERNAL_FLOAT_ARRAY_TYPE, |
| 526 EXTERNAL_DOUBLE_ARRAY_TYPE, |
| 526 EXTERNAL_PIXEL_ARRAY_TYPE, // LAST_EXTERNAL_ARRAY_TYPE | 527 EXTERNAL_PIXEL_ARRAY_TYPE, // LAST_EXTERNAL_ARRAY_TYPE |
| 527 FILLER_TYPE, // LAST_DATA_TYPE | 528 FILLER_TYPE, // LAST_DATA_TYPE |
| 528 | 529 |
| 529 // Structs. | 530 // Structs. |
| 530 ACCESSOR_INFO_TYPE, | 531 ACCESSOR_INFO_TYPE, |
| 531 ACCESS_CHECK_INFO_TYPE, | 532 ACCESS_CHECK_INFO_TYPE, |
| 532 INTERCEPTOR_INFO_TYPE, | 533 INTERCEPTOR_INFO_TYPE, |
| 533 CALL_HANDLER_INFO_TYPE, | 534 CALL_HANDLER_INFO_TYPE, |
| 534 FUNCTION_TEMPLATE_INFO_TYPE, | 535 FUNCTION_TEMPLATE_INFO_TYPE, |
| 535 OBJECT_TEMPLATE_INFO_TYPE, | 536 OBJECT_TEMPLATE_INFO_TYPE, |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 641 } | 642 } |
| 642 inline Object* ToObjectUnchecked() { | 643 inline Object* ToObjectUnchecked() { |
| 643 ASSERT(!IsFailure()); | 644 ASSERT(!IsFailure()); |
| 644 return reinterpret_cast<Object*>(this); | 645 return reinterpret_cast<Object*>(this); |
| 645 } | 646 } |
| 646 inline Object* ToObjectChecked() { | 647 inline Object* ToObjectChecked() { |
| 647 CHECK(!IsFailure()); | 648 CHECK(!IsFailure()); |
| 648 return reinterpret_cast<Object*>(this); | 649 return reinterpret_cast<Object*>(this); |
| 649 } | 650 } |
| 650 | 651 |
| 652 template<typename T> |
| 653 inline bool To(T** obj) { |
| 654 if (IsFailure()) return false; |
| 655 *obj = T::cast(reinterpret_cast<Object*>(this)); |
| 656 return true; |
| 657 } |
| 658 |
| 651 #ifdef OBJECT_PRINT | 659 #ifdef OBJECT_PRINT |
| 652 // Prints this object with details. | 660 // Prints this object with details. |
| 653 inline void Print() { | 661 inline void Print() { |
| 654 Print(stdout); | 662 Print(stdout); |
| 655 }; | 663 }; |
| 656 inline void PrintLn() { | 664 inline void PrintLn() { |
| 657 PrintLn(stdout); | 665 PrintLn(stdout); |
| 658 } | 666 } |
| 659 void Print(FILE* out); | 667 void Print(FILE* out); |
| 660 void PrintLn(FILE* out); | 668 void PrintLn(FILE* out); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 684 V(SeqAsciiString) \ | 692 V(SeqAsciiString) \ |
| 685 \ | 693 \ |
| 686 V(ExternalArray) \ | 694 V(ExternalArray) \ |
| 687 V(ExternalByteArray) \ | 695 V(ExternalByteArray) \ |
| 688 V(ExternalUnsignedByteArray) \ | 696 V(ExternalUnsignedByteArray) \ |
| 689 V(ExternalShortArray) \ | 697 V(ExternalShortArray) \ |
| 690 V(ExternalUnsignedShortArray) \ | 698 V(ExternalUnsignedShortArray) \ |
| 691 V(ExternalIntArray) \ | 699 V(ExternalIntArray) \ |
| 692 V(ExternalUnsignedIntArray) \ | 700 V(ExternalUnsignedIntArray) \ |
| 693 V(ExternalFloatArray) \ | 701 V(ExternalFloatArray) \ |
| 702 V(ExternalDoubleArray) \ |
| 694 V(ExternalPixelArray) \ | 703 V(ExternalPixelArray) \ |
| 695 V(ByteArray) \ | 704 V(ByteArray) \ |
| 696 V(JSObject) \ | 705 V(JSObject) \ |
| 697 V(JSContextExtensionObject) \ | 706 V(JSContextExtensionObject) \ |
| 698 V(Map) \ | 707 V(Map) \ |
| 699 V(DescriptorArray) \ | 708 V(DescriptorArray) \ |
| 700 V(DeoptimizationInputData) \ | 709 V(DeoptimizationInputData) \ |
| 701 V(DeoptimizationOutputData) \ | 710 V(DeoptimizationOutputData) \ |
| 702 V(FixedArray) \ | 711 V(FixedArray) \ |
| 703 V(Context) \ | 712 V(Context) \ |
| (...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1329 FAST_ELEMENTS, | 1338 FAST_ELEMENTS, |
| 1330 // All the kinds below are "slow". | 1339 // All the kinds below are "slow". |
| 1331 DICTIONARY_ELEMENTS, | 1340 DICTIONARY_ELEMENTS, |
| 1332 EXTERNAL_BYTE_ELEMENTS, | 1341 EXTERNAL_BYTE_ELEMENTS, |
| 1333 EXTERNAL_UNSIGNED_BYTE_ELEMENTS, | 1342 EXTERNAL_UNSIGNED_BYTE_ELEMENTS, |
| 1334 EXTERNAL_SHORT_ELEMENTS, | 1343 EXTERNAL_SHORT_ELEMENTS, |
| 1335 EXTERNAL_UNSIGNED_SHORT_ELEMENTS, | 1344 EXTERNAL_UNSIGNED_SHORT_ELEMENTS, |
| 1336 EXTERNAL_INT_ELEMENTS, | 1345 EXTERNAL_INT_ELEMENTS, |
| 1337 EXTERNAL_UNSIGNED_INT_ELEMENTS, | 1346 EXTERNAL_UNSIGNED_INT_ELEMENTS, |
| 1338 EXTERNAL_FLOAT_ELEMENTS, | 1347 EXTERNAL_FLOAT_ELEMENTS, |
| 1348 EXTERNAL_DOUBLE_ELEMENTS, |
| 1339 EXTERNAL_PIXEL_ELEMENTS | 1349 EXTERNAL_PIXEL_ELEMENTS |
| 1340 }; | 1350 }; |
| 1341 | 1351 |
| 1342 // [properties]: Backing storage for properties. | 1352 // [properties]: Backing storage for properties. |
| 1343 // properties is a FixedArray in the fast case and a Dictionary in the | 1353 // properties is a FixedArray in the fast case and a Dictionary in the |
| 1344 // slow case. | 1354 // slow case. |
| 1345 DECL_ACCESSORS(properties, FixedArray) // Get and set fast properties. | 1355 DECL_ACCESSORS(properties, FixedArray) // Get and set fast properties. |
| 1346 inline void initialize_properties(); | 1356 inline void initialize_properties(); |
| 1347 inline bool HasFastProperties(); | 1357 inline bool HasFastProperties(); |
| 1348 inline StringDictionary* property_dictionary(); // Gets slow properties. | 1358 inline StringDictionary* property_dictionary(); // Gets slow properties. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1370 inline bool HasDictionaryElements(); | 1380 inline bool HasDictionaryElements(); |
| 1371 inline bool HasExternalPixelElements(); | 1381 inline bool HasExternalPixelElements(); |
| 1372 inline bool HasExternalArrayElements(); | 1382 inline bool HasExternalArrayElements(); |
| 1373 inline bool HasExternalByteElements(); | 1383 inline bool HasExternalByteElements(); |
| 1374 inline bool HasExternalUnsignedByteElements(); | 1384 inline bool HasExternalUnsignedByteElements(); |
| 1375 inline bool HasExternalShortElements(); | 1385 inline bool HasExternalShortElements(); |
| 1376 inline bool HasExternalUnsignedShortElements(); | 1386 inline bool HasExternalUnsignedShortElements(); |
| 1377 inline bool HasExternalIntElements(); | 1387 inline bool HasExternalIntElements(); |
| 1378 inline bool HasExternalUnsignedIntElements(); | 1388 inline bool HasExternalUnsignedIntElements(); |
| 1379 inline bool HasExternalFloatElements(); | 1389 inline bool HasExternalFloatElements(); |
| 1390 inline bool HasExternalDoubleElements(); |
| 1380 inline bool AllowsSetElementsLength(); | 1391 inline bool AllowsSetElementsLength(); |
| 1381 inline NumberDictionary* element_dictionary(); // Gets slow elements. | 1392 inline NumberDictionary* element_dictionary(); // Gets slow elements. |
| 1382 // Requires: this->HasFastElements(). | 1393 // Requires: this->HasFastElements(). |
| 1383 MUST_USE_RESULT inline MaybeObject* EnsureWritableFastElements(); | 1394 MUST_USE_RESULT inline MaybeObject* EnsureWritableFastElements(); |
| 1384 | 1395 |
| 1385 // Collects elements starting at index 0. | 1396 // Collects elements starting at index 0. |
| 1386 // Undefined values are placed after non-undefined values. | 1397 // Undefined values are placed after non-undefined values. |
| 1387 // Returns the number of non-undefined values. | 1398 // Returns the number of non-undefined values. |
| 1388 MUST_USE_RESULT MaybeObject* PrepareElementsForSort(uint32_t limit); | 1399 MUST_USE_RESULT MaybeObject* PrepareElementsForSort(uint32_t limit); |
| 1389 // As PrepareElementsForSort, but only on objects where elements is | 1400 // As PrepareElementsForSort, but only on objects where elements is |
| (...skipping 1696 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3086 #endif | 3097 #endif |
| 3087 #ifdef DEBUG | 3098 #ifdef DEBUG |
| 3088 void ExternalFloatArrayVerify(); | 3099 void ExternalFloatArrayVerify(); |
| 3089 #endif // DEBUG | 3100 #endif // DEBUG |
| 3090 | 3101 |
| 3091 private: | 3102 private: |
| 3092 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalFloatArray); | 3103 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalFloatArray); |
| 3093 }; | 3104 }; |
| 3094 | 3105 |
| 3095 | 3106 |
| 3107 class ExternalDoubleArray: public ExternalArray { |
| 3108 public: |
| 3109 // Setter and getter. |
| 3110 inline double get(int index); |
| 3111 inline void set(int index, double value); |
| 3112 |
| 3113 // This accessor applies the correct conversion from Smi, HeapNumber |
| 3114 // and undefined. |
| 3115 MaybeObject* SetValue(uint32_t index, Object* value); |
| 3116 |
| 3117 // Casting. |
| 3118 static inline ExternalDoubleArray* cast(Object* obj); |
| 3119 |
| 3120 #ifdef OBJECT_PRINT |
| 3121 inline void ExternalDoubleArrayPrint() { |
| 3122 ExternalDoubleArrayPrint(stdout); |
| 3123 } |
| 3124 void ExternalDoubleArrayPrint(FILE* out); |
| 3125 #endif // OBJECT_PRINT |
| 3126 #ifdef DEBUG |
| 3127 void ExternalDoubleArrayVerify(); |
| 3128 #endif // DEBUG |
| 3129 |
| 3130 private: |
| 3131 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalDoubleArray); |
| 3132 }; |
| 3133 |
| 3134 |
| 3096 // DeoptimizationInputData is a fixed array used to hold the deoptimization | 3135 // DeoptimizationInputData is a fixed array used to hold the deoptimization |
| 3097 // data for code generated by the Hydrogen/Lithium compiler. It also | 3136 // data for code generated by the Hydrogen/Lithium compiler. It also |
| 3098 // contains information about functions that were inlined. If N different | 3137 // contains information about functions that were inlined. If N different |
| 3099 // functions were inlined then first N elements of the literal array will | 3138 // functions were inlined then first N elements of the literal array will |
| 3100 // contain these functions. | 3139 // contain these functions. |
| 3101 // | 3140 // |
| 3102 // It can be empty. | 3141 // It can be empty. |
| 3103 class DeoptimizationInputData: public FixedArray { | 3142 class DeoptimizationInputData: public FixedArray { |
| 3104 public: | 3143 public: |
| 3105 // Layout description. Indices in the array. | 3144 // Layout description. Indices in the array. |
| (...skipping 599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3705 DECL_ACCESSORS(constructor, Object) | 3744 DECL_ACCESSORS(constructor, Object) |
| 3706 | 3745 |
| 3707 inline JSFunction* unchecked_constructor(); | 3746 inline JSFunction* unchecked_constructor(); |
| 3708 | 3747 |
| 3709 // [instance descriptors]: describes the object. | 3748 // [instance descriptors]: describes the object. |
| 3710 DECL_ACCESSORS(instance_descriptors, DescriptorArray) | 3749 DECL_ACCESSORS(instance_descriptors, DescriptorArray) |
| 3711 | 3750 |
| 3712 // [stub cache]: contains stubs compiled for this map. | 3751 // [stub cache]: contains stubs compiled for this map. |
| 3713 DECL_ACCESSORS(code_cache, Object) | 3752 DECL_ACCESSORS(code_cache, Object) |
| 3714 | 3753 |
| 3754 // [prototype transitions]: cache of prototype transitions. |
| 3755 // Prototype transition is a transition that happens |
| 3756 // when we change object's prototype to a new one. |
| 3757 // Cache format: |
| 3758 // 0: finger - index of the first free cell in the cache |
| 3759 // 1 + 2 * i: prototype |
| 3760 // 2 + 2 * i: target map |
| 3761 DECL_ACCESSORS(prototype_transitions, FixedArray) |
| 3762 inline FixedArray* unchecked_prototype_transitions(); |
| 3763 |
| 3715 // Lookup in the map's instance descriptors and fill out the result | 3764 // Lookup in the map's instance descriptors and fill out the result |
| 3716 // with the given holder if the name is found. The holder may be | 3765 // with the given holder if the name is found. The holder may be |
| 3717 // NULL when this function is used from the compiler. | 3766 // NULL when this function is used from the compiler. |
| 3718 void LookupInDescriptors(JSObject* holder, | 3767 void LookupInDescriptors(JSObject* holder, |
| 3719 String* name, | 3768 String* name, |
| 3720 LookupResult* result); | 3769 LookupResult* result); |
| 3721 | 3770 |
| 3722 MUST_USE_RESULT MaybeObject* CopyDropDescriptors(); | 3771 MUST_USE_RESULT MaybeObject* CopyDropDescriptors(); |
| 3723 | 3772 |
| 3724 MUST_USE_RESULT MaybeObject* CopyNormalized(PropertyNormalizationMode mode, | 3773 MUST_USE_RESULT MaybeObject* CopyNormalized(PropertyNormalizationMode mode, |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3804 inline void set_visitor_id(int visitor_id); | 3853 inline void set_visitor_id(int visitor_id); |
| 3805 | 3854 |
| 3806 // Returns the isolate/heap this map belongs to. | 3855 // Returns the isolate/heap this map belongs to. |
| 3807 inline Isolate* isolate(); | 3856 inline Isolate* isolate(); |
| 3808 inline Heap* heap(); | 3857 inline Heap* heap(); |
| 3809 | 3858 |
| 3810 typedef void (*TraverseCallback)(Map* map, void* data); | 3859 typedef void (*TraverseCallback)(Map* map, void* data); |
| 3811 | 3860 |
| 3812 void TraverseTransitionTree(TraverseCallback callback, void* data); | 3861 void TraverseTransitionTree(TraverseCallback callback, void* data); |
| 3813 | 3862 |
| 3863 static const int kMaxCachedPrototypeTransitions = 256; |
| 3864 |
| 3865 Object* GetPrototypeTransition(Object* prototype); |
| 3866 |
| 3867 MaybeObject* PutPrototypeTransition(Object* prototype, Map* map); |
| 3868 |
| 3814 static const int kMaxPreAllocatedPropertyFields = 255; | 3869 static const int kMaxPreAllocatedPropertyFields = 255; |
| 3815 | 3870 |
| 3816 // Layout description. | 3871 // Layout description. |
| 3817 static const int kInstanceSizesOffset = HeapObject::kHeaderSize; | 3872 static const int kInstanceSizesOffset = HeapObject::kHeaderSize; |
| 3818 static const int kInstanceAttributesOffset = kInstanceSizesOffset + kIntSize; | 3873 static const int kInstanceAttributesOffset = kInstanceSizesOffset + kIntSize; |
| 3819 static const int kPrototypeOffset = kInstanceAttributesOffset + kIntSize; | 3874 static const int kPrototypeOffset = kInstanceAttributesOffset + kIntSize; |
| 3820 static const int kConstructorOffset = kPrototypeOffset + kPointerSize; | 3875 static const int kConstructorOffset = kPrototypeOffset + kPointerSize; |
| 3821 static const int kInstanceDescriptorsOffset = | 3876 static const int kInstanceDescriptorsOffset = |
| 3822 kConstructorOffset + kPointerSize; | 3877 kConstructorOffset + kPointerSize; |
| 3823 static const int kCodeCacheOffset = kInstanceDescriptorsOffset + kPointerSize; | 3878 static const int kCodeCacheOffset = kInstanceDescriptorsOffset + kPointerSize; |
| 3824 static const int kPadStart = kCodeCacheOffset + kPointerSize; | 3879 static const int kPrototypeTransitionsOffset = |
| 3880 kCodeCacheOffset + kPointerSize; |
| 3881 static const int kPadStart = kPrototypeTransitionsOffset + kPointerSize; |
| 3825 static const int kSize = MAP_POINTER_ALIGN(kPadStart); | 3882 static const int kSize = MAP_POINTER_ALIGN(kPadStart); |
| 3826 | 3883 |
| 3827 // Layout of pointer fields. Heap iteration code relies on them | 3884 // Layout of pointer fields. Heap iteration code relies on them |
| 3828 // being continiously allocated. | 3885 // being continiously allocated. |
| 3829 static const int kPointerFieldsBeginOffset = Map::kPrototypeOffset; | 3886 static const int kPointerFieldsBeginOffset = Map::kPrototypeOffset; |
| 3830 static const int kPointerFieldsEndOffset = | 3887 static const int kPointerFieldsEndOffset = |
| 3831 Map::kCodeCacheOffset + kPointerSize; | 3888 Map::kPrototypeTransitionsOffset + kPointerSize; |
| 3832 | 3889 |
| 3833 // Byte offsets within kInstanceSizesOffset. | 3890 // Byte offsets within kInstanceSizesOffset. |
| 3834 static const int kInstanceSizeOffset = kInstanceSizesOffset + 0; | 3891 static const int kInstanceSizeOffset = kInstanceSizesOffset + 0; |
| 3835 static const int kInObjectPropertiesByte = 1; | 3892 static const int kInObjectPropertiesByte = 1; |
| 3836 static const int kInObjectPropertiesOffset = | 3893 static const int kInObjectPropertiesOffset = |
| 3837 kInstanceSizesOffset + kInObjectPropertiesByte; | 3894 kInstanceSizesOffset + kInObjectPropertiesByte; |
| 3838 static const int kPreAllocatedPropertyFieldsByte = 2; | 3895 static const int kPreAllocatedPropertyFieldsByte = 2; |
| 3839 static const int kPreAllocatedPropertyFieldsOffset = | 3896 static const int kPreAllocatedPropertyFieldsOffset = |
| 3840 kInstanceSizesOffset + kPreAllocatedPropertyFieldsByte; | 3897 kInstanceSizesOffset + kPreAllocatedPropertyFieldsByte; |
| 3841 static const int kVisitorIdByte = 3; | 3898 static const int kVisitorIdByte = 3; |
| (...skipping 2806 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6648 } else { | 6705 } else { |
| 6649 value &= ~(1 << bit_position); | 6706 value &= ~(1 << bit_position); |
| 6650 } | 6707 } |
| 6651 return value; | 6708 return value; |
| 6652 } | 6709 } |
| 6653 }; | 6710 }; |
| 6654 | 6711 |
| 6655 } } // namespace v8::internal | 6712 } } // namespace v8::internal |
| 6656 | 6713 |
| 6657 #endif // V8_OBJECTS_H_ | 6714 #endif // V8_OBJECTS_H_ |
| OLD | NEW |