Index: src/objects.cc |
=================================================================== |
--- src/objects.cc (revision 147) |
+++ src/objects.cc (working copy) |
@@ -5233,7 +5233,7 @@ |
// The NumberKey uses carries the uint32_t as key. |
// This avoids allocation in HasProperty. |
-class Dictionary::NumberKey : public Dictionary::Key { |
+class NumberKey : public HashTableKey { |
public: |
explicit NumberKey(uint32_t number) { |
number_ = number; |
@@ -5279,14 +5279,14 @@ |
uint32_t number_; |
}; |
+ |
// StringKey simply carries a string object as key. |
-class Dictionary::StringKey : public Dictionary::Key { |
+class StringKey : public HashTableKey { |
public: |
explicit StringKey(String* string) { |
string_ = string; |
} |
- private: |
bool IsMatch(Object* other) { |
if (!other->IsString()) return false; |
return string_->Equals(String::cast(other)); |
@@ -5307,10 +5307,10 @@ |
String* string_; |
}; |
-// Utf8Key carries a vector of chars as key. |
-class SymbolTable::Utf8Key : public SymbolTable::Key { |
+// Utf8SymbolKey carries a vector of chars as key. |
+class Utf8SymbolKey : public HashTableKey { |
public: |
- explicit Utf8Key(Vector<const char> string) |
+ explicit Utf8SymbolKey(Vector<const char> string) |
: string_(string), hash_(0) { } |
bool IsMatch(Object* other) { |
@@ -5350,10 +5350,10 @@ |
}; |
-// StringKey carries a string object as key. |
-class SymbolTable::StringKey : public SymbolTable::Key { |
+// SymbolKey carries a string/symbol object as key. |
+class SymbolKey : public HashTableKey { |
public: |
- explicit StringKey(String* string) : string_(string) { } |
+ explicit SymbolKey(String* string) : string_(string) { } |
HashFunction GetHashFunction() { |
return StringHash; |
@@ -5417,7 +5417,7 @@ |
// Find entry for key otherwise return -1. |
template <int prefix_size, int element_size> |
-int HashTable<prefix_size, element_size>::FindEntry(Key* key) { |
+int HashTable<prefix_size, element_size>::FindEntry(HashTableKey* key) { |
uint32_t nof = NumberOfElements(); |
if (nof == 0) return -1; // Bail out if empty. |
@@ -5444,7 +5444,8 @@ |
template<int prefix_size, int element_size> |
-Object* HashTable<prefix_size, element_size>::EnsureCapacity(int n, Key* key) { |
+Object* HashTable<prefix_size, element_size>::EnsureCapacity( |
+ int n, HashTableKey* key) { |
int capacity = Capacity(); |
int nof = NumberOfElements() + n; |
// Make sure 20% is free |
@@ -5502,19 +5503,23 @@ |
template class HashTable<2, 3>; |
+// Force instantiation of EvalCache's base class |
+template class HashTable<0, 2>; |
+ |
+ |
Object* SymbolTable::LookupString(String* string, Object** s) { |
- StringKey key(string); |
+ SymbolKey key(string); |
return LookupKey(&key, s); |
} |
Object* SymbolTable::LookupSymbol(Vector<const char> str, Object** s) { |
- Utf8Key key(str); |
+ Utf8SymbolKey key(str); |
return LookupKey(&key, s); |
} |
-Object* SymbolTable::LookupKey(Key* key, Object** s) { |
+Object* SymbolTable::LookupKey(HashTableKey* key, Object** s) { |
int entry = FindEntry(key); |
// Symbol already in table. |
@@ -5545,6 +5550,31 @@ |
} |
+Object* EvalCache::Lookup(String* src) { |
+ StringKey key(src); |
+ int entry = FindEntry(&key); |
+ if (entry != -1) { |
+ return get(EntryToIndex(entry) + 1); |
+ } else { |
+ return Heap::undefined_value(); |
+ } |
+} |
+ |
+ |
+Object* EvalCache::Put(String* src, Object* value) { |
+ StringKey key(src); |
+ Object* obj = EnsureCapacity(1, &key); |
+ if (obj->IsFailure()) return obj; |
+ |
+ EvalCache* cache = reinterpret_cast<EvalCache*>(obj); |
+ int entry = cache->FindInsertionEntry(src, key.Hash()); |
+ cache->set(EntryToIndex(entry), src); |
+ cache->set(EntryToIndex(entry) + 1, value); |
+ cache->ElementAdded(); |
+ return cache; |
+} |
+ |
+ |
Object* Dictionary::Allocate(int at_least_space_for) { |
Object* obj = DictionaryBase::Allocate(at_least_space_for); |
// Initialize the next enumeration index. |
@@ -5607,7 +5637,7 @@ |
} |
-Object* Dictionary::EnsureCapacity(int n, Key* key) { |
+Object* Dictionary::EnsureCapacity(int n, HashTableKey* key) { |
// Check whether there are enough enumeration indices to add n elements. |
if (key->IsStringKey() && |
!PropertyDetails::IsValidIndex(NextEnumerationIndex() + n)) { |
@@ -5663,7 +5693,7 @@ |
} |
-Object* Dictionary::AtPut(Key* key, Object* value) { |
+Object* Dictionary::AtPut(HashTableKey* key, Object* value) { |
int entry = FindEntry(key); |
// If the entry is present set the value; |
@@ -5683,7 +5713,8 @@ |
} |
-Object* Dictionary::Add(Key* key, Object* value, PropertyDetails details) { |
+Object* Dictionary::Add(HashTableKey* key, Object* value, |
+ PropertyDetails details) { |
// Check whether the dictionary should be extended. |
Object* obj = EnsureCapacity(1, key); |
if (obj->IsFailure()) return obj; |