| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/ic/ic.h" | 5 #include "src/ic/ic.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/api-arguments-inl.h" | 8 #include "src/api-arguments-inl.h" |
| 9 #include "src/api.h" | 9 #include "src/api.h" |
| 10 #include "src/arguments.h" | 10 #include "src/arguments.h" |
| (...skipping 945 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 956 } | 956 } |
| 957 } | 957 } |
| 958 } | 958 } |
| 959 if (code.is_null()) code = ComputeHandler(lookup); | 959 if (code.is_null()) code = ComputeHandler(lookup); |
| 960 } | 960 } |
| 961 | 961 |
| 962 PatchCache(lookup->name(), code); | 962 PatchCache(lookup->name(), code); |
| 963 TRACE_IC("LoadIC", lookup->name()); | 963 TRACE_IC("LoadIC", lookup->name()); |
| 964 } | 964 } |
| 965 | 965 |
| 966 StubCache* IC::stub_cache() { |
| 967 switch (kind()) { |
| 968 case Code::LOAD_IC: |
| 969 case Code::KEYED_LOAD_IC: |
| 970 return isolate()->load_stub_cache(); |
| 971 |
| 972 case Code::STORE_IC: |
| 973 case Code::KEYED_STORE_IC: |
| 974 return isolate()->store_stub_cache(); |
| 975 |
| 976 default: |
| 977 break; |
| 978 } |
| 979 UNREACHABLE(); |
| 980 return nullptr; |
| 981 } |
| 966 | 982 |
| 967 void IC::UpdateMegamorphicCache(Map* map, Name* name, Code* code) { | 983 void IC::UpdateMegamorphicCache(Map* map, Name* name, Code* code) { |
| 968 isolate()->stub_cache()->Set(name, map, code); | 984 stub_cache()->Set(name, map, code); |
| 969 } | 985 } |
| 970 | 986 |
| 971 | 987 |
| 972 Handle<Code> IC::ComputeHandler(LookupIterator* lookup, Handle<Object> value) { | 988 Handle<Code> IC::ComputeHandler(LookupIterator* lookup, Handle<Object> value) { |
| 973 // Try to find a globally shared handler stub. | 989 // Try to find a globally shared handler stub. |
| 974 Handle<Code> code = GetMapIndependentHandler(lookup); | 990 Handle<Code> code = GetMapIndependentHandler(lookup); |
| 975 if (!code.is_null()) return code; | 991 if (!code.is_null()) return code; |
| 976 | 992 |
| 977 // Otherwise check the map's handler cache for a map-specific handler, and | 993 // Otherwise check the map's handler cache for a map-specific handler, and |
| 978 // compile one if the cache comes up empty. | 994 // compile one if the cache comes up empty. |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1002 TRACE_HANDLER_STATS(isolate(), IC_HandlerCacheHit); | 1018 TRACE_HANDLER_STATS(isolate(), IC_HandlerCacheHit); |
| 1003 return code; | 1019 return code; |
| 1004 } | 1020 } |
| 1005 } else { | 1021 } else { |
| 1006 // maybe_handler_ is only populated for MONOMORPHIC and POLYMORPHIC ICs. | 1022 // maybe_handler_ is only populated for MONOMORPHIC and POLYMORPHIC ICs. |
| 1007 // In MEGAMORPHIC case, check if the handler in the megamorphic stub | 1023 // In MEGAMORPHIC case, check if the handler in the megamorphic stub |
| 1008 // cache (which just missed) is different from the cached handler. | 1024 // cache (which just missed) is different from the cached handler. |
| 1009 if (state() == MEGAMORPHIC && lookup->GetReceiver()->IsHeapObject()) { | 1025 if (state() == MEGAMORPHIC && lookup->GetReceiver()->IsHeapObject()) { |
| 1010 Map* map = Handle<HeapObject>::cast(lookup->GetReceiver())->map(); | 1026 Map* map = Handle<HeapObject>::cast(lookup->GetReceiver())->map(); |
| 1011 Code* megamorphic_cached_code = | 1027 Code* megamorphic_cached_code = |
| 1012 isolate()->stub_cache()->Get(*lookup->name(), map, code->flags()); | 1028 stub_cache()->Get(*lookup->name(), map, code->flags()); |
| 1013 if (megamorphic_cached_code != *code) { | 1029 if (megamorphic_cached_code != *code) { |
| 1014 TRACE_HANDLER_STATS(isolate(), IC_HandlerCacheHit); | 1030 TRACE_HANDLER_STATS(isolate(), IC_HandlerCacheHit); |
| 1015 return code; | 1031 return code; |
| 1016 } | 1032 } |
| 1017 } else { | 1033 } else { |
| 1018 TRACE_HANDLER_STATS(isolate(), IC_HandlerCacheHit); | 1034 TRACE_HANDLER_STATS(isolate(), IC_HandlerCacheHit); |
| 1019 return code; | 1035 return code; |
| 1020 } | 1036 } |
| 1021 } | 1037 } |
| 1022 } | 1038 } |
| (...skipping 1969 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2992 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, | 3008 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, |
| 2993 vector->GetKind(vector_slot)); | 3009 vector->GetKind(vector_slot)); |
| 2994 KeyedLoadICNexus nexus(vector, vector_slot); | 3010 KeyedLoadICNexus nexus(vector, vector_slot); |
| 2995 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 3011 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
| 2996 ic.UpdateState(receiver, key); | 3012 ic.UpdateState(receiver, key); |
| 2997 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key)); | 3013 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key)); |
| 2998 } | 3014 } |
| 2999 } | 3015 } |
| 3000 } // namespace internal | 3016 } // namespace internal |
| 3001 } // namespace v8 | 3017 } // namespace v8 |
| OLD | NEW |