| Index: src/ic/ic-compiler.cc
|
| diff --git a/src/ic/ic-compiler.cc b/src/ic/ic-compiler.cc
|
| index f69a1f43a344f93ddd47dd2b9a06cd4b5d03dc3f..08e0fa6e5aeafad78cce828b700d120ef887cd8d 100644
|
| --- a/src/ic/ic-compiler.cc
|
| +++ b/src/ic/ic-compiler.cc
|
| @@ -25,30 +25,30 @@ Handle<Code> PropertyICCompiler::Find(Handle<Name> name,
|
| }
|
|
|
|
|
| -bool PropertyICCompiler::IncludesNumberType(TypeHandleList* types) {
|
| - for (int i = 0; i < types->length(); ++i) {
|
| - if (types->at(i)->Is(HeapType::Number())) return true;
|
| +bool PropertyICCompiler::IncludesNumberMap(MapHandleList* maps) {
|
| + for (int i = 0; i < maps->length(); ++i) {
|
| + if (maps->at(i)->instance_type() == HEAP_NUMBER_TYPE) return true;
|
| }
|
| return false;
|
| }
|
|
|
|
|
| -Handle<Code> PropertyICCompiler::CompileMonomorphic(Handle<HeapType> type,
|
| +Handle<Code> PropertyICCompiler::CompileMonomorphic(Handle<Map> map,
|
| Handle<Code> handler,
|
| Handle<Name> name,
|
| IcCheckType check) {
|
| - TypeHandleList types(1);
|
| + MapHandleList maps(1);
|
| CodeHandleList handlers(1);
|
| - types.Add(type);
|
| + maps.Add(map);
|
| handlers.Add(handler);
|
| Code::StubType stub_type = handler->type();
|
| - return CompilePolymorphic(&types, &handlers, name, stub_type, check);
|
| + return CompilePolymorphic(&maps, &handlers, name, stub_type, check);
|
| }
|
|
|
|
|
| Handle<Code> PropertyICCompiler::ComputeMonomorphic(
|
| - Code::Kind kind, Handle<Name> name, Handle<HeapType> type,
|
| - Handle<Code> handler, ExtraICState extra_ic_state) {
|
| + Code::Kind kind, Handle<Name> name, Handle<Map> map, Handle<Code> handler,
|
| + ExtraICState extra_ic_state) {
|
| Isolate* isolate = name->GetIsolate();
|
| if (handler.is_identical_to(isolate->builtins()->LoadIC_Normal()) ||
|
| handler.is_identical_to(isolate->builtins()->StoreIC_Normal())) {
|
| @@ -56,7 +56,7 @@ Handle<Code> PropertyICCompiler::ComputeMonomorphic(
|
| }
|
|
|
| CacheHolderFlag flag;
|
| - Handle<Map> stub_holder = IC::GetICCacheHolder(*type, isolate, &flag);
|
| + Handle<Map> stub_holder = IC::GetICCacheHolder(map, isolate, &flag);
|
| if (kind == Code::KEYED_STORE_IC) {
|
| // Always set the "property" bit.
|
| extra_ic_state =
|
| @@ -72,14 +72,14 @@ Handle<Code> PropertyICCompiler::ComputeMonomorphic(
|
| // 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(HeapType::String());
|
| + bool can_be_cached = map->instance_type() >= FIRST_NONSTRING_TYPE;
|
| if (can_be_cached) {
|
| ic = Find(name, stub_holder, kind, extra_ic_state, flag);
|
| if (!ic.is_null()) return ic;
|
| }
|
|
|
| PropertyICCompiler ic_compiler(isolate, kind, extra_ic_state, flag);
|
| - ic = ic_compiler.CompileMonomorphic(type, handler, name, PROPERTY);
|
| + ic = ic_compiler.CompileMonomorphic(map, handler, name, PROPERTY);
|
|
|
| if (can_be_cached) Map::UpdateCodeCache(stub_holder, name, ic);
|
| return ic;
|
| @@ -98,9 +98,8 @@ Handle<Code> PropertyICCompiler::ComputeKeyedLoadMonomorphic(
|
|
|
| Handle<Code> stub = ComputeKeyedLoadMonomorphicHandler(receiver_map);
|
| PropertyICCompiler compiler(isolate, Code::KEYED_LOAD_IC);
|
| - Handle<Code> code =
|
| - compiler.CompileMonomorphic(HeapType::Class(receiver_map, isolate), stub,
|
| - isolate->factory()->empty_string(), ELEMENT);
|
| + Handle<Code> code = compiler.CompileMonomorphic(
|
| + receiver_map, stub, isolate->factory()->empty_string(), ELEMENT);
|
|
|
| Map::UpdateCodeCache(receiver_map, name, code);
|
| return code;
|
| @@ -256,7 +255,6 @@ Handle<Code> PropertyICCompiler::ComputeCompareNil(Handle<Map> receiver_map,
|
| }
|
|
|
|
|
| -// TODO(verwaest): Change this method so it takes in a TypeHandleList.
|
| Handle<Code> PropertyICCompiler::ComputeKeyedLoadPolymorphic(
|
| MapHandleList* receiver_maps) {
|
| Isolate* isolate = receiver_maps->at(0)->GetIsolate();
|
| @@ -267,17 +265,13 @@ Handle<Code> PropertyICCompiler::ComputeKeyedLoadPolymorphic(
|
| 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));
|
| - }
|
| CodeHandleList handlers(receiver_maps->length());
|
| ElementHandlerCompiler compiler(isolate);
|
| compiler.CompileElementHandlers(receiver_maps, &handlers);
|
| PropertyICCompiler ic_compiler(isolate, Code::KEYED_LOAD_IC);
|
| Handle<Code> code = ic_compiler.CompilePolymorphic(
|
| - &types, &handlers, isolate->factory()->empty_string(), Code::NORMAL,
|
| - ELEMENT);
|
| + receiver_maps, &handlers, isolate->factory()->empty_string(),
|
| + Code::NORMAL, ELEMENT);
|
|
|
| isolate->counters()->keyed_load_polymorphic_stubs()->Increment();
|
|
|
| @@ -287,13 +281,13 @@ Handle<Code> PropertyICCompiler::ComputeKeyedLoadPolymorphic(
|
|
|
|
|
| Handle<Code> PropertyICCompiler::ComputePolymorphic(
|
| - Code::Kind kind, TypeHandleList* types, CodeHandleList* handlers,
|
| - int valid_types, Handle<Name> name, ExtraICState extra_ic_state) {
|
| + Code::Kind kind, MapHandleList* maps, CodeHandleList* handlers,
|
| + int valid_maps, Handle<Name> name, ExtraICState extra_ic_state) {
|
| Handle<Code> handler = handlers->at(0);
|
| - Code::StubType type = valid_types == 1 ? handler->type() : Code::NORMAL;
|
| + Code::StubType type = valid_maps == 1 ? handler->type() : Code::NORMAL;
|
| DCHECK(kind == Code::LOAD_IC || kind == Code::STORE_IC);
|
| PropertyICCompiler ic_compiler(name->GetIsolate(), kind, extra_ic_state);
|
| - return ic_compiler.CompilePolymorphic(types, handlers, name, type, PROPERTY);
|
| + return ic_compiler.CompilePolymorphic(maps, handlers, name, type, PROPERTY);
|
| }
|
|
|
|
|
|
|