OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_OBJECTS_H_ | 5 #ifndef V8_OBJECTS_H_ |
6 #define V8_OBJECTS_H_ | 6 #define V8_OBJECTS_H_ |
7 | 7 |
8 #include <iosfwd> | 8 #include <iosfwd> |
9 | 9 |
10 #include "src/assert-scope.h" | 10 #include "src/assert-scope.h" |
(...skipping 870 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
881 #define DECLARE_PRINTER(Name) | 881 #define DECLARE_PRINTER(Name) |
882 #endif | 882 #endif |
883 | 883 |
884 #define OBJECT_TYPE_LIST(V) \ | 884 #define OBJECT_TYPE_LIST(V) \ |
885 V(Smi) \ | 885 V(Smi) \ |
886 V(LayoutDescriptor) \ | 886 V(LayoutDescriptor) \ |
887 V(HeapObject) \ | 887 V(HeapObject) \ |
888 V(Primitive) \ | 888 V(Primitive) \ |
889 V(Number) | 889 V(Number) |
890 | 890 |
891 #define HEAP_OBJECT_TYPE_LIST(V) \ | 891 #define HEAP_OBJECT_TYPE_LIST(V) \ |
892 V(HeapNumber) \ | 892 V(HeapNumber) \ |
893 V(MutableHeapNumber) \ | 893 V(MutableHeapNumber) \ |
894 V(Simd128Value) \ | 894 V(Simd128Value) \ |
895 V(Float32x4) \ | 895 V(Float32x4) \ |
896 V(Int32x4) \ | 896 V(Int32x4) \ |
897 V(Uint32x4) \ | 897 V(Uint32x4) \ |
898 V(Bool32x4) \ | 898 V(Bool32x4) \ |
899 V(Int16x8) \ | 899 V(Int16x8) \ |
900 V(Uint16x8) \ | 900 V(Uint16x8) \ |
901 V(Bool16x8) \ | 901 V(Bool16x8) \ |
902 V(Int8x16) \ | 902 V(Int8x16) \ |
903 V(Uint8x16) \ | 903 V(Uint8x16) \ |
904 V(Bool8x16) \ | 904 V(Bool8x16) \ |
905 V(Name) \ | 905 V(Name) \ |
906 V(UniqueName) \ | 906 V(UniqueName) \ |
907 V(String) \ | 907 V(String) \ |
908 V(SeqString) \ | 908 V(SeqString) \ |
909 V(ExternalString) \ | 909 V(ExternalString) \ |
910 V(ConsString) \ | 910 V(ConsString) \ |
911 V(SlicedString) \ | 911 V(SlicedString) \ |
912 V(ExternalTwoByteString) \ | 912 V(ExternalTwoByteString) \ |
913 V(ExternalOneByteString) \ | 913 V(ExternalOneByteString) \ |
914 V(SeqTwoByteString) \ | 914 V(SeqTwoByteString) \ |
915 V(SeqOneByteString) \ | 915 V(SeqOneByteString) \ |
916 V(InternalizedString) \ | 916 V(InternalizedString) \ |
917 V(Symbol) \ | 917 V(Symbol) \ |
918 \ | 918 \ |
919 V(FixedTypedArrayBase) \ | 919 V(FixedTypedArrayBase) \ |
920 V(FixedUint8Array) \ | 920 V(FixedUint8Array) \ |
921 V(FixedInt8Array) \ | 921 V(FixedInt8Array) \ |
922 V(FixedUint16Array) \ | 922 V(FixedUint16Array) \ |
923 V(FixedInt16Array) \ | 923 V(FixedInt16Array) \ |
924 V(FixedUint32Array) \ | 924 V(FixedUint32Array) \ |
925 V(FixedInt32Array) \ | 925 V(FixedInt32Array) \ |
926 V(FixedFloat32Array) \ | 926 V(FixedFloat32Array) \ |
927 V(FixedFloat64Array) \ | 927 V(FixedFloat64Array) \ |
928 V(FixedUint8ClampedArray) \ | 928 V(FixedUint8ClampedArray) \ |
929 V(ByteArray) \ | 929 V(ByteArray) \ |
930 V(BytecodeArray) \ | 930 V(BytecodeArray) \ |
931 V(FreeSpace) \ | 931 V(FreeSpace) \ |
932 V(JSReceiver) \ | 932 V(JSReceiver) \ |
933 V(JSObject) \ | 933 V(JSObject) \ |
934 V(JSContextExtensionObject) \ | 934 V(JSContextExtensionObject) \ |
935 V(JSGeneratorObject) \ | 935 V(JSGeneratorObject) \ |
936 V(JSModule) \ | 936 V(JSModule) \ |
937 V(Map) \ | 937 V(Map) \ |
938 V(DescriptorArray) \ | 938 V(DescriptorArray) \ |
939 V(TransitionArray) \ | 939 V(TransitionArray) \ |
940 V(LiteralsArray) \ | 940 V(LiteralsArray) \ |
941 V(TypeFeedbackMetadata) \ | 941 V(TypeFeedbackMetadata) \ |
942 V(TypeFeedbackVector) \ | 942 V(TypeFeedbackVector) \ |
943 V(DeoptimizationInputData) \ | 943 V(DeoptimizationInputData) \ |
944 V(DeoptimizationOutputData) \ | 944 V(DeoptimizationOutputData) \ |
945 V(DependentCode) \ | 945 V(DependentCode) \ |
946 V(HandlerTable) \ | 946 V(HandlerTable) \ |
947 V(FixedArray) \ | 947 V(FixedArray) \ |
948 V(FixedDoubleArray) \ | 948 V(FixedDoubleArray) \ |
949 V(WeakFixedArray) \ | 949 V(WeakFixedArray) \ |
950 V(ArrayList) \ | 950 V(ArrayList) \ |
951 V(Context) \ | 951 V(Context) \ |
952 V(ScriptContextTable) \ | 952 V(ScriptContextTable) \ |
953 V(NativeContext) \ | 953 V(NativeContext) \ |
954 V(ScopeInfo) \ | 954 V(ScopeInfo) \ |
955 V(JSBoundFunction) \ | 955 V(JSBoundFunction) \ |
956 V(JSFunction) \ | 956 V(JSFunction) \ |
957 V(Code) \ | 957 V(Code) \ |
958 V(AbstractCode) \ | 958 V(AbstractCode) \ |
959 V(Oddball) \ | 959 V(Oddball) \ |
960 V(SharedFunctionInfo) \ | 960 V(SharedFunctionInfo) \ |
961 V(JSValue) \ | 961 V(JSValue) \ |
962 V(JSDate) \ | 962 V(JSDate) \ |
963 V(JSMessageObject) \ | 963 V(JSMessageObject) \ |
964 V(StringWrapper) \ | 964 V(StringWrapper) \ |
965 V(Foreign) \ | 965 V(Foreign) \ |
966 V(Boolean) \ | 966 V(Boolean) \ |
967 V(JSArray) \ | 967 V(JSArray) \ |
968 V(JSArrayBuffer) \ | 968 V(JSArrayBuffer) \ |
969 V(JSArrayBufferView) \ | 969 V(JSArrayBufferView) \ |
970 V(JSTypedArray) \ | 970 V(JSTypedArray) \ |
971 V(JSDataView) \ | 971 V(JSDataView) \ |
972 V(JSProxy) \ | 972 V(JSProxy) \ |
973 V(JSSet) \ | 973 V(JSSet) \ |
974 V(JSMap) \ | 974 V(JSMap) \ |
975 V(JSSetIterator) \ | 975 V(JSSetIterator) \ |
976 V(JSMapIterator) \ | 976 V(JSMapIterator) \ |
977 V(JSWeakCollection) \ | 977 V(JSWeakCollection) \ |
978 V(JSWeakMap) \ | 978 V(JSWeakMap) \ |
979 V(JSWeakSet) \ | 979 V(JSWeakSet) \ |
980 V(JSRegExp) \ | 980 V(JSRegExp) \ |
981 V(HashTable) \ | 981 V(HashTable) \ |
982 V(Dictionary) \ | 982 V(Dictionary) \ |
983 V(StringTable) \ | 983 V(StringTable) \ |
984 V(StringSet) \ | 984 V(StringSet) \ |
985 V(NormalizedMapCache) \ | 985 V(NormalizedMapCache) \ |
986 V(CompilationCacheTable) \ | 986 V(CompilationCacheTable) \ |
987 V(CodeCacheHashTable) \ | 987 V(CodeCacheHashTable) \ |
988 V(MapCache) \ | 988 V(MapCache) \ |
989 V(JSGlobalObject) \ | 989 V(JSGlobalObject) \ |
990 V(JSGlobalProxy) \ | 990 V(JSGlobalProxy) \ |
991 V(Undetectable) \ | 991 V(Undetectable) \ |
992 V(AccessCheckNeeded) \ | 992 V(AccessCheckNeeded) \ |
993 V(Callable) \ | 993 V(Callable) \ |
994 V(Function) \ | 994 V(Function) \ |
995 V(Constructor) \ | 995 V(Constructor) \ |
996 V(TemplateInfo) \ | 996 V(TemplateInfo) \ |
997 V(Filler) \ | 997 V(Filler) \ |
998 V(FixedArrayBase) \ | 998 V(FixedArrayBase) \ |
999 V(External) \ | 999 V(External) \ |
1000 V(Struct) \ | 1000 V(Struct) \ |
1001 V(Cell) \ | 1001 V(Cell) \ |
1002 V(PropertyCell) \ | 1002 V(PropertyCell) \ |
1003 V(WeakCell) \ | 1003 V(WeakCell) \ |
1004 V(ObjectHashTable) \ | 1004 V(ObjectHashTable) \ |
1005 V(WeakHashTable) \ | 1005 V(ObjectHashSet) \ |
| 1006 V(WeakHashTable) \ |
1006 V(OrderedHashTable) | 1007 V(OrderedHashTable) |
1007 | 1008 |
1008 #define ODDBALL_LIST(V) \ | 1009 #define ODDBALL_LIST(V) \ |
1009 V(Undefined, undefined_value) \ | 1010 V(Undefined, undefined_value) \ |
1010 V(Null, null_value) \ | 1011 V(Null, null_value) \ |
1011 V(TheHole, the_hole_value) \ | 1012 V(TheHole, the_hole_value) \ |
1012 V(Exception, exception) \ | 1013 V(Exception, exception) \ |
1013 V(Uninitialized, uninitialized_value) \ | 1014 V(Uninitialized, uninitialized_value) \ |
1014 V(True, true_value) \ | 1015 V(True, true_value) \ |
1015 V(False, false_value) \ | 1016 V(False, false_value) \ |
(...skipping 2210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3226 DECLARE_CAST(HashTable) | 3227 DECLARE_CAST(HashTable) |
3227 | 3228 |
3228 // Garbage collection support. | 3229 // Garbage collection support. |
3229 void IteratePrefix(ObjectVisitor* visitor); | 3230 void IteratePrefix(ObjectVisitor* visitor); |
3230 void IterateElements(ObjectVisitor* visitor); | 3231 void IterateElements(ObjectVisitor* visitor); |
3231 | 3232 |
3232 // Find entry for key otherwise return kNotFound. | 3233 // Find entry for key otherwise return kNotFound. |
3233 inline int FindEntry(Key key); | 3234 inline int FindEntry(Key key); |
3234 inline int FindEntry(Isolate* isolate, Key key, int32_t hash); | 3235 inline int FindEntry(Isolate* isolate, Key key, int32_t hash); |
3235 int FindEntry(Isolate* isolate, Key key); | 3236 int FindEntry(Isolate* isolate, Key key); |
| 3237 inline bool Has(Isolate* isolate, Key key); |
| 3238 inline bool Has(Key key); |
3236 | 3239 |
3237 // Rehashes the table in-place. | 3240 // Rehashes the table in-place. |
3238 void Rehash(Key key); | 3241 void Rehash(Key key); |
3239 | 3242 |
3240 // Returns the key at entry. | 3243 // Returns the key at entry. |
3241 Object* KeyAt(int entry) { return get(EntryToIndex(entry)); } | 3244 Object* KeyAt(int entry) { return get(EntryToIndex(entry)); } |
3242 | 3245 |
3243 static const int kElementsStartIndex = kPrefixStartIndex + Shape::kPrefixSize; | 3246 static const int kElementsStartIndex = kPrefixStartIndex + Shape::kPrefixSize; |
3244 static const int kEntrySize = Shape::kEntrySize; | 3247 static const int kEntrySize = Shape::kEntrySize; |
3245 static const int kElementsStartOffset = | 3248 static const int kElementsStartOffset = |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3450 | 3453 |
3451 // Returns the number of enumerable elements in the dictionary. | 3454 // Returns the number of enumerable elements in the dictionary. |
3452 int NumberOfEnumElements() { | 3455 int NumberOfEnumElements() { |
3453 return NumberOfElementsFilterAttributes(ENUMERABLE_STRINGS); | 3456 return NumberOfElementsFilterAttributes(ENUMERABLE_STRINGS); |
3454 } | 3457 } |
3455 | 3458 |
3456 enum SortMode { UNSORTED, SORTED }; | 3459 enum SortMode { UNSORTED, SORTED }; |
3457 | 3460 |
3458 // Collect the keys into the given KeyAccumulator, in ascending chronological | 3461 // Collect the keys into the given KeyAccumulator, in ascending chronological |
3459 // order of property creation. | 3462 // order of property creation. |
3460 static void CollectKeysTo(Handle<Dictionary<Derived, Shape, Key> > dictionary, | 3463 static void CollectKeysTo(Handle<Dictionary<Derived, Shape, Key>> dictionary, |
3461 KeyAccumulator* keys, PropertyFilter filter); | 3464 KeyAccumulator* keys); |
3462 | 3465 |
3463 // Copies enumerable keys to preallocated fixed array. | 3466 // Copies enumerable keys to preallocated fixed array. |
3464 void CopyEnumKeysTo(FixedArray* storage); | 3467 static void CopyEnumKeysTo(Handle<Dictionary<Derived, Shape, Key>> dictionary, |
| 3468 Handle<FixedArray> storage, KeyCollectionMode mode, |
| 3469 KeyAccumulator* accumulator); |
3465 | 3470 |
3466 // Accessors for next enumeration index. | 3471 // Accessors for next enumeration index. |
3467 void SetNextEnumerationIndex(int index) { | 3472 void SetNextEnumerationIndex(int index) { |
3468 DCHECK(index != 0); | 3473 DCHECK(index != 0); |
3469 this->set(kNextEnumerationIndexIndex, Smi::FromInt(index)); | 3474 this->set(kNextEnumerationIndexIndex, Smi::FromInt(index)); |
3470 } | 3475 } |
3471 | 3476 |
3472 int NextEnumerationIndex() { | 3477 int NextEnumerationIndex() { |
3473 return Smi::cast(this->get(kNextEnumerationIndexIndex))->value(); | 3478 return Smi::cast(this->get(kNextEnumerationIndexIndex))->value(); |
3474 } | 3479 } |
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3786 | 3791 |
3787 void AddEntry(int entry, Object* key, Object* value); | 3792 void AddEntry(int entry, Object* key, Object* value); |
3788 void RemoveEntry(int entry); | 3793 void RemoveEntry(int entry); |
3789 | 3794 |
3790 // Returns the index to the value of an entry. | 3795 // Returns the index to the value of an entry. |
3791 static inline int EntryToValueIndex(int entry) { | 3796 static inline int EntryToValueIndex(int entry) { |
3792 return EntryToIndex(entry) + 1; | 3797 return EntryToIndex(entry) + 1; |
3793 } | 3798 } |
3794 }; | 3799 }; |
3795 | 3800 |
| 3801 class ObjectHashSetShape : public ObjectHashTableShape { |
| 3802 public: |
| 3803 static const int kPrefixSize = 0; |
| 3804 static const int kEntrySize = 1; |
| 3805 }; |
| 3806 |
| 3807 class ObjectHashSet |
| 3808 : public HashTable<ObjectHashSet, ObjectHashSetShape, Handle<Object>> { |
| 3809 public: |
| 3810 static Handle<ObjectHashSet> Add(Handle<ObjectHashSet> set, |
| 3811 Handle<Object> key); |
| 3812 |
| 3813 inline bool Has(Isolate* isolate, Handle<Object> key, int32_t hash); |
| 3814 inline bool Has(Isolate* isolate, Handle<Object> key); |
| 3815 |
| 3816 DECLARE_CAST(ObjectHashSet) |
| 3817 }; |
3796 | 3818 |
3797 // OrderedHashTable is a HashTable with Object keys that preserves | 3819 // OrderedHashTable is a HashTable with Object keys that preserves |
3798 // insertion order. There are Map and Set interfaces (OrderedHashMap | 3820 // insertion order. There are Map and Set interfaces (OrderedHashMap |
3799 // and OrderedHashTable, below). It is meant to be used by JSMap/JSSet. | 3821 // and OrderedHashTable, below). It is meant to be used by JSMap/JSSet. |
3800 // | 3822 // |
3801 // Only Object* keys are supported, with Object::SameValueZero() used as the | 3823 // Only Object* keys are supported, with Object::SameValueZero() used as the |
3802 // equality operator and Object::GetHash() for the hash function. | 3824 // equality operator and Object::GetHash() for the hash function. |
3803 // | 3825 // |
3804 // Based on the "Deterministic Hash Table" as described by Jason Orendorff at | 3826 // Based on the "Deterministic Hash Table" as described by Jason Orendorff at |
3805 // https://wiki.mozilla.org/User:Jorend/Deterministic_hash_tables | 3827 // https://wiki.mozilla.org/User:Jorend/Deterministic_hash_tables |
(...skipping 7023 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10829 } | 10851 } |
10830 return value; | 10852 return value; |
10831 } | 10853 } |
10832 }; | 10854 }; |
10833 | 10855 |
10834 | 10856 |
10835 } // NOLINT, false-positive due to second-order macros. | 10857 } // NOLINT, false-positive due to second-order macros. |
10836 } // NOLINT, false-positive due to second-order macros. | 10858 } // NOLINT, false-positive due to second-order macros. |
10837 | 10859 |
10838 #endif // V8_OBJECTS_H_ | 10860 #endif // V8_OBJECTS_H_ |
OLD | NEW |