OLD | NEW |
---|---|
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/type-feedback-vector.h" | 5 #include "src/type-feedback-vector.h" |
6 | 6 |
7 #include "src/code-stubs.h" | 7 #include "src/code-stubs.h" |
8 #include "src/ic/ic-inl.h" | 8 #include "src/ic/ic-inl.h" |
9 #include "src/ic/ic-state.h" | 9 #include "src/ic/ic-state.h" |
10 #include "src/objects.h" | 10 #include "src/objects.h" |
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
320 case FeedbackVectorSlotKind::KINDS_NUMBER: | 320 case FeedbackVectorSlotKind::KINDS_NUMBER: |
321 UNREACHABLE(); | 321 UNREACHABLE(); |
322 break; | 322 break; |
323 } | 323 } |
324 } | 324 } |
325 } | 325 } |
326 } | 326 } |
327 | 327 |
328 | 328 |
329 // static | 329 // static |
330 void TypeFeedbackVector::ClearAllKeyedStoreICs(Isolate* isolate) { | |
Jakob Kummerow
2016/11/28 18:48:05
\o/
Igor Sheludko
2016/11/28 22:25:54
:)
| |
331 SharedFunctionInfo::Iterator iterator(isolate); | |
332 SharedFunctionInfo* shared; | |
333 while ((shared = iterator.Next())) { | |
334 if (!shared->OptimizedCodeMapIsCleared()) { | |
335 FixedArray* optimized_code_map = shared->optimized_code_map(); | |
336 int length = optimized_code_map->length(); | |
337 for (int i = SharedFunctionInfo::kEntriesStart; i < length; | |
338 i += SharedFunctionInfo::kEntryLength) { | |
339 WeakCell* cell = WeakCell::cast( | |
340 optimized_code_map->get(i + SharedFunctionInfo::kLiteralsOffset)); | |
341 if (cell->value()->IsLiteralsArray()) { | |
342 TypeFeedbackVector* vector = | |
343 LiteralsArray::cast(cell->value())->feedback_vector(); | |
344 vector->ClearKeyedStoreICs(shared); | |
345 } | |
346 } | |
347 } | |
348 } | |
349 } | |
350 | |
351 | |
352 void TypeFeedbackVector::ClearKeyedStoreICs(SharedFunctionInfo* shared) { | |
353 Isolate* isolate = GetIsolate(); | |
354 | |
355 Code* host = shared->code(); | |
356 Object* uninitialized_sentinel = | |
357 TypeFeedbackVector::RawUninitializedSentinel(isolate); | |
358 | |
359 TypeFeedbackMetadataIterator iter(metadata()); | |
360 while (iter.HasNext()) { | |
361 FeedbackVectorSlot slot = iter.Next(); | |
362 FeedbackVectorSlotKind kind = iter.kind(); | |
363 if (kind != FeedbackVectorSlotKind::KEYED_STORE_IC) continue; | |
364 Object* obj = Get(slot); | |
365 if (obj != uninitialized_sentinel) { | |
366 KeyedStoreICNexus nexus(this, slot); | |
367 nexus.Clear(host); | |
368 } | |
369 } | |
370 } | |
371 | |
372 | |
373 // static | |
374 Handle<TypeFeedbackVector> TypeFeedbackVector::DummyVector(Isolate* isolate) { | 330 Handle<TypeFeedbackVector> TypeFeedbackVector::DummyVector(Isolate* isolate) { |
375 return isolate->factory()->dummy_vector(); | 331 return isolate->factory()->dummy_vector(); |
376 } | 332 } |
377 | 333 |
378 | 334 |
379 Handle<FixedArray> FeedbackNexus::EnsureArrayOfSize(int length) { | 335 Handle<FixedArray> FeedbackNexus::EnsureArrayOfSize(int length) { |
380 Isolate* isolate = GetIsolate(); | 336 Isolate* isolate = GetIsolate(); |
381 Handle<Object> feedback = handle(GetFeedback(), isolate); | 337 Handle<Object> feedback = handle(GetFeedback(), isolate); |
382 if (!feedback->IsFixedArray() || | 338 if (!feedback->IsFixedArray() || |
383 FixedArray::cast(*feedback)->length() != length) { | 339 FixedArray::cast(*feedback)->length() != length) { |
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
753 SetFeedbackExtra(*TypeFeedbackVector::UninitializedSentinel(GetIsolate()), | 709 SetFeedbackExtra(*TypeFeedbackVector::UninitializedSentinel(GetIsolate()), |
754 SKIP_WRITE_BARRIER); | 710 SKIP_WRITE_BARRIER); |
755 } else { | 711 } else { |
756 array = EnsureExtraArrayOfSize(receiver_count * 2); | 712 array = EnsureExtraArrayOfSize(receiver_count * 2); |
757 SetFeedback(*name); | 713 SetFeedback(*name); |
758 } | 714 } |
759 | 715 |
760 InstallHandlers(array, maps, handlers); | 716 InstallHandlers(array, maps, handlers); |
761 } | 717 } |
762 | 718 |
763 | |
764 void KeyedStoreICNexus::ConfigurePolymorphic(MapHandleList* maps, | 719 void KeyedStoreICNexus::ConfigurePolymorphic(MapHandleList* maps, |
765 MapHandleList* transitioned_maps, | 720 MapHandleList* transitioned_maps, |
766 CodeHandleList* handlers) { | 721 List<Handle<Object>>* handlers) { |
767 int receiver_count = maps->length(); | 722 int receiver_count = maps->length(); |
768 DCHECK(receiver_count > 1); | 723 DCHECK(receiver_count > 1); |
769 Handle<FixedArray> array = EnsureArrayOfSize(receiver_count * 3); | 724 Handle<FixedArray> array = EnsureArrayOfSize(receiver_count * 3); |
770 SetFeedbackExtra(*TypeFeedbackVector::UninitializedSentinel(GetIsolate()), | 725 SetFeedbackExtra(*TypeFeedbackVector::UninitializedSentinel(GetIsolate()), |
771 SKIP_WRITE_BARRIER); | 726 SKIP_WRITE_BARRIER); |
772 | 727 |
773 Handle<Oddball> undefined_value = GetIsolate()->factory()->undefined_value(); | 728 Handle<Oddball> undefined_value = GetIsolate()->factory()->undefined_value(); |
774 for (int i = 0; i < receiver_count; ++i) { | 729 for (int i = 0; i < receiver_count; ++i) { |
775 Handle<Map> map = maps->at(i); | 730 Handle<Map> map = maps->at(i); |
776 Handle<WeakCell> cell = Map::WeakCellForMap(map); | 731 Handle<WeakCell> cell = Map::WeakCellForMap(map); |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
953 KeyedAccessStoreMode mode = STANDARD_STORE; | 908 KeyedAccessStoreMode mode = STANDARD_STORE; |
954 MapHandleList maps; | 909 MapHandleList maps; |
955 List<Handle<Object>> handlers; | 910 List<Handle<Object>> handlers; |
956 | 911 |
957 if (GetKeyType() == PROPERTY) return mode; | 912 if (GetKeyType() == PROPERTY) return mode; |
958 | 913 |
959 ExtractMaps(&maps); | 914 ExtractMaps(&maps); |
960 FindHandlers(&handlers, maps.length()); | 915 FindHandlers(&handlers, maps.length()); |
961 for (int i = 0; i < handlers.length(); i++) { | 916 for (int i = 0; i < handlers.length(); i++) { |
962 // The first handler that isn't the slow handler will have the bits we need. | 917 // The first handler that isn't the slow handler will have the bits we need. |
963 Handle<Code> handler = Handle<Code>::cast(handlers.at(i)); | 918 Handle<Object> maybe_code_handler = handlers.at(i); |
919 Handle<Code> handler; | |
920 if (maybe_code_handler->IsTuple2()) { | |
921 Handle<Tuple2> data_handler = Handle<Tuple2>::cast(maybe_code_handler); | |
922 handler = handle(Code::cast(data_handler->value2())); | |
923 } else { | |
924 handler = Handle<Code>::cast(maybe_code_handler); | |
925 } | |
964 CodeStub::Major major_key = CodeStub::MajorKeyFromKey(handler->stub_key()); | 926 CodeStub::Major major_key = CodeStub::MajorKeyFromKey(handler->stub_key()); |
965 uint32_t minor_key = CodeStub::MinorKeyFromKey(handler->stub_key()); | 927 uint32_t minor_key = CodeStub::MinorKeyFromKey(handler->stub_key()); |
966 CHECK(major_key == CodeStub::KeyedStoreSloppyArguments || | 928 CHECK(major_key == CodeStub::KeyedStoreSloppyArguments || |
967 major_key == CodeStub::StoreFastElement || | 929 major_key == CodeStub::StoreFastElement || |
968 major_key == CodeStub::StoreElement || | 930 major_key == CodeStub::StoreElement || |
969 major_key == CodeStub::ElementsTransitionAndStore || | 931 major_key == CodeStub::ElementsTransitionAndStore || |
970 major_key == CodeStub::NoCache); | 932 major_key == CodeStub::NoCache); |
971 if (major_key != CodeStub::NoCache) { | 933 if (major_key != CodeStub::NoCache) { |
972 mode = CommonStoreModeBits::decode(minor_key); | 934 mode = CommonStoreModeBits::decode(minor_key); |
973 break; | 935 break; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1020 return BinaryOperationHintFromFeedback(feedback); | 982 return BinaryOperationHintFromFeedback(feedback); |
1021 } | 983 } |
1022 | 984 |
1023 CompareOperationHint CompareICNexus::GetCompareOperationFeedback() const { | 985 CompareOperationHint CompareICNexus::GetCompareOperationFeedback() const { |
1024 int feedback = Smi::cast(GetFeedback())->value(); | 986 int feedback = Smi::cast(GetFeedback())->value(); |
1025 return CompareOperationHintFromFeedback(feedback); | 987 return CompareOperationHintFromFeedback(feedback); |
1026 } | 988 } |
1027 | 989 |
1028 } // namespace internal | 990 } // namespace internal |
1029 } // namespace v8 | 991 } // namespace v8 |
OLD | NEW |