| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 2869 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2880 // Shape must be a class with the following interface: | 2880 // Shape must be a class with the following interface: |
| 2881 // class ExampleShape { | 2881 // class ExampleShape { |
| 2882 // public: | 2882 // public: |
| 2883 // // Tells whether key matches other. | 2883 // // Tells whether key matches other. |
| 2884 // static bool IsMatch(Key key, Object* other); | 2884 // static bool IsMatch(Key key, Object* other); |
| 2885 // // Returns the hash value for key. | 2885 // // Returns the hash value for key. |
| 2886 // static uint32_t Hash(Key key); | 2886 // static uint32_t Hash(Key key); |
| 2887 // // Returns the hash value for object. | 2887 // // Returns the hash value for object. |
| 2888 // static uint32_t HashForObject(Key key, Object* object); | 2888 // static uint32_t HashForObject(Key key, Object* object); |
| 2889 // // Convert key to an object. | 2889 // // Convert key to an object. |
| 2890 // static inline Object* AsObject(Key key); | 2890 // static inline Object* AsObject(Isolate* isolate, Key key); |
| 2891 // // The prefix size indicates number of elements in the beginning | 2891 // // The prefix size indicates number of elements in the beginning |
| 2892 // // of the backing storage. | 2892 // // of the backing storage. |
| 2893 // static const int kPrefixSize = ..; | 2893 // static const int kPrefixSize = ..; |
| 2894 // // The Element size indicates number of elements per entry. | 2894 // // The Element size indicates number of elements per entry. |
| 2895 // static const int kEntrySize = ..; | 2895 // static const int kEntrySize = ..; |
| 2896 // }; | 2896 // }; |
| 2897 // The prefix size indicates an amount of memory in the | 2897 // The prefix size indicates an amount of memory in the |
| 2898 // beginning of the backing storage that can be used for non-element | 2898 // beginning of the backing storage that can be used for non-element |
| 2899 // information by subclasses. | 2899 // information by subclasses. |
| 2900 | 2900 |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2966 SetNumberOfElements(NumberOfElements() - 1); | 2966 SetNumberOfElements(NumberOfElements() - 1); |
| 2967 SetNumberOfDeletedElements(NumberOfDeletedElements() + 1); | 2967 SetNumberOfDeletedElements(NumberOfDeletedElements() + 1); |
| 2968 } | 2968 } |
| 2969 void ElementsRemoved(int n) { | 2969 void ElementsRemoved(int n) { |
| 2970 SetNumberOfElements(NumberOfElements() - n); | 2970 SetNumberOfElements(NumberOfElements() - n); |
| 2971 SetNumberOfDeletedElements(NumberOfDeletedElements() + n); | 2971 SetNumberOfDeletedElements(NumberOfDeletedElements() + n); |
| 2972 } | 2972 } |
| 2973 | 2973 |
| 2974 // Returns a new HashTable object. Might return Failure. | 2974 // Returns a new HashTable object. Might return Failure. |
| 2975 MUST_USE_RESULT static MaybeObject* Allocate( | 2975 MUST_USE_RESULT static MaybeObject* Allocate( |
| 2976 Heap* heap, |
| 2976 int at_least_space_for, | 2977 int at_least_space_for, |
| 2977 MinimumCapacity capacity_option = USE_DEFAULT_MINIMUM_CAPACITY, | 2978 MinimumCapacity capacity_option = USE_DEFAULT_MINIMUM_CAPACITY, |
| 2978 PretenureFlag pretenure = NOT_TENURED); | 2979 PretenureFlag pretenure = NOT_TENURED); |
| 2979 | 2980 |
| 2980 // Computes the required capacity for a table holding the given | 2981 // Computes the required capacity for a table holding the given |
| 2981 // number of elements. May be more than HashTable::kMaxCapacity. | 2982 // number of elements. May be more than HashTable::kMaxCapacity. |
| 2982 static int ComputeCapacity(int at_least_space_for); | 2983 static int ComputeCapacity(int at_least_space_for); |
| 2983 | 2984 |
| 2984 // Returns the key at entry. | 2985 // Returns the key at entry. |
| 2985 Object* KeyAt(int entry) { return get(EntryToIndex(entry)); } | 2986 Object* KeyAt(int entry) { return get(EntryToIndex(entry)); } |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3105 public: | 3106 public: |
| 3106 static inline bool IsMatch(HashTableKey* key, Object* value) { | 3107 static inline bool IsMatch(HashTableKey* key, Object* value) { |
| 3107 return key->IsMatch(value); | 3108 return key->IsMatch(value); |
| 3108 } | 3109 } |
| 3109 static inline uint32_t Hash(HashTableKey* key) { | 3110 static inline uint32_t Hash(HashTableKey* key) { |
| 3110 return key->Hash(); | 3111 return key->Hash(); |
| 3111 } | 3112 } |
| 3112 static inline uint32_t HashForObject(HashTableKey* key, Object* object) { | 3113 static inline uint32_t HashForObject(HashTableKey* key, Object* object) { |
| 3113 return key->HashForObject(object); | 3114 return key->HashForObject(object); |
| 3114 } | 3115 } |
| 3115 MUST_USE_RESULT static inline MaybeObject* AsObject(HashTableKey* key) { | 3116 MUST_USE_RESULT static inline MaybeObject* AsObject(Isolate* isolate, |
| 3117 HashTableKey* key) { |
| 3116 return key->AsObject(); | 3118 return key->AsObject(); |
| 3117 } | 3119 } |
| 3118 | 3120 |
| 3119 static const int kPrefixSize = 0; | 3121 static const int kPrefixSize = 0; |
| 3120 static const int kEntrySize = 1; | 3122 static const int kEntrySize = 1; |
| 3121 }; | 3123 }; |
| 3122 | 3124 |
| 3123 class SeqOneByteString; | 3125 class SeqOneByteString; |
| 3124 | 3126 |
| 3125 // StringTable. | 3127 // StringTable. |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3172 return key->IsMatch(value); | 3174 return key->IsMatch(value); |
| 3173 } | 3175 } |
| 3174 static inline uint32_t Hash(HashTableKey* key) { | 3176 static inline uint32_t Hash(HashTableKey* key) { |
| 3175 return key->Hash(); | 3177 return key->Hash(); |
| 3176 } | 3178 } |
| 3177 | 3179 |
| 3178 static inline uint32_t HashForObject(HashTableKey* key, Object* object) { | 3180 static inline uint32_t HashForObject(HashTableKey* key, Object* object) { |
| 3179 return key->HashForObject(object); | 3181 return key->HashForObject(object); |
| 3180 } | 3182 } |
| 3181 | 3183 |
| 3182 MUST_USE_RESULT static inline MaybeObject* AsObject(HashTableKey* key) { | 3184 MUST_USE_RESULT static inline MaybeObject* AsObject(Isolate* isolate, |
| 3185 HashTableKey* key) { |
| 3183 return key->AsObject(); | 3186 return key->AsObject(); |
| 3184 } | 3187 } |
| 3185 | 3188 |
| 3186 static const int kPrefixSize = 0; | 3189 static const int kPrefixSize = 0; |
| 3187 static const int kEntrySize = 2; | 3190 static const int kEntrySize = 2; |
| 3188 }; | 3191 }; |
| 3189 | 3192 |
| 3190 | 3193 |
| 3191 // MapCache. | 3194 // MapCache. |
| 3192 // | 3195 // |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3261 void SetNextEnumerationIndex(int index) { | 3264 void SetNextEnumerationIndex(int index) { |
| 3262 ASSERT(index != 0); | 3265 ASSERT(index != 0); |
| 3263 this->set(kNextEnumerationIndexIndex, Smi::FromInt(index)); | 3266 this->set(kNextEnumerationIndexIndex, Smi::FromInt(index)); |
| 3264 } | 3267 } |
| 3265 | 3268 |
| 3266 int NextEnumerationIndex() { | 3269 int NextEnumerationIndex() { |
| 3267 return Smi::cast(FixedArray::get(kNextEnumerationIndexIndex))->value(); | 3270 return Smi::cast(FixedArray::get(kNextEnumerationIndexIndex))->value(); |
| 3268 } | 3271 } |
| 3269 | 3272 |
| 3270 // Returns a new array for dictionary usage. Might return Failure. | 3273 // Returns a new array for dictionary usage. Might return Failure. |
| 3271 MUST_USE_RESULT static MaybeObject* Allocate(int at_least_space_for); | 3274 MUST_USE_RESULT static MaybeObject* Allocate(Heap* heap, |
| 3275 int at_least_space_for); |
| 3272 | 3276 |
| 3273 // Ensure enough space for n additional elements. | 3277 // Ensure enough space for n additional elements. |
| 3274 MUST_USE_RESULT MaybeObject* EnsureCapacity(int n, Key key); | 3278 MUST_USE_RESULT MaybeObject* EnsureCapacity(int n, Key key); |
| 3275 | 3279 |
| 3276 #ifdef OBJECT_PRINT | 3280 #ifdef OBJECT_PRINT |
| 3277 inline void Print() { | 3281 inline void Print() { |
| 3278 Print(stdout); | 3282 Print(stdout); |
| 3279 } | 3283 } |
| 3280 void Print(FILE* out); | 3284 void Print(FILE* out); |
| 3281 #endif | 3285 #endif |
| (...skipping 29 matching lines...) Expand all Loading... |
| 3311 HashTable<Shape, Key>::kPrefixStartIndex; | 3315 HashTable<Shape, Key>::kPrefixStartIndex; |
| 3312 static const int kNextEnumerationIndexIndex = kMaxNumberKeyIndex + 1; | 3316 static const int kNextEnumerationIndexIndex = kMaxNumberKeyIndex + 1; |
| 3313 }; | 3317 }; |
| 3314 | 3318 |
| 3315 | 3319 |
| 3316 class NameDictionaryShape : public BaseShape<Name*> { | 3320 class NameDictionaryShape : public BaseShape<Name*> { |
| 3317 public: | 3321 public: |
| 3318 static inline bool IsMatch(Name* key, Object* other); | 3322 static inline bool IsMatch(Name* key, Object* other); |
| 3319 static inline uint32_t Hash(Name* key); | 3323 static inline uint32_t Hash(Name* key); |
| 3320 static inline uint32_t HashForObject(Name* key, Object* object); | 3324 static inline uint32_t HashForObject(Name* key, Object* object); |
| 3321 MUST_USE_RESULT static inline MaybeObject* AsObject(Name* key); | 3325 MUST_USE_RESULT static inline MaybeObject* AsObject(Isolate* isolate, |
| 3326 Name* key); |
| 3322 static const int kPrefixSize = 2; | 3327 static const int kPrefixSize = 2; |
| 3323 static const int kEntrySize = 3; | 3328 static const int kEntrySize = 3; |
| 3324 static const bool kIsEnumerable = true; | 3329 static const bool kIsEnumerable = true; |
| 3325 }; | 3330 }; |
| 3326 | 3331 |
| 3327 | 3332 |
| 3328 class NameDictionary: public Dictionary<NameDictionaryShape, Name*> { | 3333 class NameDictionary: public Dictionary<NameDictionaryShape, Name*> { |
| 3329 public: | 3334 public: |
| 3330 static inline NameDictionary* cast(Object* obj) { | 3335 static inline NameDictionary* cast(Object* obj) { |
| 3331 ASSERT(obj->IsDictionary()); | 3336 ASSERT(obj->IsDictionary()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 3344 | 3349 |
| 3345 // Find entry for key, otherwise return kNotFound. Optimized version of | 3350 // Find entry for key, otherwise return kNotFound. Optimized version of |
| 3346 // HashTable::FindEntry. | 3351 // HashTable::FindEntry. |
| 3347 int FindEntry(Name* key); | 3352 int FindEntry(Name* key); |
| 3348 }; | 3353 }; |
| 3349 | 3354 |
| 3350 | 3355 |
| 3351 class NumberDictionaryShape : public BaseShape<uint32_t> { | 3356 class NumberDictionaryShape : public BaseShape<uint32_t> { |
| 3352 public: | 3357 public: |
| 3353 static inline bool IsMatch(uint32_t key, Object* other); | 3358 static inline bool IsMatch(uint32_t key, Object* other); |
| 3354 MUST_USE_RESULT static inline MaybeObject* AsObject(uint32_t key); | 3359 MUST_USE_RESULT static inline MaybeObject* AsObject(Isolate* isolate, |
| 3360 uint32_t key); |
| 3355 static const int kEntrySize = 3; | 3361 static const int kEntrySize = 3; |
| 3356 static const bool kIsEnumerable = false; | 3362 static const bool kIsEnumerable = false; |
| 3357 }; | 3363 }; |
| 3358 | 3364 |
| 3359 | 3365 |
| 3360 class SeededNumberDictionaryShape : public NumberDictionaryShape { | 3366 class SeededNumberDictionaryShape : public NumberDictionaryShape { |
| 3361 public: | 3367 public: |
| 3362 static const bool UsesSeed = true; | 3368 static const bool UsesSeed = true; |
| 3363 static const int kPrefixSize = 2; | 3369 static const int kPrefixSize = 2; |
| 3364 | 3370 |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3448 MUST_USE_RESULT MaybeObject* Set(uint32_t key, Object* value); | 3454 MUST_USE_RESULT MaybeObject* Set(uint32_t key, Object* value); |
| 3449 }; | 3455 }; |
| 3450 | 3456 |
| 3451 | 3457 |
| 3452 template <int entrysize> | 3458 template <int entrysize> |
| 3453 class ObjectHashTableShape : public BaseShape<Object*> { | 3459 class ObjectHashTableShape : public BaseShape<Object*> { |
| 3454 public: | 3460 public: |
| 3455 static inline bool IsMatch(Object* key, Object* other); | 3461 static inline bool IsMatch(Object* key, Object* other); |
| 3456 static inline uint32_t Hash(Object* key); | 3462 static inline uint32_t Hash(Object* key); |
| 3457 static inline uint32_t HashForObject(Object* key, Object* object); | 3463 static inline uint32_t HashForObject(Object* key, Object* object); |
| 3458 MUST_USE_RESULT static inline MaybeObject* AsObject(Object* key); | 3464 MUST_USE_RESULT static inline MaybeObject* AsObject(Isolate* isolate, |
| 3465 Object* key); |
| 3459 static const int kPrefixSize = 0; | 3466 static const int kPrefixSize = 0; |
| 3460 static const int kEntrySize = entrysize; | 3467 static const int kEntrySize = entrysize; |
| 3461 }; | 3468 }; |
| 3462 | 3469 |
| 3463 | 3470 |
| 3464 // ObjectHashSet holds keys that are arbitrary objects by using the identity | 3471 // ObjectHashSet holds keys that are arbitrary objects by using the identity |
| 3465 // hash of the key for hashing purposes. | 3472 // hash of the key for hashing purposes. |
| 3466 class ObjectHashSet: public HashTable<ObjectHashTableShape<1>, Object*> { | 3473 class ObjectHashSet: public HashTable<ObjectHashTableShape<1>, Object*> { |
| 3467 public: | 3474 public: |
| 3468 static inline ObjectHashSet* cast(Object* obj) { | 3475 static inline ObjectHashSet* cast(Object* obj) { |
| (...skipping 3430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6899 } | 6906 } |
| 6900 | 6907 |
| 6901 static inline uint32_t Hash(HashTableKey* key) { | 6908 static inline uint32_t Hash(HashTableKey* key) { |
| 6902 return key->Hash(); | 6909 return key->Hash(); |
| 6903 } | 6910 } |
| 6904 | 6911 |
| 6905 static inline uint32_t HashForObject(HashTableKey* key, Object* object) { | 6912 static inline uint32_t HashForObject(HashTableKey* key, Object* object) { |
| 6906 return key->HashForObject(object); | 6913 return key->HashForObject(object); |
| 6907 } | 6914 } |
| 6908 | 6915 |
| 6909 MUST_USE_RESULT static MaybeObject* AsObject(HashTableKey* key) { | 6916 MUST_USE_RESULT static MaybeObject* AsObject(Isolate* isolate, |
| 6917 HashTableKey* key) { |
| 6910 return key->AsObject(); | 6918 return key->AsObject(); |
| 6911 } | 6919 } |
| 6912 | 6920 |
| 6913 static const int kPrefixSize = 0; | 6921 static const int kPrefixSize = 0; |
| 6914 static const int kEntrySize = 2; | 6922 static const int kEntrySize = 2; |
| 6915 }; | 6923 }; |
| 6916 | 6924 |
| 6917 | 6925 |
| 6918 class CompilationCacheTable: public HashTable<CompilationCacheShape, | 6926 class CompilationCacheTable: public HashTable<CompilationCacheShape, |
| 6919 HashTableKey*> { | 6927 HashTableKey*> { |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7001 } | 7009 } |
| 7002 | 7010 |
| 7003 static inline uint32_t Hash(HashTableKey* key) { | 7011 static inline uint32_t Hash(HashTableKey* key) { |
| 7004 return key->Hash(); | 7012 return key->Hash(); |
| 7005 } | 7013 } |
| 7006 | 7014 |
| 7007 static inline uint32_t HashForObject(HashTableKey* key, Object* object) { | 7015 static inline uint32_t HashForObject(HashTableKey* key, Object* object) { |
| 7008 return key->HashForObject(object); | 7016 return key->HashForObject(object); |
| 7009 } | 7017 } |
| 7010 | 7018 |
| 7011 MUST_USE_RESULT static MaybeObject* AsObject(HashTableKey* key) { | 7019 MUST_USE_RESULT static MaybeObject* AsObject(Isolate* isolate, |
| 7020 HashTableKey* key) { |
| 7012 return key->AsObject(); | 7021 return key->AsObject(); |
| 7013 } | 7022 } |
| 7014 | 7023 |
| 7015 static const int kPrefixSize = 0; | 7024 static const int kPrefixSize = 0; |
| 7016 static const int kEntrySize = 2; | 7025 static const int kEntrySize = 2; |
| 7017 }; | 7026 }; |
| 7018 | 7027 |
| 7019 | 7028 |
| 7020 class CodeCacheHashTable: public HashTable<CodeCacheHashTableShape, | 7029 class CodeCacheHashTable: public HashTable<CodeCacheHashTableShape, |
| 7021 HashTableKey*> { | 7030 HashTableKey*> { |
| (...skipping 2225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9247 } else { | 9256 } else { |
| 9248 value &= ~(1 << bit_position); | 9257 value &= ~(1 << bit_position); |
| 9249 } | 9258 } |
| 9250 return value; | 9259 return value; |
| 9251 } | 9260 } |
| 9252 }; | 9261 }; |
| 9253 | 9262 |
| 9254 } } // namespace v8::internal | 9263 } } // namespace v8::internal |
| 9255 | 9264 |
| 9256 #endif // V8_OBJECTS_H_ | 9265 #endif // V8_OBJECTS_H_ |
| OLD | NEW |