Chromium Code Reviews| Index: src/objects.h |
| diff --git a/src/objects.h b/src/objects.h |
| index 7a4e2dc4c980efc7f738fd18e4f31e0c6266908a..a5865181eadb6b39154bff5f3a2dfb736cd0744a 100644 |
| --- a/src/objects.h |
| +++ b/src/objects.h |
| @@ -3646,7 +3646,7 @@ class BaseShape { |
| } |
| }; |
| -template<typename Shape, typename Key> |
| +template<typename Derived, typename Shape, typename Key> |
| class HashTable: public FixedArray { |
| public: |
| // Wrapper methods |
| @@ -3699,12 +3699,20 @@ class HashTable: public FixedArray { |
| } |
| // Returns a new HashTable object. Might return Failure. |
| + // TODO(ishell): this will be eventually replaced by New(). |
| MUST_USE_RESULT static MaybeObject* Allocate( |
| Heap* heap, |
| int at_least_space_for, |
| MinimumCapacity capacity_option = USE_DEFAULT_MINIMUM_CAPACITY, |
| PretenureFlag pretenure = NOT_TENURED); |
| + // Returns a new HashTable object. |
| + static Handle<Derived> New( |
| + Isolate* isolate, |
| + int at_least_space_for, |
| + MinimumCapacity capacity_option = USE_DEFAULT_MINIMUM_CAPACITY, |
| + PretenureFlag pretenure = NOT_TENURED); |
| + |
| // Computes the required capacity for a table holding the given |
| // number of elements. May be more than HashTable::kMaxCapacity. |
| static int ComputeCapacity(int at_least_space_for); |
| @@ -3814,10 +3822,10 @@ class HashTable: public FixedArray { |
| void Swap(uint32_t entry1, uint32_t entry2, WriteBarrierMode mode); |
| // Rehashes this hash-table into the new table. |
| - MUST_USE_RESULT MaybeObject* Rehash(HashTable* new_table, Key key); |
| + void Rehash(Derived* new_table, Key key); |
| // Attempt to shrink hash table after removal of key. |
| - MUST_USE_RESULT MaybeObject* Shrink(Key key); |
| + static Handle<Derived> Shrink(Handle<Derived> table, Key key); |
| // Ensure enough space for n additional elements. |
| MUST_USE_RESULT MaybeObject* EnsureCapacity( |
| @@ -3870,7 +3878,9 @@ class SeqOneByteString; |
| // |
| // No special elements in the prefix and the element size is 1 |
| // because only the string itself (the key) needs to be stored. |
| -class StringTable: public HashTable<StringTableShape, HashTableKey*> { |
| +class StringTable: public HashTable<StringTable, |
| + StringTableShape, |
| + HashTableKey*> { |
| public: |
| // Find string in the string table. If it is not there yet, it is |
| // added. The return value is the string table which might have |
| @@ -3922,7 +3932,7 @@ class MapCacheShape : public BaseShape<HashTableKey*> { |
| // |
| // Maps keys that are a fixed array of unique names to a map. |
| // Used for canonicalize maps for object literals. |
| -class MapCache: public HashTable<MapCacheShape, HashTableKey*> { |
| +class MapCache: public HashTable<MapCache, MapCacheShape, HashTableKey*> { |
| public: |
| // Find cached value for a name key, otherwise return null. |
| Object* Lookup(FixedArray* key); |
| @@ -3934,33 +3944,36 @@ class MapCache: public HashTable<MapCacheShape, HashTableKey*> { |
| }; |
| -template <typename Shape, typename Key> |
| -class Dictionary: public HashTable<Shape, Key> { |
| +template <typename Derived, typename Shape, typename Key> |
| +class Dictionary: public HashTable<Derived, Shape, Key> { |
| + protected: |
| + typedef HashTable<Derived, Shape, Key> HashTable_; |
|
Yang
2014/04/11 14:12:22
Probably less confusing if you call this something
Igor Sheludko
2014/04/11 17:44:40
Good point! Done.
|
| + |
| public: |
| - static inline Dictionary<Shape, Key>* cast(Object* obj) { |
| - return reinterpret_cast<Dictionary<Shape, Key>*>(obj); |
| + static inline Dictionary* cast(Object* obj) { |
| + return reinterpret_cast<Dictionary*>(obj); |
| } |
| // Returns the value at entry. |
| Object* ValueAt(int entry) { |
| - return this->get(HashTable<Shape, Key>::EntryToIndex(entry) + 1); |
| + return this->get(HashTable_::EntryToIndex(entry) + 1); |
| } |
| // Set the value for entry. |
| void ValueAtPut(int entry, Object* value) { |
| - this->set(HashTable<Shape, Key>::EntryToIndex(entry) + 1, value); |
| + this->set(HashTable_::EntryToIndex(entry) + 1, value); |
| } |
| // Returns the property details for the property at entry. |
| PropertyDetails DetailsAt(int entry) { |
| ASSERT(entry >= 0); // Not found is -1, which is not caught by get(). |
| return PropertyDetails( |
| - Smi::cast(this->get(HashTable<Shape, Key>::EntryToIndex(entry) + 2))); |
| + Smi::cast(this->get(HashTable_::EntryToIndex(entry) + 2))); |
| } |
| // Set the details for entry. |
| void DetailsAtPut(int entry, PropertyDetails value) { |
| - this->set(HashTable<Shape, Key>::EntryToIndex(entry) + 2, value.AsSmi()); |
| + this->set(HashTable_::EntryToIndex(entry) + 2, value.AsSmi()); |
| } |
| // Sorting support |
| @@ -3970,16 +3983,14 @@ class Dictionary: public HashTable<Shape, Key> { |
| Object* DeleteProperty(int entry, JSObject::DeleteMode mode); |
| // TODO(ishell): Temporary wrapper until handlified. |
| static Handle<Object> DeleteProperty( |
| - Handle<Dictionary<Shape, Key> > dictionary, |
| + Handle<Dictionary> dictionary, |
| int entry, |
| JSObject::DeleteMode mode); |
| // Attempt to shrink the dictionary after deletion of key. |
| - MUST_USE_RESULT MaybeObject* Shrink(Key key); |
| - // TODO(ishell): Temporary wrapper until handlified. |
| - MUST_USE_RESULT static Handle<FixedArray> Shrink( |
| - Handle<Dictionary<Shape, Key> > dictionary, |
| - Key key); |
| + static inline Handle<Derived> Shrink(Handle<Derived> dictionary, Key key) { |
| + return HashTable_::Shrink(dictionary, key); |
| + } |
| // Returns the number of elements in the dictionary filtering out properties |
| // with the specified attributes. |
| @@ -4049,8 +4060,7 @@ class Dictionary: public HashTable<Shape, Key> { |
| // Generate new enumeration indices to avoid enumeration index overflow. |
| MUST_USE_RESULT MaybeObject* GenerateNewEnumerationIndices(); |
| - static const int kMaxNumberKeyIndex = |
| - HashTable<Shape, Key>::kPrefixStartIndex; |
| + static const int kMaxNumberKeyIndex = HashTable_::kPrefixStartIndex; |
| static const int kNextEnumerationIndexIndex = kMaxNumberKeyIndex + 1; |
| }; |
| @@ -4068,7 +4078,9 @@ class NameDictionaryShape : public BaseShape<Name*> { |
| }; |
| -class NameDictionary: public Dictionary<NameDictionaryShape, Name*> { |
| +class NameDictionary: public Dictionary<NameDictionary, |
| + NameDictionaryShape, |
| + Name*> { |
| public: |
| static inline NameDictionary* cast(Object* obj) { |
| ASSERT(obj->IsDictionary()); |
| @@ -4123,7 +4135,9 @@ class UnseededNumberDictionaryShape : public NumberDictionaryShape { |
| class SeededNumberDictionary |
| - : public Dictionary<SeededNumberDictionaryShape, uint32_t> { |
| + : public Dictionary<SeededNumberDictionary, |
| + SeededNumberDictionaryShape, |
| + uint32_t> { |
| public: |
| static SeededNumberDictionary* cast(Object* obj) { |
| ASSERT(obj->IsDictionary()); |
| @@ -4176,7 +4190,9 @@ class SeededNumberDictionary |
| class UnseededNumberDictionary |
| - : public Dictionary<UnseededNumberDictionaryShape, uint32_t> { |
| + : public Dictionary<UnseededNumberDictionary, |
| + UnseededNumberDictionaryShape, |
| + uint32_t> { |
| public: |
| static UnseededNumberDictionary* cast(Object* obj) { |
| ASSERT(obj->IsDictionary()); |
| @@ -4212,7 +4228,10 @@ class ObjectHashTableShape : public BaseShape<Object*> { |
| // ObjectHashTable maps keys that are arbitrary objects to object values by |
| // using the identity hash of the key for hashing purposes. |
| -class ObjectHashTable: public HashTable<ObjectHashTableShape, Object*> { |
| +class ObjectHashTable: public HashTable<ObjectHashTable, |
| + ObjectHashTableShape, |
| + Object*> { |
| + typedef HashTable<ObjectHashTable, ObjectHashTableShape, Object*> HashTable_; |
| public: |
| static inline ObjectHashTable* cast(Object* obj) { |
| ASSERT(obj->IsHashTable()); |
| @@ -4226,8 +4245,8 @@ class ObjectHashTable: public HashTable<ObjectHashTableShape, Object*> { |
| PretenureFlag pretenure = NOT_TENURED); |
| // Attempt to shrink hash table after removal of key. |
| - static Handle<ObjectHashTable> Shrink(Handle<ObjectHashTable> table, |
| - Handle<Object> key); |
| + static inline Handle<ObjectHashTable> Shrink(Handle<ObjectHashTable> table, |
| + Handle<Object> key); |
| // Looks up the value associated with the given key. The hole value is |
| // returned in case the key is not present. |
| @@ -4425,7 +4444,9 @@ class WeakHashTableShape : public BaseShape<Object*> { |
| // WeakHashTable maps keys that are arbitrary objects to object values. |
| // It is used for the global weak hash table that maps objects |
| // embedded in optimized code to dependent code lists. |
| -class WeakHashTable: public HashTable<WeakHashTableShape<2>, Object*> { |
| +class WeakHashTable: public HashTable<WeakHashTable, |
| + WeakHashTableShape<2>, |
| + Object*> { |
| public: |
| static inline WeakHashTable* cast(Object* obj) { |
| ASSERT(obj->IsHashTable()); |
| @@ -8200,7 +8221,8 @@ class CompilationCacheShape : public BaseShape<HashTableKey*> { |
| }; |
| -class CompilationCacheTable: public HashTable<CompilationCacheShape, |
| +class CompilationCacheTable: public HashTable<CompilationCacheTable, |
| + CompilationCacheShape, |
| HashTableKey*> { |
| public: |
| // Find cached value for a string key, otherwise return null. |
| @@ -8301,7 +8323,8 @@ class CodeCacheHashTableShape : public BaseShape<HashTableKey*> { |
| }; |
| -class CodeCacheHashTable: public HashTable<CodeCacheHashTableShape, |
| +class CodeCacheHashTable: public HashTable<CodeCacheHashTable, |
| + CodeCacheHashTableShape, |
| HashTableKey*> { |
| public: |
| Object* Lookup(Name* name, Code::Flags flags); |
| @@ -8351,7 +8374,9 @@ class PolymorphicCodeCache: public Struct { |
| class PolymorphicCodeCacheHashTable |
| - : public HashTable<CodeCacheHashTableShape, HashTableKey*> { |
| + : public HashTable<PolymorphicCodeCacheHashTable, |
| + CodeCacheHashTableShape, |
| + HashTableKey*> { |
| public: |
| Object* Lookup(MapHandleList* maps, int code_kind); |