| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 4a3b54252dca409223e2227572b0a247e8c40c78..dfcaea146ce34be7d30263816af76967baf92142 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -8030,41 +8030,27 @@ void CodeCacheHashTable::RemoveByIndex(int index) {
|
| }
|
|
|
|
|
| -void PolymorphicCodeCache::Update(Handle<PolymorphicCodeCache> cache,
|
| +void PolymorphicCodeCache::Update(Handle<PolymorphicCodeCache> code_cache,
|
| MapHandleList* maps,
|
| Code::Flags flags,
|
| Handle<Code> code) {
|
| - Isolate* isolate = cache->GetIsolate();
|
| - CALL_HEAP_FUNCTION_VOID(isolate, cache->Update(maps, flags, *code));
|
| -}
|
| -
|
| -
|
| -MaybeObject* PolymorphicCodeCache::Update(MapHandleList* maps,
|
| - Code::Flags flags,
|
| - Code* code) {
|
| - // Initialize cache if necessary.
|
| - if (cache()->IsUndefined()) {
|
| - Object* result;
|
| - { MaybeObject* maybe_result =
|
| - PolymorphicCodeCacheHashTable::Allocate(
|
| - GetHeap(),
|
| - PolymorphicCodeCacheHashTable::kInitialSize);
|
| - if (!maybe_result->ToObject(&result)) return maybe_result;
|
| - }
|
| - set_cache(result);
|
| + Isolate* isolate = code_cache->GetIsolate();
|
| + if (code_cache->cache()->IsUndefined()) {
|
| + Handle<PolymorphicCodeCacheHashTable> result =
|
| + PolymorphicCodeCacheHashTable::New(
|
| + isolate,
|
| + PolymorphicCodeCacheHashTable::kInitialSize);
|
| + code_cache->set_cache(*result);
|
| } else {
|
| // This entry shouldn't be contained in the cache yet.
|
| - ASSERT(PolymorphicCodeCacheHashTable::cast(cache())
|
| + ASSERT(PolymorphicCodeCacheHashTable::cast(code_cache->cache())
|
| ->Lookup(maps, flags)->IsUndefined());
|
| }
|
| - PolymorphicCodeCacheHashTable* hash_table =
|
| - PolymorphicCodeCacheHashTable::cast(cache());
|
| - Object* new_cache;
|
| - { MaybeObject* maybe_new_cache = hash_table->Put(maps, flags, code);
|
| - if (!maybe_new_cache->ToObject(&new_cache)) return maybe_new_cache;
|
| - }
|
| - set_cache(new_cache);
|
| - return this;
|
| + Handle<PolymorphicCodeCacheHashTable> hash_table =
|
| + handle(PolymorphicCodeCacheHashTable::cast(code_cache->cache()));
|
| + Handle<PolymorphicCodeCacheHashTable> new_cache =
|
| + PolymorphicCodeCacheHashTable::Put(hash_table, maps, flags, code);
|
| + code_cache->set_cache(*new_cache);
|
| }
|
|
|
|
|
| @@ -8086,8 +8072,10 @@ Handle<Object> PolymorphicCodeCache::Lookup(MapHandleList* maps,
|
| class PolymorphicCodeCacheHashTableKey : public HashTableKey {
|
| public:
|
| // Callers must ensure that |maps| outlives the newly constructed object.
|
| - PolymorphicCodeCacheHashTableKey(MapHandleList* maps, int code_flags)
|
| - : maps_(maps),
|
| + PolymorphicCodeCacheHashTableKey(
|
| + Isolate* isolate, MapHandleList* maps, int code_flags)
|
| + : isolate_(isolate),
|
| + maps_(maps),
|
| code_flags_(code_flags) {}
|
|
|
| bool IsMatch(Object* other) {
|
| @@ -8153,6 +8141,12 @@ class PolymorphicCodeCacheHashTableKey : public HashTableKey {
|
| return list;
|
| }
|
|
|
| + Handle<FixedArray> AsHandle() {
|
| + CALL_HEAP_FUNCTION(isolate_,
|
| + AsObject(isolate_->heap()),
|
| + FixedArray);
|
| + }
|
| +
|
| private:
|
| static MapHandleList* FromObject(Object* obj,
|
| int* code_flags,
|
| @@ -8166,6 +8160,7 @@ class PolymorphicCodeCacheHashTableKey : public HashTableKey {
|
| return maps;
|
| }
|
|
|
| + Isolate* isolate_;
|
| MapHandleList* maps_; // weak.
|
| int code_flags_;
|
| static const int kDefaultListAllocationSize = kMaxKeyedPolymorphism + 1;
|
| @@ -8173,30 +8168,29 @@ class PolymorphicCodeCacheHashTableKey : public HashTableKey {
|
|
|
|
|
| Object* PolymorphicCodeCacheHashTable::Lookup(MapHandleList* maps,
|
| - int code_flags) {
|
| - PolymorphicCodeCacheHashTableKey key(maps, code_flags);
|
| + int code_kind) {
|
| + DisallowHeapAllocation no_alloc;
|
| + PolymorphicCodeCacheHashTableKey key(GetIsolate(), maps, code_kind);
|
| int entry = FindEntry(&key);
|
| if (entry == kNotFound) return GetHeap()->undefined_value();
|
| return get(EntryToIndex(entry) + 1);
|
| }
|
|
|
|
|
| -MaybeObject* PolymorphicCodeCacheHashTable::Put(MapHandleList* maps,
|
| - int code_flags,
|
| - Code* code) {
|
| - PolymorphicCodeCacheHashTableKey key(maps, code_flags);
|
| - Object* obj;
|
| - { MaybeObject* maybe_obj = EnsureCapacity(1, &key);
|
| - if (!maybe_obj->ToObject(&obj)) return maybe_obj;
|
| - }
|
| - PolymorphicCodeCacheHashTable* cache =
|
| - reinterpret_cast<PolymorphicCodeCacheHashTable*>(obj);
|
| +Handle<PolymorphicCodeCacheHashTable> PolymorphicCodeCacheHashTable::Put(
|
| + Handle<PolymorphicCodeCacheHashTable> hash_table,
|
| + MapHandleList* maps,
|
| + int code_kind,
|
| + Handle<Code> code) {
|
| + PolymorphicCodeCacheHashTableKey key(
|
| + hash_table->GetIsolate(), maps, code_kind);
|
| + Handle<PolymorphicCodeCacheHashTable> cache =
|
| + EnsureCapacity(hash_table, 1, &key);
|
| int entry = cache->FindInsertionEntry(key.Hash());
|
| - { MaybeObject* maybe_obj = key.AsObject(GetHeap());
|
| - if (!maybe_obj->ToObject(&obj)) return maybe_obj;
|
| - }
|
| - cache->set(EntryToIndex(entry), obj);
|
| - cache->set(EntryToIndex(entry) + 1, code);
|
| +
|
| + Handle<FixedArray> obj = key.AsHandle();
|
| + cache->set(EntryToIndex(entry), *obj);
|
| + cache->set(EntryToIndex(entry) + 1, *code);
|
| cache->ElementAdded();
|
| return cache;
|
| }
|
|
|