| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 4a572dab29b35166598eb43b90eee2223067eddb..4a3b54252dca409223e2227572b0a247e8c40c78 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -7930,10 +7930,10 @@ void CodeCache::RemoveByIndex(Object* name, Code* code, int index) {
|
| // lookup not to create a new entry.
|
| class CodeCacheHashTableKey : public HashTableKey {
|
| public:
|
| - CodeCacheHashTableKey(Name* name, Code::Flags flags)
|
| - : name_(name), flags_(flags), code_(NULL) { }
|
| + CodeCacheHashTableKey(Handle<Name> name, Code::Flags flags)
|
| + : name_(name), flags_(flags), code_() { }
|
|
|
| - CodeCacheHashTableKey(Name* name, Code* code)
|
| + CodeCacheHashTableKey(Handle<Name> name, Handle<Code> code)
|
| : name_(name), flags_(code->flags()), code_(code) { }
|
|
|
|
|
| @@ -7952,7 +7952,7 @@ class CodeCacheHashTableKey : public HashTableKey {
|
| return name->Hash() ^ flags;
|
| }
|
|
|
| - uint32_t Hash() { return NameFlagsHashHelper(name_, flags_); }
|
| + uint32_t Hash() { return NameFlagsHashHelper(*name_, flags_); }
|
|
|
| uint32_t HashForObject(Object* obj) {
|
| FixedArray* pair = FixedArray::cast(obj);
|
| @@ -7962,67 +7962,60 @@ class CodeCacheHashTableKey : public HashTableKey {
|
| }
|
|
|
| MUST_USE_RESULT MaybeObject* AsObject(Heap* heap) {
|
| - ASSERT(code_ != NULL);
|
| + Handle<Code> code = code_.ToHandleChecked();
|
| Object* obj;
|
| { MaybeObject* maybe_obj = heap->AllocateFixedArray(2);
|
| if (!maybe_obj->ToObject(&obj)) return maybe_obj;
|
| }
|
| FixedArray* pair = FixedArray::cast(obj);
|
| - pair->set(0, name_);
|
| - pair->set(1, code_);
|
| + pair->set(0, *name_);
|
| + pair->set(1, *code);
|
| return pair;
|
| }
|
|
|
| + Handle<FixedArray> AsHandle() {
|
| + Isolate* isolate = name_->GetIsolate();
|
| + CALL_HEAP_FUNCTION(isolate,
|
| + AsObject(isolate->heap()),
|
| + FixedArray);
|
| + }
|
| +
|
| private:
|
| - Name* name_;
|
| + Handle<Name> name_;
|
| Code::Flags flags_;
|
| // TODO(jkummerow): We should be able to get by without this.
|
| - Code* code_;
|
| + MaybeHandle<Code> code_;
|
| };
|
|
|
|
|
| Object* CodeCacheHashTable::Lookup(Name* name, Code::Flags flags) {
|
| - CodeCacheHashTableKey key(name, flags);
|
| + DisallowHeapAllocation no_alloc;
|
| + CodeCacheHashTableKey key(handle(name), flags);
|
| int entry = FindEntry(&key);
|
| if (entry == kNotFound) return GetHeap()->undefined_value();
|
| return get(EntryToIndex(entry) + 1);
|
| }
|
|
|
|
|
| -MaybeObject* CodeCacheHashTable::Put(Name* name, Code* code) {
|
| +Handle<CodeCacheHashTable> CodeCacheHashTable::Put(
|
| + Handle<CodeCacheHashTable> cache, Handle<Name> name, Handle<Code> code) {
|
| CodeCacheHashTableKey key(name, code);
|
| - Object* obj;
|
| - { MaybeObject* maybe_obj = EnsureCapacity(1, &key);
|
| - if (!maybe_obj->ToObject(&obj)) return maybe_obj;
|
| - }
|
|
|
| - // Don't use |this|, as the table might have grown.
|
| - CodeCacheHashTable* cache = reinterpret_cast<CodeCacheHashTable*>(obj);
|
| + Handle<CodeCacheHashTable> new_cache = EnsureCapacity(cache, 1, &key);
|
|
|
| - int entry = cache->FindInsertionEntry(key.Hash());
|
| - Object* k;
|
| - { MaybeObject* maybe_k = key.AsObject(GetHeap());
|
| - if (!maybe_k->ToObject(&k)) return maybe_k;
|
| - }
|
| + int entry = new_cache->FindInsertionEntry(key.Hash());
|
| + Handle<Object> k = key.AsHandle();
|
|
|
| - cache->set(EntryToIndex(entry), k);
|
| - cache->set(EntryToIndex(entry) + 1, code);
|
| - cache->ElementAdded();
|
| - return cache;
|
| -}
|
| -
|
| -
|
| -Handle<CodeCacheHashTable> CodeCacheHashTable::Put(
|
| - Handle<CodeCacheHashTable> cache, Handle<Name> name, Handle<Code> code) {
|
| - Isolate* isolate = cache->GetIsolate();
|
| - CALL_HEAP_FUNCTION(isolate,
|
| - cache->Put(*name, *code),
|
| - CodeCacheHashTable);
|
| + new_cache->set(EntryToIndex(entry), *k);
|
| + new_cache->set(EntryToIndex(entry) + 1, *code);
|
| + new_cache->ElementAdded();
|
| + return new_cache;
|
| }
|
|
|
|
|
| int CodeCacheHashTable::GetIndex(Name* name, Code::Flags flags) {
|
| - CodeCacheHashTableKey key(name, flags);
|
| + DisallowHeapAllocation no_alloc;
|
| + CodeCacheHashTableKey key(handle(name), flags);
|
| int entry = FindEntry(&key);
|
| return (entry == kNotFound) ? -1 : entry;
|
| }
|
| @@ -14788,6 +14781,19 @@ MaybeObject* HashTable<Derived, Shape, Key>::EnsureCapacity(
|
|
|
|
|
| template<typename Derived, typename Shape, typename Key>
|
| +Handle<Derived> HashTable<Derived, Shape, Key>::EnsureCapacity(
|
| + Handle<Derived> table,
|
| + int n,
|
| + Key key,
|
| + PretenureFlag pretenure) {
|
| + Isolate* isolate = table->GetIsolate();
|
| + CALL_HEAP_FUNCTION(isolate,
|
| + table->EnsureCapacity(n, key, pretenure),
|
| + Derived);
|
| +}
|
| +
|
| +
|
| +template<typename Derived, typename Shape, typename Key>
|
| Handle<Derived> HashTable<Derived, Shape, Key>::Shrink(Handle<Derived> table,
|
| Key key) {
|
| int capacity = table->Capacity();
|
| @@ -15647,7 +15653,7 @@ Handle<CompilationCacheTable> CompilationCacheTable::Put(
|
| Handle<SharedFunctionInfo> shared(context->closure()->shared());
|
| StringSharedKey key(src, shared, FLAG_use_strict ? STRICT : SLOPPY,
|
| RelocInfo::kNoPosition);
|
| - cache = EnsureCapacityFor(cache, 1, &key);
|
| + cache = EnsureCapacity(cache, 1, &key);
|
| Handle<Object> k = key.AsObject(isolate->factory());
|
| int entry = cache->FindInsertionEntry(key.Hash());
|
| cache->set(EntryToIndex(entry), *k);
|
| @@ -15664,7 +15670,7 @@ Handle<CompilationCacheTable> CompilationCacheTable::PutEval(
|
| Isolate* isolate = cache->GetIsolate();
|
| Handle<SharedFunctionInfo> shared(context->closure()->shared());
|
| StringSharedKey key(src, shared, value->strict_mode(), scope_position);
|
| - cache = EnsureCapacityFor(cache, 1, &key);
|
| + cache = EnsureCapacity(cache, 1, &key);
|
| Handle<Object> k = key.AsObject(isolate->factory());
|
| int entry = cache->FindInsertionEntry(key.Hash());
|
| cache->set(EntryToIndex(entry), *k);
|
| @@ -15678,7 +15684,7 @@ Handle<CompilationCacheTable> CompilationCacheTable::PutRegExp(
|
| Handle<CompilationCacheTable> cache, Handle<String> src,
|
| JSRegExp::Flags flags, Handle<FixedArray> value) {
|
| RegExpKey key(src, flags);
|
| - cache = EnsureCapacityFor(cache, 1, &key);
|
| + cache = EnsureCapacity(cache, 1, &key);
|
| int entry = cache->FindInsertionEntry(key.Hash());
|
| // We store the value in the key slot, and compare the search key
|
| // to the stored value with a custon IsMatch function during lookups.
|
| @@ -15689,14 +15695,6 @@ Handle<CompilationCacheTable> CompilationCacheTable::PutRegExp(
|
| }
|
|
|
|
|
| -Handle<CompilationCacheTable> CompilationCacheTable::EnsureCapacityFor(
|
| - Handle<CompilationCacheTable> cache, int n, HashTableKey* key) {
|
| - CALL_HEAP_FUNCTION(cache->GetIsolate(),
|
| - cache->EnsureCapacity(n, key),
|
| - CompilationCacheTable);
|
| -}
|
| -
|
| -
|
| void CompilationCacheTable::Remove(Object* value) {
|
| DisallowHeapAllocation no_allocation;
|
| Object* the_hole_value = GetHeap()->the_hole_value();
|
| @@ -15716,7 +15714,7 @@ void CompilationCacheTable::Remove(Object* value) {
|
| // StringsKey used for HashTable where key is array of internalized strings.
|
| class StringsKey : public HashTableKey {
|
| public:
|
| - explicit StringsKey(FixedArray* strings) : strings_(strings) { }
|
| + explicit StringsKey(Handle<FixedArray> strings) : strings_(strings) { }
|
|
|
| bool IsMatch(Object* strings) {
|
| FixedArray* o = FixedArray::cast(strings);
|
| @@ -15728,7 +15726,7 @@ class StringsKey : public HashTableKey {
|
| return true;
|
| }
|
|
|
| - uint32_t Hash() { return HashForObject(strings_); }
|
| + uint32_t Hash() { return HashForObject(*strings_); }
|
|
|
| uint32_t HashForObject(Object* obj) {
|
| FixedArray* strings = FixedArray::cast(obj);
|
| @@ -15740,34 +15738,32 @@ class StringsKey : public HashTableKey {
|
| return hash;
|
| }
|
|
|
| - Object* AsObject(Heap* heap) { return strings_; }
|
| + Object* AsObject(Heap* heap) { return *strings_; }
|
|
|
| private:
|
| - FixedArray* strings_;
|
| + Handle<FixedArray> strings_;
|
| };
|
|
|
|
|
| Object* MapCache::Lookup(FixedArray* array) {
|
| - StringsKey key(array);
|
| + DisallowHeapAllocation no_alloc;
|
| + StringsKey key(handle(array));
|
| int entry = FindEntry(&key);
|
| if (entry == kNotFound) return GetHeap()->undefined_value();
|
| return get(EntryToIndex(entry) + 1);
|
| }
|
|
|
|
|
| -MaybeObject* MapCache::Put(FixedArray* array, Map* value) {
|
| +Handle<MapCache> MapCache::Put(
|
| + Handle<MapCache> map_cache, Handle<FixedArray> array, Handle<Map> value) {
|
| StringsKey key(array);
|
| - Object* obj;
|
| - { MaybeObject* maybe_obj = EnsureCapacity(1, &key);
|
| - if (!maybe_obj->ToObject(&obj)) return maybe_obj;
|
| - }
|
|
|
| - MapCache* cache = reinterpret_cast<MapCache*>(obj);
|
| - int entry = cache->FindInsertionEntry(key.Hash());
|
| - cache->set(EntryToIndex(entry), array);
|
| - cache->set(EntryToIndex(entry) + 1, value);
|
| - cache->ElementAdded();
|
| - return cache;
|
| + Handle<MapCache> new_cache = EnsureCapacity(map_cache, 1, &key);
|
| + int entry = new_cache->FindInsertionEntry(key.Hash());
|
| + new_cache->set(EntryToIndex(entry), *array);
|
| + new_cache->set(EntryToIndex(entry) + 1, *value);
|
| + new_cache->ElementAdded();
|
| + return new_cache;
|
| }
|
|
|
|
|
| @@ -15889,6 +15885,17 @@ MaybeObject* Dictionary<Derived, Shape, Key>::EnsureCapacity(int n, Key key) {
|
| }
|
|
|
|
|
| +
|
| +template<typename Derived, typename Shape, typename Key>
|
| +Handle<Derived> Dictionary<Derived, Shape, Key>::EnsureCapacity(
|
| + Handle<Derived> obj, int n, Key key) {
|
| + Isolate* isolate = obj->GetIsolate();
|
| + CALL_HEAP_FUNCTION(isolate,
|
| + obj->EnsureCapacity(n, key),
|
| + Derived);
|
| +}
|
| +
|
| +
|
| // TODO(ishell): Temporary wrapper until handlified.
|
| template<typename Derived, typename Shape, typename Key>
|
| Handle<Object> Dictionary<Derived, Shape, Key>::DeleteProperty(
|
| @@ -16230,20 +16237,6 @@ Object* Dictionary<Derived, Shape, Key>::SlowReverseLookup(Object* value) {
|
| }
|
|
|
|
|
| -Handle<ObjectHashTable> ObjectHashTable::EnsureCapacity(
|
| - Handle<ObjectHashTable> table,
|
| - int n,
|
| - Handle<Object> key,
|
| - PretenureFlag pretenure) {
|
| - Handle<HashTable<ObjectHashTable,
|
| - ObjectHashTableShape,
|
| - Object*> > table_base = table;
|
| - CALL_HEAP_FUNCTION(table_base->GetIsolate(),
|
| - table_base->EnsureCapacity(n, *key, pretenure),
|
| - ObjectHashTable);
|
| -}
|
| -
|
| -
|
| Object* ObjectHashTable::Lookup(Object* key) {
|
| ASSERT(IsKey(key));
|
|
|
| @@ -16284,7 +16277,7 @@ Handle<ObjectHashTable> ObjectHashTable::Put(Handle<ObjectHashTable> table,
|
| }
|
|
|
| // Check whether the hash table should be extended.
|
| - table = EnsureCapacity(table, 1, key);
|
| + table = EnsureCapacity(table, 1, *key);
|
| table->AddEntry(table->FindInsertionEntry(Handle<Smi>::cast(hash)->value()),
|
| *key,
|
| *value);
|
|
|