Chromium Code Reviews| Index: src/ic/handler-compiler.cc |
| diff --git a/src/ic/handler-compiler.cc b/src/ic/handler-compiler.cc |
| index 6993c753662d04fc6fe2a95eaba1ed4717952327..9240fe7dc744fe1d8f3bccfdaea489185c387faf 100644 |
| --- a/src/ic/handler-compiler.cc |
| +++ b/src/ic/handler-compiler.cc |
| @@ -576,44 +576,49 @@ Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback( |
| #undef __ |
| +// static |
| +Handle<Code> ElementHandlerCompiler::GetKeyedLoadHandler( |
|
Jakob Kummerow
2016/07/26 14:43:28
This unifies the loop body of CompileElementHandle
Igor Sheludko
2016/07/26 16:25:11
Acknowledged.
|
| + Handle<Map> receiver_map, Isolate* isolate) { |
| + if (receiver_map->has_indexed_interceptor() && |
| + !receiver_map->GetIndexedInterceptor()->getter()->IsUndefined(isolate) && |
| + !receiver_map->GetIndexedInterceptor()->non_masking()) { |
| + TRACE_HANDLER_STATS(isolate, KeyedLoadIC_LoadIndexedInterceptorStub); |
| + return LoadIndexedInterceptorStub(isolate).GetCode(); |
| + } |
| + if (receiver_map->IsStringMap()) { |
| + TRACE_HANDLER_STATS(isolate, KeyedLoadIC_LoadIndexedStringStub); |
| + return LoadIndexedStringStub(isolate).GetCode(); |
| + } |
| + InstanceType instance_type = receiver_map->instance_type(); |
| + if (instance_type < FIRST_JS_RECEIVER_TYPE) { |
|
Igor Sheludko
2016/07/26 16:25:11
TRACE_HANDLER_STATS(isolate(), KeyedLoadIC_SlowStu
Jakob Kummerow
2016/07/26 17:10:39
Done.
|
| + return isolate->builtins()->KeyedLoadIC_Slow(); |
| + } |
| + |
| + ElementsKind elements_kind = receiver_map->elements_kind(); |
| + if (IsSloppyArgumentsElements(elements_kind)) { |
| + TRACE_HANDLER_STATS(isolate, KeyedLoadIC_KeyedLoadSloppyArgumentsStub); |
| + return KeyedLoadSloppyArgumentsStub(isolate).GetCode(); |
| + } |
| + if (elements_kind == DICTIONARY_ELEMENTS) { |
| + TRACE_HANDLER_STATS(isolate, KeyedLoadIC_LoadDictionaryElementStub); |
| + return LoadDictionaryElementStub(isolate).GetCode(); |
| + } |
| + DCHECK(IsFastElementsKind(elements_kind) || |
| + IsFixedTypedArrayElementsKind(elements_kind)); |
| + bool is_js_array = instance_type == JS_ARRAY_TYPE; |
| + bool convert_hole_to_undefined = |
| + is_js_array && elements_kind == FAST_HOLEY_ELEMENTS && |
| + *receiver_map == isolate->get_initial_js_array_map(elements_kind); |
| + TRACE_HANDLER_STATS(isolate, KeyedLoadIC_LoadFastElementStub); |
| + return LoadFastElementStub(isolate, is_js_array, elements_kind, |
| + convert_hole_to_undefined) |
| + .GetCode(); |
| +} |
| + |
| void ElementHandlerCompiler::CompileElementHandlers( |
| MapHandleList* receiver_maps, List<Handle<Object>>* handlers) { |
| for (int i = 0; i < receiver_maps->length(); ++i) { |
| - Handle<Map> receiver_map = receiver_maps->at(i); |
| - Handle<Code> cached_stub; |
| - |
| - if (receiver_map->IsStringMap()) { |
| - cached_stub = LoadIndexedStringStub(isolate()).GetCode(); |
| - } else if (receiver_map->instance_type() < FIRST_JS_RECEIVER_TYPE) { |
| - cached_stub = isolate()->builtins()->KeyedLoadIC_Slow(); |
| - } else { |
| - bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE; |
| - ElementsKind elements_kind = receiver_map->elements_kind(); |
| - |
| - // No need to check for an elements-free prototype chain here, the |
| - // generated stub code needs to check that dynamically anyway. |
| - bool convert_hole_to_undefined = |
| - (is_js_array && elements_kind == FAST_HOLEY_ELEMENTS && |
| - *receiver_map == isolate()->get_initial_js_array_map(elements_kind)); |
| - |
| - if (receiver_map->has_indexed_interceptor() && |
| - !receiver_map->GetIndexedInterceptor()->getter()->IsUndefined( |
| - isolate()) && |
| - !receiver_map->GetIndexedInterceptor()->non_masking()) { |
| - cached_stub = LoadIndexedInterceptorStub(isolate()).GetCode(); |
| - } else if (IsSloppyArgumentsElements(elements_kind)) { |
| - cached_stub = KeyedLoadSloppyArgumentsStub(isolate()).GetCode(); |
| - } else if (IsFastElementsKind(elements_kind) || |
| - IsFixedTypedArrayElementsKind(elements_kind)) { |
| - cached_stub = LoadFastElementStub(isolate(), is_js_array, elements_kind, |
| - convert_hole_to_undefined).GetCode(); |
| - } else { |
| - DCHECK(elements_kind == DICTIONARY_ELEMENTS); |
| - cached_stub = LoadDictionaryElementStub(isolate()).GetCode(); |
| - } |
| - } |
| - |
| - handlers->Add(cached_stub); |
| + handlers->Add(GetKeyedLoadHandler(receiver_maps->at(i), isolate())); |
| } |
| } |
| } // namespace internal |