| Index: src/stub-cache.cc
|
| diff --git a/src/stub-cache.cc b/src/stub-cache.cc
|
| index af1f3a12a28ca72543b1468bd38836f7e4b19f4a..f9918ed62ef46c1286f743f37584527b3a3f7349 100644
|
| --- a/src/stub-cache.cc
|
| +++ b/src/stub-cache.cc
|
| @@ -134,37 +134,40 @@ Handle<Code> StubCache::FindHandler(Handle<Name> name,
|
|
|
|
|
| Handle<Code> StubCache::ComputeMonomorphicIC(Handle<Name> name,
|
| - Handle<Object> object,
|
| + Handle<Type> type,
|
| Handle<Code> handler,
|
| StrictModeFlag strict_mode) {
|
| Code::Kind kind = handler->handler_kind();
|
| - // Use the same cache holder for the IC as for the handler.
|
| - InlineCacheHolderFlag cache_holder =
|
| - Code::ExtractCacheHolderFromFlags(handler->flags());
|
| - Handle<HeapObject> stub_holder(IC::GetCodeCacheHolder(
|
| - isolate(), *object, cache_holder));
|
| - Handle<Map> stub_holder_map(stub_holder->map());
|
| - Handle<Code> ic = FindIC(
|
| - name, stub_holder_map, kind, strict_mode, cache_holder);
|
| - if (!ic.is_null()) return ic;
|
| + InlineCacheHolderFlag flag = IC::GetCodeCacheFlag(*type);
|
| +
|
| + Handle<Map> stub_holder;
|
| + Handle<Code> ic;
|
| + // There are multiple string maps that all use the same prototype. That
|
| + // prototype cannot hold multiple handlers, one for each of the string maps,
|
| + // for a single name. Hence, turn off caching of the IC.
|
| + bool can_be_cached = !type->Is(Type::String());
|
| + if (can_be_cached) {
|
| + stub_holder = IC::GetCodeCacheHolder(flag, *type, isolate());
|
| + ic = FindIC(name, stub_holder, kind, strict_mode, flag);
|
| + if (!ic.is_null()) return ic;
|
| + }
|
|
|
| - Handle<Map> map(object->GetMarkerMap(isolate()));
|
| if (kind == Code::LOAD_IC) {
|
| - LoadStubCompiler ic_compiler(isolate(), cache_holder);
|
| - ic = ic_compiler.CompileMonomorphicIC(map, handler, name);
|
| + LoadStubCompiler ic_compiler(isolate(), flag);
|
| + ic = ic_compiler.CompileMonomorphicIC(type, handler, name);
|
| } else if (kind == Code::KEYED_LOAD_IC) {
|
| - KeyedLoadStubCompiler ic_compiler(isolate(), cache_holder);
|
| - ic = ic_compiler.CompileMonomorphicIC(map, handler, name);
|
| + KeyedLoadStubCompiler ic_compiler(isolate(), flag);
|
| + ic = ic_compiler.CompileMonomorphicIC(type, handler, name);
|
| } else if (kind == Code::STORE_IC) {
|
| StoreStubCompiler ic_compiler(isolate(), strict_mode);
|
| - ic = ic_compiler.CompileMonomorphicIC(map, handler, name);
|
| + ic = ic_compiler.CompileMonomorphicIC(type, handler, name);
|
| } else {
|
| ASSERT(kind == Code::KEYED_STORE_IC);
|
| KeyedStoreStubCompiler ic_compiler(isolate(), strict_mode, STANDARD_STORE);
|
| - ic = ic_compiler.CompileMonomorphicIC(map, handler, name);
|
| + ic = ic_compiler.CompileMonomorphicIC(type, handler, name);
|
| }
|
|
|
| - HeapObject::UpdateMapCodeCache(stub_holder, name, ic);
|
| + if (can_be_cached) Map::UpdateCodeCache(stub_holder, name, ic);
|
| return ic;
|
| }
|
|
|
| @@ -584,6 +587,7 @@ Handle<Code> StubCache::ComputeCompareNil(Handle<Map> receiver_map,
|
| }
|
|
|
|
|
| +// TODO(verwaest): Change this method so it takes in a TypeHandleList.
|
| Handle<Code> StubCache::ComputeLoadElementPolymorphic(
|
| MapHandleList* receiver_maps) {
|
| Code::Flags flags = Code::ComputeFlags(Code::KEYED_LOAD_IC, POLYMORPHIC);
|
| @@ -592,12 +596,15 @@ Handle<Code> StubCache::ComputeLoadElementPolymorphic(
|
| 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(handle(Type::Class(receiver_maps->at(i)), isolate()));
|
| + }
|
| CodeHandleList handlers(receiver_maps->length());
|
| KeyedLoadStubCompiler compiler(isolate_);
|
| compiler.CompileElementHandlers(receiver_maps, &handlers);
|
| Handle<Code> code = compiler.CompilePolymorphicIC(
|
| - receiver_maps, &handlers, factory()->empty_string(),
|
| - Code::NORMAL, ELEMENT);
|
| + &types, &handlers, factory()->empty_string(), Code::NORMAL, ELEMENT);
|
|
|
| isolate()->counters()->keyed_load_polymorphic_stubs()->Increment();
|
|
|
| @@ -606,24 +613,24 @@ Handle<Code> StubCache::ComputeLoadElementPolymorphic(
|
| }
|
|
|
|
|
| -Handle<Code> StubCache::ComputePolymorphicIC(MapHandleList* receiver_maps,
|
| +Handle<Code> StubCache::ComputePolymorphicIC(TypeHandleList* types,
|
| CodeHandleList* handlers,
|
| - int number_of_valid_maps,
|
| + int number_of_valid_types,
|
| Handle<Name> name,
|
| StrictModeFlag strict_mode) {
|
| Handle<Code> handler = handlers->at(0);
|
| Code::Kind kind = handler->handler_kind();
|
| - Code::StubType type = number_of_valid_maps == 1 ? handler->type()
|
| - : Code::NORMAL;
|
| + Code::StubType type = number_of_valid_types == 1 ? handler->type()
|
| + : Code::NORMAL;
|
| if (kind == Code::LOAD_IC) {
|
| LoadStubCompiler ic_compiler(isolate_);
|
| return ic_compiler.CompilePolymorphicIC(
|
| - receiver_maps, handlers, name, type, PROPERTY);
|
| + types, handlers, name, type, PROPERTY);
|
| } else {
|
| ASSERT(kind == Code::STORE_IC);
|
| StoreStubCompiler ic_compiler(isolate_, strict_mode);
|
| return ic_compiler.CompilePolymorphicIC(
|
| - receiver_maps, handlers, name, type, PROPERTY);
|
| + types, handlers, name, type, PROPERTY);
|
| }
|
| }
|
|
|
| @@ -1181,12 +1188,9 @@ Register StoreStubCompiler::HandlerFrontendHeader(
|
| }
|
|
|
|
|
| -bool BaseLoadStoreStubCompiler::HasHeapNumberMap(MapHandleList* receiver_maps) {
|
| - for (int i = 0; i < receiver_maps->length(); ++i) {
|
| - Handle<Map> map = receiver_maps->at(i);
|
| - if (map.is_identical_to(isolate()->factory()->heap_number_map())) {
|
| - return true;
|
| - }
|
| +bool BaseLoadStoreStubCompiler::IncludesNumberType(TypeHandleList* types) {
|
| + for (int i = 0; i < types->length(); ++i) {
|
| + if (types->at(i)->Is(Type::Number())) return true;
|
| }
|
| return false;
|
| }
|
| @@ -1353,15 +1357,15 @@ void LoadStubCompiler::GenerateLoadPostInterceptor(
|
|
|
|
|
| Handle<Code> BaseLoadStoreStubCompiler::CompileMonomorphicIC(
|
| - Handle<Map> receiver_map,
|
| + Handle<Type> type,
|
| Handle<Code> handler,
|
| Handle<Name> name) {
|
| - MapHandleList receiver_maps(1);
|
| - receiver_maps.Add(receiver_map);
|
| + TypeHandleList types(1);
|
| CodeHandleList handlers(1);
|
| + types.Add(type);
|
| handlers.Add(handler);
|
| - Code::StubType type = handler->type();
|
| - return CompilePolymorphicIC(&receiver_maps, &handlers, name, type, PROPERTY);
|
| + Code::StubType stub_type = handler->type();
|
| + return CompilePolymorphicIC(&types, &handlers, name, stub_type, PROPERTY);
|
| }
|
|
|
|
|
|
|