| Index: src/type-feedback-vector.cc
|
| diff --git a/src/type-feedback-vector.cc b/src/type-feedback-vector.cc
|
| index 04459acf1556eaa0953320d42244635dae041d9a..ac584ad8a79dcbc42200258f8887f72f502b183a 100644
|
| --- a/src/type-feedback-vector.cc
|
| +++ b/src/type-feedback-vector.cc
|
| @@ -327,50 +327,6 @@ void TypeFeedbackVector::ClearSlotsImpl(SharedFunctionInfo* shared,
|
|
|
|
|
| // static
|
| -void TypeFeedbackVector::ClearAllKeyedStoreICs(Isolate* isolate) {
|
| - SharedFunctionInfo::Iterator iterator(isolate);
|
| - SharedFunctionInfo* shared;
|
| - while ((shared = iterator.Next())) {
|
| - if (!shared->OptimizedCodeMapIsCleared()) {
|
| - FixedArray* optimized_code_map = shared->optimized_code_map();
|
| - int length = optimized_code_map->length();
|
| - for (int i = SharedFunctionInfo::kEntriesStart; i < length;
|
| - i += SharedFunctionInfo::kEntryLength) {
|
| - WeakCell* cell = WeakCell::cast(
|
| - optimized_code_map->get(i + SharedFunctionInfo::kLiteralsOffset));
|
| - if (cell->value()->IsLiteralsArray()) {
|
| - TypeFeedbackVector* vector =
|
| - LiteralsArray::cast(cell->value())->feedback_vector();
|
| - vector->ClearKeyedStoreICs(shared);
|
| - }
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -
|
| -void TypeFeedbackVector::ClearKeyedStoreICs(SharedFunctionInfo* shared) {
|
| - Isolate* isolate = GetIsolate();
|
| -
|
| - Code* host = shared->code();
|
| - Object* uninitialized_sentinel =
|
| - TypeFeedbackVector::RawUninitializedSentinel(isolate);
|
| -
|
| - TypeFeedbackMetadataIterator iter(metadata());
|
| - while (iter.HasNext()) {
|
| - FeedbackVectorSlot slot = iter.Next();
|
| - FeedbackVectorSlotKind kind = iter.kind();
|
| - if (kind != FeedbackVectorSlotKind::KEYED_STORE_IC) continue;
|
| - Object* obj = Get(slot);
|
| - if (obj != uninitialized_sentinel) {
|
| - KeyedStoreICNexus nexus(this, slot);
|
| - nexus.Clear(host);
|
| - }
|
| - }
|
| -}
|
| -
|
| -
|
| -// static
|
| Handle<TypeFeedbackVector> TypeFeedbackVector::DummyVector(Isolate* isolate) {
|
| return isolate->factory()->dummy_vector();
|
| }
|
| @@ -760,10 +716,9 @@ void KeyedStoreICNexus::ConfigurePolymorphic(Handle<Name> name,
|
| InstallHandlers(array, maps, handlers);
|
| }
|
|
|
| -
|
| void KeyedStoreICNexus::ConfigurePolymorphic(MapHandleList* maps,
|
| MapHandleList* transitioned_maps,
|
| - CodeHandleList* handlers) {
|
| + List<Handle<Object>>* handlers) {
|
| int receiver_count = maps->length();
|
| DCHECK(receiver_count > 1);
|
| Handle<FixedArray> array = EnsureArrayOfSize(receiver_count * 3);
|
| @@ -960,7 +915,14 @@ KeyedAccessStoreMode KeyedStoreICNexus::GetKeyedAccessStoreMode() const {
|
| FindHandlers(&handlers, maps.length());
|
| for (int i = 0; i < handlers.length(); i++) {
|
| // The first handler that isn't the slow handler will have the bits we need.
|
| - Handle<Code> handler = Handle<Code>::cast(handlers.at(i));
|
| + Handle<Object> maybe_code_handler = handlers.at(i);
|
| + Handle<Code> handler;
|
| + if (maybe_code_handler->IsTuple2()) {
|
| + Handle<Tuple2> data_handler = Handle<Tuple2>::cast(maybe_code_handler);
|
| + handler = handle(Code::cast(data_handler->value2()));
|
| + } else {
|
| + handler = Handle<Code>::cast(maybe_code_handler);
|
| + }
|
| CodeStub::Major major_key = CodeStub::MajorKeyFromKey(handler->stub_key());
|
| uint32_t minor_key = CodeStub::MinorKeyFromKey(handler->stub_key());
|
| CHECK(major_key == CodeStub::KeyedStoreSloppyArguments ||
|
|
|