| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 7404ee7a109b180d60efd8247ddef96fe8049272..2cda1ee9ded1a71970ade645a6e21d02b9f53a90 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -13685,8 +13685,8 @@ class StringKey : public HashTableKey {
|
| // StringSharedKeys are used as keys in the eval cache.
|
| class StringSharedKey : public HashTableKey {
|
| public:
|
| - StringSharedKey(String* source,
|
| - SharedFunctionInfo* shared,
|
| + StringSharedKey(Handle<String> source,
|
| + Handle<SharedFunctionInfo> shared,
|
| StrictMode strict_mode,
|
| int scope_position)
|
| : source_(source),
|
| @@ -13695,10 +13695,11 @@ class StringSharedKey : public HashTableKey {
|
| scope_position_(scope_position) { }
|
|
|
| bool IsMatch(Object* other) {
|
| + DisallowHeapAllocation no_allocation;
|
| if (!other->IsFixedArray()) return false;
|
| FixedArray* other_array = FixedArray::cast(other);
|
| SharedFunctionInfo* shared = SharedFunctionInfo::cast(other_array->get(0));
|
| - if (shared != shared_) return false;
|
| + if (shared != *shared_) return false;
|
| int strict_unchecked = Smi::cast(other_array->get(2))->value();
|
| ASSERT(strict_unchecked == SLOPPY || strict_unchecked == STRICT);
|
| StrictMode strict_mode = static_cast<StrictMode>(strict_unchecked);
|
| @@ -13706,7 +13707,7 @@ class StringSharedKey : public HashTableKey {
|
| int scope_position = Smi::cast(other_array->get(3))->value();
|
| if (scope_position != scope_position_) return false;
|
| String* source = String::cast(other_array->get(1));
|
| - return source->Equals(source_);
|
| + return source->Equals(*source_);
|
| }
|
|
|
| static uint32_t StringSharedHashHelper(String* source,
|
| @@ -13720,7 +13721,7 @@ class StringSharedKey : public HashTableKey {
|
| // script source code and the start position of the calling scope.
|
| // We do this to ensure that the cache entries can survive garbage
|
| // collection.
|
| - Script* script = Script::cast(shared->script());
|
| + Script* script(Script::cast(shared->script()));
|
| hash ^= String::cast(script->source())->Hash();
|
| if (strict_mode == STRICT) hash ^= 0x8000;
|
| hash += scope_position;
|
| @@ -13729,11 +13730,12 @@ class StringSharedKey : public HashTableKey {
|
| }
|
|
|
| uint32_t Hash() {
|
| - return StringSharedHashHelper(
|
| - source_, shared_, strict_mode_, scope_position_);
|
| + return StringSharedHashHelper(*source_, *shared_, strict_mode_,
|
| + scope_position_);
|
| }
|
|
|
| uint32_t HashForObject(Object* obj) {
|
| + DisallowHeapAllocation no_allocation;
|
| FixedArray* other_array = FixedArray::cast(obj);
|
| SharedFunctionInfo* shared = SharedFunctionInfo::cast(other_array->get(0));
|
| String* source = String::cast(other_array->get(1));
|
| @@ -13745,22 +13747,25 @@ class StringSharedKey : public HashTableKey {
|
| source, shared, strict_mode, scope_position);
|
| }
|
|
|
| - MUST_USE_RESULT MaybeObject* AsObject(Heap* heap) {
|
| - Object* obj;
|
| - { MaybeObject* maybe_obj = heap->AllocateFixedArray(4);
|
| - if (!maybe_obj->ToObject(&obj)) return maybe_obj;
|
| - }
|
| - FixedArray* other_array = FixedArray::cast(obj);
|
| - other_array->set(0, shared_);
|
| - other_array->set(1, source_);
|
| - other_array->set(2, Smi::FromInt(strict_mode_));
|
| - other_array->set(3, Smi::FromInt(scope_position_));
|
| - return other_array;
|
| +
|
| + Object* AsObject(Heap* heap) {
|
| + UNREACHABLE();
|
| + return NULL;
|
| + }
|
| +
|
| +
|
| + Handle<Object> AsObject(Factory* factory) {
|
| + Handle<FixedArray> array = factory->NewFixedArray(4);
|
| + array->set(0, *shared_);
|
| + array->set(1, *source_);
|
| + array->set(2, Smi::FromInt(strict_mode_));
|
| + array->set(3, Smi::FromInt(scope_position_));
|
| + return array;
|
| }
|
|
|
| private:
|
| - String* source_;
|
| - SharedFunctionInfo* shared_;
|
| + Handle<String> source_;
|
| + Handle<SharedFunctionInfo> shared_;
|
| StrictMode strict_mode_;
|
| int scope_position_;
|
| };
|
| @@ -14957,116 +14962,101 @@ MaybeObject* StringTable::LookupKey(HashTableKey* key, Object** s) {
|
| }
|
|
|
|
|
| -Object* CompilationCacheTable::Lookup(String* src, Context* context) {
|
| - SharedFunctionInfo* shared = context->closure()->shared();
|
| - StringSharedKey key(src,
|
| - shared,
|
| - FLAG_use_strict ? STRICT : SLOPPY,
|
| +Handle<Object> CompilationCacheTable::Lookup(Handle<String> src,
|
| + Handle<Context> context) {
|
| + Isolate* isolate = GetIsolate();
|
| + Handle<SharedFunctionInfo> shared(context->closure()->shared());
|
| + StringSharedKey key(src, shared, FLAG_use_strict ? STRICT : SLOPPY,
|
| RelocInfo::kNoPosition);
|
| int entry = FindEntry(&key);
|
| - if (entry == kNotFound) return GetHeap()->undefined_value();
|
| - return get(EntryToIndex(entry) + 1);
|
| + if (entry == kNotFound) return isolate->factory()->undefined_value();
|
| + return Handle<Object>(get(EntryToIndex(entry) + 1), isolate);
|
| }
|
|
|
|
|
| -Object* CompilationCacheTable::LookupEval(String* src,
|
| - Context* context,
|
| - StrictMode strict_mode,
|
| - int scope_position) {
|
| - StringSharedKey key(src,
|
| - context->closure()->shared(),
|
| - strict_mode,
|
| - scope_position);
|
| +Handle<Object> CompilationCacheTable::LookupEval(Handle<String> src,
|
| + Handle<Context> context,
|
| + StrictMode strict_mode,
|
| + int scope_position) {
|
| + Isolate* isolate = GetIsolate();
|
| + Handle<SharedFunctionInfo> shared(context->closure()->shared());
|
| + StringSharedKey key(src, shared, strict_mode, scope_position);
|
| int entry = FindEntry(&key);
|
| - if (entry == kNotFound) return GetHeap()->undefined_value();
|
| - return get(EntryToIndex(entry) + 1);
|
| + if (entry == kNotFound) return isolate->factory()->undefined_value();
|
| + return Handle<Object>(get(EntryToIndex(entry) + 1), isolate);
|
| }
|
|
|
|
|
| -Object* CompilationCacheTable::LookupRegExp(String* src,
|
| - JSRegExp::Flags flags) {
|
| - RegExpKey key(src, flags);
|
| +Handle<Object> CompilationCacheTable::LookupRegExp(Handle<String> src,
|
| + JSRegExp::Flags flags) {
|
| + Isolate* isolate = GetIsolate();
|
| + DisallowHeapAllocation no_allocation;
|
| + RegExpKey key(*src, flags);
|
| int entry = FindEntry(&key);
|
| - if (entry == kNotFound) return GetHeap()->undefined_value();
|
| - return get(EntryToIndex(entry) + 1);
|
| + if (entry == kNotFound) return isolate->factory()->undefined_value();
|
| + return Handle<Object>(get(EntryToIndex(entry) + 1), isolate);
|
| }
|
|
|
|
|
| -MaybeObject* CompilationCacheTable::Put(String* src,
|
| - Context* context,
|
| - Object* value) {
|
| - SharedFunctionInfo* shared = context->closure()->shared();
|
| - StringSharedKey key(src,
|
| - shared,
|
| - FLAG_use_strict ? STRICT : SLOPPY,
|
| +Handle<CompilationCacheTable> CompilationCacheTable::Put(
|
| + Handle<CompilationCacheTable> cache, Handle<String> src,
|
| + Handle<Context> context, Handle<Object> value) {
|
| + Isolate* isolate = cache->GetIsolate();
|
| + Handle<SharedFunctionInfo> shared(context->closure()->shared());
|
| + StringSharedKey key(src, shared, FLAG_use_strict ? STRICT : SLOPPY,
|
| RelocInfo::kNoPosition);
|
| - CompilationCacheTable* cache;
|
| - MaybeObject* maybe_cache = EnsureCapacity(1, &key);
|
| - if (!maybe_cache->To(&cache)) return maybe_cache;
|
| -
|
| - Object* k;
|
| - MaybeObject* maybe_k = key.AsObject(GetHeap());
|
| - if (!maybe_k->To(&k)) return maybe_k;
|
| -
|
| + cache = EnsureCapacityFor(cache, 1, &key);
|
| + Handle<Object> k = key.AsObject(isolate->factory());
|
| int entry = cache->FindInsertionEntry(key.Hash());
|
| - cache->set(EntryToIndex(entry), k);
|
| - cache->set(EntryToIndex(entry) + 1, value);
|
| + cache->set(EntryToIndex(entry), *k);
|
| + cache->set(EntryToIndex(entry) + 1, *value);
|
| cache->ElementAdded();
|
| return cache;
|
| }
|
|
|
|
|
| -MaybeObject* CompilationCacheTable::PutEval(String* src,
|
| - Context* context,
|
| - SharedFunctionInfo* value,
|
| - int scope_position) {
|
| - StringSharedKey key(src,
|
| - context->closure()->shared(),
|
| - value->strict_mode(),
|
| - scope_position);
|
| - Object* obj;
|
| - { MaybeObject* maybe_obj = EnsureCapacity(1, &key);
|
| - if (!maybe_obj->ToObject(&obj)) return maybe_obj;
|
| - }
|
| -
|
| - CompilationCacheTable* cache =
|
| - reinterpret_cast<CompilationCacheTable*>(obj);
|
| +Handle<CompilationCacheTable> CompilationCacheTable::PutEval(
|
| + Handle<CompilationCacheTable> cache, Handle<String> src,
|
| + Handle<Context> context, Handle<SharedFunctionInfo> value,
|
| + int scope_position) {
|
| + Isolate* isolate = cache->GetIsolate();
|
| + Handle<SharedFunctionInfo> shared(context->closure()->shared());
|
| + StringSharedKey key(src, shared, value->strict_mode(), scope_position);
|
| + cache = EnsureCapacityFor(cache, 1, &key);
|
| + Handle<Object> k = key.AsObject(isolate->factory());
|
| int entry = cache->FindInsertionEntry(key.Hash());
|
| -
|
| - Object* k;
|
| - { MaybeObject* maybe_k = key.AsObject(GetHeap());
|
| - if (!maybe_k->ToObject(&k)) return maybe_k;
|
| - }
|
| -
|
| - cache->set(EntryToIndex(entry), k);
|
| - cache->set(EntryToIndex(entry) + 1, value);
|
| + cache->set(EntryToIndex(entry), *k);
|
| + cache->set(EntryToIndex(entry) + 1, *value);
|
| cache->ElementAdded();
|
| return cache;
|
| }
|
|
|
|
|
| -MaybeObject* CompilationCacheTable::PutRegExp(String* src,
|
| - JSRegExp::Flags flags,
|
| - FixedArray* value) {
|
| - RegExpKey key(src, flags);
|
| - Object* obj;
|
| - { MaybeObject* maybe_obj = EnsureCapacity(1, &key);
|
| - if (!maybe_obj->ToObject(&obj)) return maybe_obj;
|
| - }
|
| -
|
| - CompilationCacheTable* cache =
|
| - reinterpret_cast<CompilationCacheTable*>(obj);
|
| +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);
|
| 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.
|
| - cache->set(EntryToIndex(entry), value);
|
| - cache->set(EntryToIndex(entry) + 1, value);
|
| + cache->set(EntryToIndex(entry), *value);
|
| + cache->set(EntryToIndex(entry) + 1, *value);
|
| cache->ElementAdded();
|
| return cache;
|
| }
|
|
|
|
|
| +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();
|
| for (int entry = 0, size = Capacity(); entry < size; entry++) {
|
| int entry_index = EntryToIndex(entry);
|
|
|