Index: src/stub-cache.cc |
diff --git a/src/stub-cache.cc b/src/stub-cache.cc |
index 841f838ba5a1f2685e888ff4ff49746e61b6e951..cbd248a98052bb5ba6960e6d501d634ae8240b24 100644 |
--- a/src/stub-cache.cc |
+++ b/src/stub-cache.cc |
@@ -57,7 +57,8 @@ static Code::Flags CommonStubCacheChecks(Name* name, Map* map, |
Code* StubCache::Set(Name* name, Map* map, Code* code) { |
- Code::Flags flags = CommonStubCacheChecks(name, map, code->flags(), heap()); |
+ Code::Flags flags = |
+ CommonStubCacheChecks(name, map, code->flags(), isolate()->heap()); |
// Compute the primary entry. |
int primary_offset = PrimaryOffset(name, flags, map); |
@@ -86,7 +87,7 @@ Code* StubCache::Set(Name* name, Map* map, Code* code) { |
Code* StubCache::Get(Name* name, Map* map, Code::Flags flags) { |
- flags = CommonStubCacheChecks(name, map, flags, heap()); |
+ flags = CommonStubCacheChecks(name, map, flags, isolate()->heap()); |
int primary_offset = PrimaryOffset(name, flags, map); |
Entry* primary = entry(primary_, primary_offset); |
if (primary->key == name && primary->map == map) { |
@@ -128,14 +129,12 @@ Handle<Code> PropertyHandlerCompiler::Find(Handle<Name> name, |
} |
-Handle<Code> StubCache::ComputeMonomorphicIC( |
- Code::Kind kind, |
- Handle<Name> name, |
- Handle<HeapType> type, |
- Handle<Code> handler, |
- ExtraICState extra_ic_state) { |
+Handle<Code> PropertyICCompiler::ComputeMonomorphicIC( |
+ Code::Kind kind, Handle<Name> name, Handle<HeapType> type, |
+ Handle<Code> handler, ExtraICState extra_ic_state) { |
CacheHolderFlag flag; |
- Handle<Map> stub_holder = IC::GetICCacheHolder(*type, isolate(), &flag); |
+ Isolate* isolate = name->GetIsolate(); |
+ Handle<Map> stub_holder = IC::GetICCacheHolder(*type, isolate, &flag); |
Handle<Code> ic; |
// There are multiple string maps that all use the same prototype. That |
@@ -143,8 +142,7 @@ Handle<Code> StubCache::ComputeMonomorphicIC( |
// for a single name. Hence, turn off caching of the IC. |
bool can_be_cached = !type->Is(HeapType::String()); |
if (can_be_cached) { |
- ic = |
- PropertyICCompiler::Find(name, stub_holder, kind, extra_ic_state, flag); |
+ ic = Find(name, stub_holder, kind, extra_ic_state, flag); |
if (!ic.is_null()) return ic; |
} |
@@ -155,7 +153,7 @@ Handle<Code> StubCache::ComputeMonomorphicIC( |
} |
#endif |
- PropertyICCompiler ic_compiler(isolate(), kind, extra_ic_state, flag); |
+ PropertyICCompiler ic_compiler(isolate, kind, extra_ic_state, flag); |
ic = ic_compiler.CompileMonomorphic(type, handler, name, PROPERTY); |
if (can_be_cached) Map::UpdateCodeCache(stub_holder, name, ic); |
@@ -163,9 +161,10 @@ Handle<Code> StubCache::ComputeMonomorphicIC( |
} |
-Handle<Code> StubCache::ComputeLoadNonexistent(Handle<Name> name, |
- Handle<HeapType> type) { |
- Handle<Map> receiver_map = IC::TypeToMap(*type, isolate()); |
+Handle<Code> NamedLoadHandlerCompiler::ComputeLoadNonexistent( |
+ Handle<Name> name, Handle<HeapType> type) { |
+ Isolate* isolate = name->GetIsolate(); |
+ Handle<Map> receiver_map = IC::TypeToMap(*type, isolate); |
if (receiver_map->prototype()->IsNull()) { |
// TODO(jkummerow/verwaest): If there is no prototype and the property |
// is nonexistent, introduce a builtin to handle this (fast properties |
@@ -174,7 +173,7 @@ Handle<Code> StubCache::ComputeLoadNonexistent(Handle<Name> name, |
} |
CacheHolderFlag flag; |
Handle<Map> stub_holder_map = |
- IC::GetHandlerCacheHolder(*type, false, isolate(), &flag); |
+ IC::GetHandlerCacheHolder(*type, false, isolate, &flag); |
// If no dictionary mode objects are present in the prototype chain, the load |
// nonexistent IC stub can be shared for all names for a given map and we use |
@@ -184,7 +183,7 @@ Handle<Code> StubCache::ComputeLoadNonexistent(Handle<Name> name, |
Handle<Name> cache_name = |
receiver_map->is_dictionary_map() |
? name |
- : Handle<Name>::cast(isolate()->factory()->nonexistent_symbol()); |
+ : Handle<Name>::cast(isolate->factory()->nonexistent_symbol()); |
Handle<Map> current_map = stub_holder_map; |
Handle<JSObject> last(JSObject::cast(receiver_map->prototype())); |
while (true) { |
@@ -199,19 +198,20 @@ Handle<Code> StubCache::ComputeLoadNonexistent(Handle<Name> name, |
cache_name, stub_holder_map, Code::LOAD_IC, flag, Code::FAST); |
if (!handler.is_null()) return handler; |
- NamedLoadHandlerCompiler compiler(isolate_, flag); |
+ NamedLoadHandlerCompiler compiler(isolate, flag); |
handler = compiler.CompileLoadNonexistent(type, last, cache_name); |
Map::UpdateCodeCache(stub_holder_map, cache_name, handler); |
return handler; |
} |
-Handle<Code> StubCache::ComputeKeyedLoadElement(Handle<Map> receiver_map) { |
+Handle<Code> PropertyICCompiler::ComputeKeyedLoadElement( |
+ Handle<Map> receiver_map) { |
+ Isolate* isolate = receiver_map->GetIsolate(); |
Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC); |
- Handle<Name> name = |
- isolate()->factory()->KeyedLoadElementMonomorphic_string(); |
+ Handle<Name> name = isolate->factory()->KeyedLoadElementMonomorphic_string(); |
- Handle<Object> probe(receiver_map->FindInCodeCache(*name, flags), isolate_); |
+ Handle<Object> probe(receiver_map->FindInCodeCache(*name, flags), isolate); |
if (probe->IsCode()) return Handle<Code>::cast(probe); |
ElementsKind elements_kind = receiver_map->elements_kind(); |
@@ -220,27 +220,27 @@ Handle<Code> StubCache::ComputeKeyedLoadElement(Handle<Map> receiver_map) { |
receiver_map->has_external_array_elements() || |
receiver_map->has_fixed_typed_array_elements()) { |
stub = KeyedLoadFastElementStub( |
- isolate(), receiver_map->instance_type() == JS_ARRAY_TYPE, |
+ isolate, receiver_map->instance_type() == JS_ARRAY_TYPE, |
elements_kind).GetCode(); |
} else { |
stub = FLAG_compiled_keyed_dictionary_loads |
- ? KeyedLoadDictionaryElementStub(isolate()).GetCode() |
- : KeyedLoadDictionaryElementPlatformStub(isolate()).GetCode(); |
+ ? KeyedLoadDictionaryElementStub(isolate).GetCode() |
+ : KeyedLoadDictionaryElementPlatformStub(isolate).GetCode(); |
} |
- PropertyICCompiler compiler(isolate(), Code::KEYED_LOAD_IC); |
+ PropertyICCompiler compiler(isolate, Code::KEYED_LOAD_IC); |
Handle<Code> code = |
- compiler.CompileMonomorphic(HeapType::Class(receiver_map, isolate()), |
- stub, factory()->empty_string(), ELEMENT); |
+ compiler.CompileMonomorphic(HeapType::Class(receiver_map, isolate), stub, |
+ isolate->factory()->empty_string(), ELEMENT); |
Map::UpdateCodeCache(receiver_map, name, code); |
return code; |
} |
-Handle<Code> StubCache::ComputeKeyedStoreElement( |
- Handle<Map> receiver_map, |
- StrictMode strict_mode, |
+Handle<Code> PropertyICCompiler::ComputeKeyedStoreElement( |
+ Handle<Map> receiver_map, StrictMode strict_mode, |
KeyedAccessStoreMode store_mode) { |
+ Isolate* isolate = receiver_map->GetIsolate(); |
ExtraICState extra_state = |
KeyedStoreIC::ComputeExtraICState(strict_mode, store_mode); |
Code::Flags flags = |
@@ -252,11 +252,11 @@ Handle<Code> StubCache::ComputeKeyedStoreElement( |
store_mode == STORE_NO_TRANSITION_HANDLE_COW); |
Handle<String> name = |
- isolate()->factory()->KeyedStoreElementMonomorphic_string(); |
- Handle<Object> probe(receiver_map->FindInCodeCache(*name, flags), isolate_); |
+ isolate->factory()->KeyedStoreElementMonomorphic_string(); |
+ Handle<Object> probe(receiver_map->FindInCodeCache(*name, flags), isolate); |
if (probe->IsCode()) return Handle<Code>::cast(probe); |
- PropertyICCompiler compiler(isolate(), Code::KEYED_STORE_IC, extra_state); |
+ PropertyICCompiler compiler(isolate, Code::KEYED_STORE_IC, extra_state); |
Handle<Code> code = |
compiler.CompileIndexedStoreMonomorphic(receiver_map, store_mode); |
@@ -278,11 +278,13 @@ static void FillCache(Isolate* isolate, Handle<Code> code) { |
} |
-Code* StubCache::FindPreMonomorphicIC(Code::Kind kind, ExtraICState state) { |
+Code* PropertyICCompiler::FindPreMonomorphicIC(Isolate* isolate, |
+ Code::Kind kind, |
+ ExtraICState state) { |
Code::Flags flags = Code::ComputeFlags(kind, PREMONOMORPHIC, state); |
UnseededNumberDictionary* dictionary = |
- isolate()->heap()->non_monomorphic_cache(); |
- int entry = dictionary->FindEntry(isolate(), flags); |
+ isolate->heap()->non_monomorphic_cache(); |
+ int entry = dictionary->FindEntry(isolate, flags); |
ASSERT(entry != -1); |
Object* code = dictionary->ValueAt(entry); |
// This might be called during the marking phase of the collector |
@@ -291,15 +293,16 @@ Code* StubCache::FindPreMonomorphicIC(Code::Kind kind, ExtraICState state) { |
} |
-Handle<Code> StubCache::ComputeLoad(InlineCacheState ic_state, |
- ExtraICState extra_state) { |
+Handle<Code> PropertyICCompiler::ComputeLoad(Isolate* isolate, |
+ InlineCacheState ic_state, |
+ ExtraICState extra_state) { |
Code::Flags flags = Code::ComputeFlags(Code::LOAD_IC, ic_state, extra_state); |
Handle<UnseededNumberDictionary> cache = |
- isolate_->factory()->non_monomorphic_cache(); |
- int entry = cache->FindEntry(isolate_, flags); |
+ isolate->factory()->non_monomorphic_cache(); |
+ int entry = cache->FindEntry(isolate, flags); |
if (entry != -1) return Handle<Code>(Code::cast(cache->ValueAt(entry))); |
- PropertyICCompiler compiler(isolate_, Code::LOAD_IC); |
+ PropertyICCompiler compiler(isolate, Code::LOAD_IC); |
Handle<Code> code; |
if (ic_state == UNINITIALIZED) { |
code = compiler.CompileLoadInitialize(flags); |
@@ -310,20 +313,21 @@ Handle<Code> StubCache::ComputeLoad(InlineCacheState ic_state, |
} else { |
UNREACHABLE(); |
} |
- FillCache(isolate_, code); |
+ FillCache(isolate, code); |
return code; |
} |
-Handle<Code> StubCache::ComputeStore(InlineCacheState ic_state, |
- ExtraICState extra_state) { |
+Handle<Code> PropertyICCompiler::ComputeStore(Isolate* isolate, |
+ InlineCacheState ic_state, |
+ ExtraICState extra_state) { |
Code::Flags flags = Code::ComputeFlags(Code::STORE_IC, ic_state, extra_state); |
Handle<UnseededNumberDictionary> cache = |
- isolate_->factory()->non_monomorphic_cache(); |
- int entry = cache->FindEntry(isolate_, flags); |
+ isolate->factory()->non_monomorphic_cache(); |
+ int entry = cache->FindEntry(isolate, flags); |
if (entry != -1) return Handle<Code>(Code::cast(cache->ValueAt(entry))); |
- PropertyICCompiler compiler(isolate_, Code::STORE_IC); |
+ PropertyICCompiler compiler(isolate, Code::STORE_IC); |
Handle<Code> code; |
if (ic_state == UNINITIALIZED) { |
code = compiler.CompileStoreInitialize(flags); |
@@ -337,22 +341,23 @@ Handle<Code> StubCache::ComputeStore(InlineCacheState ic_state, |
UNREACHABLE(); |
} |
- FillCache(isolate_, code); |
+ FillCache(isolate, code); |
return code; |
} |
-Handle<Code> StubCache::ComputeCompareNil(Handle<Map> receiver_map, |
- CompareNilICStub* stub) { |
- Handle<String> name(isolate_->heap()->empty_string()); |
+Handle<Code> PropertyICCompiler::ComputeCompareNil(Handle<Map> receiver_map, |
+ CompareNilICStub* stub) { |
+ Isolate* isolate = receiver_map->GetIsolate(); |
+ Handle<String> name(isolate->heap()->empty_string()); |
if (!receiver_map->is_shared()) { |
- Handle<Code> cached_ic = PropertyICCompiler::Find( |
- name, receiver_map, Code::COMPARE_NIL_IC, stub->GetExtraICState()); |
+ Handle<Code> cached_ic = |
+ Find(name, receiver_map, Code::COMPARE_NIL_IC, stub->GetExtraICState()); |
if (!cached_ic.is_null()) return cached_ic; |
} |
Code::FindAndReplacePattern pattern; |
- pattern.Add(isolate_->factory()->meta_map(), receiver_map); |
+ pattern.Add(isolate->factory()->meta_map(), receiver_map); |
Handle<Code> ic = stub->GetCodeCopy(pattern); |
if (!receiver_map->is_shared()) { |
@@ -364,58 +369,55 @@ Handle<Code> StubCache::ComputeCompareNil(Handle<Map> receiver_map, |
// TODO(verwaest): Change this method so it takes in a TypeHandleList. |
-Handle<Code> StubCache::ComputeLoadElementPolymorphic( |
+Handle<Code> PropertyICCompiler::ComputeLoadElementPolymorphic( |
MapHandleList* receiver_maps) { |
+ Isolate* isolate = receiver_maps->at(0)->GetIsolate(); |
Code::Flags flags = Code::ComputeFlags(Code::KEYED_LOAD_IC, POLYMORPHIC); |
Handle<PolymorphicCodeCache> cache = |
- isolate_->factory()->polymorphic_code_cache(); |
+ isolate->factory()->polymorphic_code_cache(); |
Handle<Object> probe = cache->Lookup(receiver_maps, flags); |
if (probe->IsCode()) return Handle<Code>::cast(probe); |
TypeHandleList types(receiver_maps->length()); |
for (int i = 0; i < receiver_maps->length(); i++) { |
- types.Add(HeapType::Class(receiver_maps->at(i), isolate())); |
+ types.Add(HeapType::Class(receiver_maps->at(i), isolate)); |
} |
CodeHandleList handlers(receiver_maps->length()); |
- IndexedHandlerCompiler compiler(isolate_); |
+ IndexedHandlerCompiler compiler(isolate); |
compiler.CompileElementHandlers(receiver_maps, &handlers); |
- PropertyICCompiler ic_compiler(isolate_, Code::KEYED_LOAD_IC); |
+ PropertyICCompiler ic_compiler(isolate, Code::KEYED_LOAD_IC); |
Handle<Code> code = ic_compiler.CompilePolymorphic( |
- &types, &handlers, factory()->empty_string(), Code::NORMAL, ELEMENT); |
+ &types, &handlers, isolate->factory()->empty_string(), Code::NORMAL, |
+ ELEMENT); |
- isolate()->counters()->keyed_load_polymorphic_stubs()->Increment(); |
+ isolate->counters()->keyed_load_polymorphic_stubs()->Increment(); |
PolymorphicCodeCache::Update(cache, receiver_maps, flags, code); |
return code; |
} |
-Handle<Code> StubCache::ComputePolymorphicIC( |
- Code::Kind kind, |
- TypeHandleList* types, |
- CodeHandleList* handlers, |
- int number_of_valid_types, |
- Handle<Name> name, |
- ExtraICState extra_ic_state) { |
+Handle<Code> PropertyICCompiler::ComputePolymorphicIC( |
+ Code::Kind kind, TypeHandleList* types, CodeHandleList* handlers, |
+ int valid_types, Handle<Name> name, ExtraICState extra_ic_state) { |
Handle<Code> handler = handlers->at(0); |
- Code::StubType type = number_of_valid_types == 1 ? handler->type() |
- : Code::NORMAL; |
+ Code::StubType type = valid_types == 1 ? handler->type() : Code::NORMAL; |
ASSERT(kind == Code::LOAD_IC || kind == Code::STORE_IC); |
- PropertyICCompiler ic_compiler(isolate_, kind, extra_ic_state); |
+ PropertyICCompiler ic_compiler(name->GetIsolate(), kind, extra_ic_state); |
return ic_compiler.CompilePolymorphic(types, handlers, name, type, PROPERTY); |
} |
-Handle<Code> StubCache::ComputeStoreElementPolymorphic( |
- MapHandleList* receiver_maps, |
- KeyedAccessStoreMode store_mode, |
+Handle<Code> PropertyICCompiler::ComputeStoreElementPolymorphic( |
+ MapHandleList* receiver_maps, KeyedAccessStoreMode store_mode, |
StrictMode strict_mode) { |
+ Isolate* isolate = receiver_maps->at(0)->GetIsolate(); |
ASSERT(store_mode == STANDARD_STORE || |
store_mode == STORE_AND_GROW_NO_TRANSITION || |
store_mode == STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS || |
store_mode == STORE_NO_TRANSITION_HANDLE_COW); |
Handle<PolymorphicCodeCache> cache = |
- isolate_->factory()->polymorphic_code_cache(); |
+ isolate->factory()->polymorphic_code_cache(); |
ExtraICState extra_state = KeyedStoreIC::ComputeExtraICState( |
strict_mode, store_mode); |
Code::Flags flags = |
@@ -423,7 +425,7 @@ Handle<Code> StubCache::ComputeStoreElementPolymorphic( |
Handle<Object> probe = cache->Lookup(receiver_maps, flags); |
if (probe->IsCode()) return Handle<Code>::cast(probe); |
- PropertyICCompiler compiler(isolate_, Code::KEYED_STORE_IC, extra_state); |
+ PropertyICCompiler compiler(isolate, Code::KEYED_STORE_IC, extra_state); |
Handle<Code> code = |
compiler.CompileIndexedStorePolymorphic(receiver_maps, store_mode); |
PolymorphicCodeCache::Update(cache, receiver_maps, flags, code); |
@@ -434,12 +436,12 @@ Handle<Code> StubCache::ComputeStoreElementPolymorphic( |
void StubCache::Clear() { |
Code* empty = isolate_->builtins()->builtin(Builtins::kIllegal); |
for (int i = 0; i < kPrimaryTableSize; i++) { |
- primary_[i].key = heap()->empty_string(); |
+ primary_[i].key = isolate()->heap()->empty_string(); |
primary_[i].map = NULL; |
primary_[i].value = empty; |
} |
for (int j = 0; j < kSecondaryTableSize; j++) { |
- secondary_[j].key = heap()->empty_string(); |
+ secondary_[j].key = isolate()->heap()->empty_string(); |
secondary_[j].map = NULL; |
secondary_[j].value = empty; |
} |
@@ -525,11 +527,11 @@ RUNTIME_FUNCTION(StoreCallbackProperty) { |
* provide any value for the given name. |
*/ |
RUNTIME_FUNCTION(LoadPropertyWithInterceptorOnly) { |
- ASSERT(args.length() == StubCache::kInterceptorArgsLength); |
+ ASSERT(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength); |
Handle<Name> name_handle = |
- args.at<Name>(StubCache::kInterceptorArgsNameIndex); |
- Handle<InterceptorInfo> interceptor_info = |
- args.at<InterceptorInfo>(StubCache::kInterceptorArgsInfoIndex); |
+ args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex); |
+ Handle<InterceptorInfo> interceptor_info = args.at<InterceptorInfo>( |
+ NamedLoadHandlerCompiler::kInterceptorArgsInfoIndex); |
// TODO(rossberg): Support symbols in the API. |
if (name_handle->IsSymbol()) |
@@ -542,9 +544,9 @@ RUNTIME_FUNCTION(LoadPropertyWithInterceptorOnly) { |
ASSERT(getter != NULL); |
Handle<JSObject> receiver = |
- args.at<JSObject>(StubCache::kInterceptorArgsThisIndex); |
+ args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex); |
Handle<JSObject> holder = |
- args.at<JSObject>(StubCache::kInterceptorArgsHolderIndex); |
+ args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex); |
PropertyCallbackArguments callback_args( |
isolate, interceptor_info->data(), *receiver, *holder); |
{ |
@@ -588,13 +590,13 @@ static Object* ThrowReferenceError(Isolate* isolate, Name* name) { |
*/ |
RUNTIME_FUNCTION(LoadPropertyWithInterceptor) { |
HandleScope scope(isolate); |
- ASSERT(args.length() == StubCache::kInterceptorArgsLength); |
+ ASSERT(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength); |
Handle<Name> name = |
- args.at<Name>(StubCache::kInterceptorArgsNameIndex); |
+ args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex); |
Handle<JSObject> receiver = |
- args.at<JSObject>(StubCache::kInterceptorArgsThisIndex); |
+ args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex); |
Handle<JSObject> holder = |
- args.at<JSObject>(StubCache::kInterceptorArgsHolderIndex); |
+ args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex); |
Handle<Object> result; |
LookupIterator it(receiver, name, holder); |