Commit 72e2d5b3 authored by ishell@chromium.org's avatar ishell@chromium.org

Reland "HashTable::Shrink() handlified and derived template parameter added to...

Reland "HashTable::Shrink() handlified and derived template parameter added to HashTable hierarchy."

R=yangguo@chromium.org

Review URL: https://codereview.chromium.org/235643002

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20724 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 8b445aaa
......@@ -2882,8 +2882,8 @@ DescriptorArray::WhitenessWitness::~WhitenessWitness() {
}
template<typename Shape, typename Key>
int HashTable<Shape, Key>::ComputeCapacity(int at_least_space_for) {
template<typename Derived, typename Shape, typename Key>
int HashTable<Derived, Shape, Key>::ComputeCapacity(int at_least_space_for) {
const int kMinCapacity = 32;
int capacity = RoundUpToPowerOf2(at_least_space_for * 2);
if (capacity < kMinCapacity) {
......@@ -2893,17 +2893,17 @@ int HashTable<Shape, Key>::ComputeCapacity(int at_least_space_for) {
}
template<typename Shape, typename Key>
int HashTable<Shape, Key>::FindEntry(Key key) {
template<typename Derived, typename Shape, typename Key>
int HashTable<Derived, Shape, Key>::FindEntry(Key key) {
return FindEntry(GetIsolate(), key);
}
// Find entry for key otherwise return kNotFound.
template<typename Shape, typename Key>
int HashTable<Shape, Key>::FindEntry(Isolate* isolate, Key key) {
template<typename Derived, typename Shape, typename Key>
int HashTable<Derived, Shape, Key>::FindEntry(Isolate* isolate, Key key) {
uint32_t capacity = Capacity();
uint32_t entry = FirstProbe(HashTable<Shape, Key>::Hash(key), capacity);
uint32_t entry = FirstProbe(HashTable::Hash(key), capacity);
uint32_t count = 1;
// EnsureCapacity will guarantee the hash table is never full.
while (true) {
......@@ -3028,8 +3028,9 @@ FixedTypedArray<Traits>* FixedTypedArray<Traits>::cast(Object* object) {
#undef MAKE_STRUCT_CAST
template <typename Shape, typename Key>
HashTable<Shape, Key>* HashTable<Shape, Key>::cast(Object* obj) {
template <typename Derived, typename Shape, typename Key>
HashTable<Derived, Shape, Key>*
HashTable<Derived, Shape, Key>::cast(Object* obj) {
ASSERT(obj->IsHashTable());
return reinterpret_cast<HashTable*>(obj);
}
......@@ -6671,23 +6672,23 @@ bool AccessorPair::prohibits_overwriting() {
}
template<typename Shape, typename Key>
void Dictionary<Shape, Key>::SetEntry(int entry,
Object* key,
Object* value) {
template<typename Derived, typename Shape, typename Key>
void Dictionary<Derived, Shape, Key>::SetEntry(int entry,
Object* key,
Object* value) {
SetEntry(entry, key, value, PropertyDetails(Smi::FromInt(0)));
}
template<typename Shape, typename Key>
void Dictionary<Shape, Key>::SetEntry(int entry,
Object* key,
Object* value,
PropertyDetails details) {
template<typename Derived, typename Shape, typename Key>
void Dictionary<Derived, Shape, Key>::SetEntry(int entry,
Object* key,
Object* value,
PropertyDetails details) {
ASSERT(!key->IsName() ||
details.IsDeleted() ||
details.dictionary_index() > 0);
int index = HashTable<Shape, Key>::EntryToIndex(entry);
int index = DerivedHashTable::EntryToIndex(entry);
DisallowHeapAllocation no_gc;
WriteBarrierMode mode = FixedArray::GetWriteBarrierMode(no_gc);
FixedArray::set(index, key, mode);
......@@ -6773,6 +6774,12 @@ MaybeObject* ObjectHashTableShape::AsObject(Heap* heap, Object* key) {
}
Handle<ObjectHashTable> ObjectHashTable::Shrink(
Handle<ObjectHashTable> table, Handle<Object> key) {
return HashTable_::Shrink(table, *key);
}
template <int entrysize>
bool WeakHashTableShape<entrysize>::IsMatch(Object* key, Object* other) {
return key->SameValue(other);
......
This diff is collapsed.
......@@ -3656,7 +3656,7 @@ class BaseShape {
}
};
template<typename Shape, typename Key>
template<typename Derived, typename Shape, typename Key>
class HashTable: public FixedArray {
public:
// Wrapper methods
......@@ -3709,12 +3709,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);
......@@ -3824,10 +3832,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(
......@@ -3880,7 +3888,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
......@@ -3932,7 +3942,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);
......@@ -3944,33 +3954,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> DerivedHashTable;
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(DerivedHashTable::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(DerivedHashTable::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(DerivedHashTable::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(DerivedHashTable::EntryToIndex(entry) + 2, value.AsSmi());
}
// Sorting support
......@@ -3980,16 +3993,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 DerivedHashTable::Shrink(dictionary, key);
}
// Returns the number of elements in the dictionary filtering out properties
// with the specified attributes.
......@@ -4059,8 +4070,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 = DerivedHashTable::kPrefixStartIndex;
static const int kNextEnumerationIndexIndex = kMaxNumberKeyIndex + 1;
};
......@@ -4078,7 +4088,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());
......@@ -4128,7 +4140,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());
......@@ -4181,7 +4195,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());
......@@ -4217,7 +4233,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());
......@@ -4231,8 +4250,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.
......@@ -4430,7 +4449,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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment