diff options
Diffstat (limited to 'deps/v8/src/feedback-vector.cc')
-rw-r--r-- | deps/v8/src/feedback-vector.cc | 130 |
1 files changed, 68 insertions, 62 deletions
diff --git a/deps/v8/src/feedback-vector.cc b/deps/v8/src/feedback-vector.cc index 90ae08b0ba..eaea7a978c 100644 --- a/deps/v8/src/feedback-vector.cc +++ b/deps/v8/src/feedback-vector.cc @@ -42,7 +42,7 @@ bool FeedbackVectorSpec::HasTypeProfileSlot() const { static bool IsPropertyNameFeedback(MaybeObject* feedback) { HeapObject* heap_object; - if (!feedback->ToStrongHeapObject(&heap_object)) return false; + if (!feedback->GetHeapObjectIfStrong(&heap_object)) return false; if (heap_object->IsString()) return true; if (!heap_object->IsSymbol()) return false; Symbol* symbol = Symbol::cast(heap_object); @@ -331,7 +331,7 @@ void FeedbackVector::EvictOptimizedCodeMarkedForDeoptimization( return; } - if (slot->IsClearedWeakHeapObject()) { + if (slot->IsCleared()) { ClearOptimizationMarker(); return; } @@ -373,7 +373,7 @@ bool FeedbackVector::ClearSlots(Isolate* isolate) { void FeedbackVector::AssertNoLegacyTypes(MaybeObject* object) { #ifdef DEBUG HeapObject* heap_object; - if (object->ToStrongOrWeakHeapObject(&heap_object)) { + if (object->GetHeapObject(&heap_object)) { // Instead of FixedArray, the Feedback and the Extra should contain // WeakFixedArrays. The only allowed FixedArray subtype is HashTable. DCHECK_IMPLIES(heap_object->IsFixedArray(), heap_object->IsHashTable()); @@ -384,7 +384,7 @@ void FeedbackVector::AssertNoLegacyTypes(MaybeObject* object) { Handle<WeakFixedArray> FeedbackNexus::EnsureArrayOfSize(int length) { Isolate* isolate = GetIsolate(); HeapObject* heap_object; - if (GetFeedback()->ToStrongHeapObject(&heap_object) && + if (GetFeedback()->GetHeapObjectIfStrong(&heap_object) && heap_object->IsWeakFixedArray() && WeakFixedArray::cast(heap_object)->length() == length) { return handle(WeakFixedArray::cast(heap_object), isolate); @@ -397,7 +397,7 @@ Handle<WeakFixedArray> FeedbackNexus::EnsureArrayOfSize(int length) { Handle<WeakFixedArray> FeedbackNexus::EnsureExtraArrayOfSize(int length) { Isolate* isolate = GetIsolate(); HeapObject* heap_object; - if (GetFeedbackExtra()->ToStrongHeapObject(&heap_object) && + if (GetFeedbackExtra()->GetHeapObjectIfStrong(&heap_object) && heap_object->IsWeakFixedArray() && WeakFixedArray::cast(heap_object)->length() == length) { return handle(WeakFixedArray::cast(heap_object), isolate); @@ -546,10 +546,11 @@ InlineCacheState FeedbackNexus::StateFromFeedback() const { switch (kind()) { case FeedbackSlotKind::kCreateClosure: + return MONOMORPHIC; + case FeedbackSlotKind::kLiteral: - // CreateClosure and literal slots don't have a notion of state. - UNREACHABLE(); - break; + if (feedback->IsSmi()) return UNINITIALIZED; + return MONOMORPHIC; case FeedbackSlotKind::kStoreGlobalSloppy: case FeedbackSlotKind::kStoreGlobalStrict: @@ -557,9 +558,9 @@ InlineCacheState FeedbackNexus::StateFromFeedback() const { case FeedbackSlotKind::kLoadGlobalInsideTypeof: { if (feedback->IsSmi()) return MONOMORPHIC; - DCHECK(feedback->IsWeakOrClearedHeapObject()); + DCHECK(feedback->IsWeakOrCleared()); MaybeObject* extra = GetFeedbackExtra(); - if (!feedback->IsClearedWeakHeapObject() || + if (!feedback->IsCleared() || extra != MaybeObject::FromObject( *FeedbackVector::UninitializedSentinel(isolate))) { return MONOMORPHIC; @@ -587,12 +588,12 @@ InlineCacheState FeedbackNexus::StateFromFeedback() const { *FeedbackVector::PremonomorphicSentinel(isolate))) { return PREMONOMORPHIC; } - if (feedback->IsWeakOrClearedHeapObject()) { + if (feedback->IsWeakOrCleared()) { // Don't check if the map is cleared. return MONOMORPHIC; } HeapObject* heap_object; - if (feedback->ToStrongHeapObject(&heap_object)) { + if (feedback->GetHeapObjectIfStrong(&heap_object)) { if (heap_object->IsWeakFixedArray()) { // Determine state purely by our structure, don't check if the maps // are cleared. @@ -600,7 +601,7 @@ InlineCacheState FeedbackNexus::StateFromFeedback() const { } if (heap_object->IsName()) { DCHECK(IsKeyedLoadICKind(kind()) || IsKeyedStoreICKind(kind())); - Object* extra = GetFeedbackExtra()->ToStrongHeapObject(); + Object* extra = GetFeedbackExtra()->GetHeapObjectAssumeStrong(); WeakFixedArray* extra_array = WeakFixedArray::cast(extra); return extra_array->length() > 2 ? POLYMORPHIC : MONOMORPHIC; } @@ -612,8 +613,8 @@ InlineCacheState FeedbackNexus::StateFromFeedback() const { if (feedback == MaybeObject::FromObject( *FeedbackVector::MegamorphicSentinel(isolate))) { return GENERIC; - } else if (feedback->IsWeakOrClearedHeapObject() || - (feedback->ToStrongHeapObject(&heap_object) && + } else if (feedback->IsWeakOrCleared() || + (feedback->GetHeapObjectIfStrong(&heap_object) && heap_object->IsAllocationSite())) { return MONOMORPHIC; } @@ -666,7 +667,7 @@ InlineCacheState FeedbackNexus::StateFromFeedback() const { if (feedback == MaybeObject::FromObject( *FeedbackVector::UninitializedSentinel(isolate))) { return UNINITIALIZED; - } else if (feedback->IsWeakOrClearedHeapObject()) { + } else if (feedback->IsWeakOrCleared()) { // Don't check if the map is cleared. return MONOMORPHIC; } @@ -690,11 +691,11 @@ InlineCacheState FeedbackNexus::StateFromFeedback() const { *FeedbackVector::MegamorphicSentinel(isolate))) { return MEGAMORPHIC; } - if (feedback->IsWeakOrClearedHeapObject()) { + if (feedback->IsWeakOrCleared()) { return MONOMORPHIC; } - DCHECK(feedback->ToStrongHeapObject()->IsWeakFixedArray()); + DCHECK(feedback->GetHeapObjectAssumeStrong()->IsWeakFixedArray()); return POLYMORPHIC; } @@ -744,7 +745,7 @@ void FeedbackNexus::ConfigureCloneObject(Handle<Map> source_map, Handle<Map> result_map) { Isolate* isolate = GetIsolate(); MaybeObject* maybe_feedback = GetFeedback(); - Handle<HeapObject> feedback(maybe_feedback->IsStrongOrWeakHeapObject() + Handle<HeapObject> feedback(maybe_feedback->IsStrongOrWeak() ? maybe_feedback->GetHeapObject() : nullptr, isolate); @@ -755,8 +756,7 @@ void FeedbackNexus::ConfigureCloneObject(Handle<Map> source_map, SetFeedbackExtra(*result_map); break; case MONOMORPHIC: - if (maybe_feedback->IsClearedWeakHeapObject() || - feedback.is_identical_to(source_map) || + if (maybe_feedback->IsCleared() || feedback.is_identical_to(source_map) || Map::cast(*feedback)->is_deprecated()) { // Remain in MONOMORPHIC state if previous feedback has been collected. SetFeedback(HeapObjectReference::Weak(*source_map)); @@ -779,7 +779,7 @@ void FeedbackNexus::ConfigureCloneObject(Handle<Map> source_map, int i = 0; for (; i < array->length(); i += kCloneObjectPolymorphicEntrySize) { MaybeObject* feedback = array->Get(i); - if (feedback->IsClearedWeakHeapObject()) break; + if (feedback->IsCleared()) break; Handle<Map> cached_map(Map::cast(feedback->GetHeapObject()), isolate); if (cached_map.is_identical_to(source_map) || cached_map->is_deprecated()) @@ -818,7 +818,7 @@ void FeedbackNexus::ConfigureCloneObject(Handle<Map> source_map, int FeedbackNexus::GetCallCount() { DCHECK(IsCallICKind(kind())); - Object* call_count = GetFeedbackExtra()->ToObject(); + Object* call_count = GetFeedbackExtra()->cast<Object>(); CHECK(call_count->IsSmi()); uint32_t value = static_cast<uint32_t>(Smi::ToInt(call_count)); return CallCountField::decode(value); @@ -827,7 +827,7 @@ int FeedbackNexus::GetCallCount() { void FeedbackNexus::SetSpeculationMode(SpeculationMode mode) { DCHECK(IsCallICKind(kind())); - Object* call_count = GetFeedbackExtra()->ToObject(); + Object* call_count = GetFeedbackExtra()->cast<Object>(); CHECK(call_count->IsSmi()); uint32_t count = static_cast<uint32_t>(Smi::ToInt(call_count)); uint32_t value = CallCountField::encode(CallCountField::decode(count)); @@ -838,7 +838,7 @@ void FeedbackNexus::SetSpeculationMode(SpeculationMode mode) { SpeculationMode FeedbackNexus::GetSpeculationMode() { DCHECK(IsCallICKind(kind())); - Object* call_count = GetFeedbackExtra()->ToObject(); + Object* call_count = GetFeedbackExtra()->cast<Object>(); CHECK(call_count->IsSmi()); uint32_t value = static_cast<uint32_t>(Smi::ToInt(call_count)); return SpeculationModeField::decode(value); @@ -910,35 +910,36 @@ int FeedbackNexus::ExtractMaps(MapHandles* maps) const { MaybeObject* feedback = GetFeedback(); bool is_named_feedback = IsPropertyNameFeedback(feedback); HeapObject* heap_object; - if ((feedback->ToStrongHeapObject(&heap_object) && + if ((feedback->GetHeapObjectIfStrong(&heap_object) && heap_object->IsWeakFixedArray()) || is_named_feedback) { int found = 0; WeakFixedArray* array; if (is_named_feedback) { - array = WeakFixedArray::cast(GetFeedbackExtra()->ToStrongHeapObject()); + array = + WeakFixedArray::cast(GetFeedbackExtra()->GetHeapObjectAssumeStrong()); } else { array = WeakFixedArray::cast(heap_object); } const int increment = 2; HeapObject* heap_object; for (int i = 0; i < array->length(); i += increment) { - DCHECK(array->Get(i)->IsWeakOrClearedHeapObject()); - if (array->Get(i)->ToWeakHeapObject(&heap_object)) { + DCHECK(array->Get(i)->IsWeakOrCleared()); + if (array->Get(i)->GetHeapObjectIfWeak(&heap_object)) { Map* map = Map::cast(heap_object); maps->push_back(handle(map, isolate)); found++; } } return found; - } else if (feedback->ToWeakHeapObject(&heap_object)) { + } else if (feedback->GetHeapObjectIfWeak(&heap_object)) { Map* map = Map::cast(heap_object); maps->push_back(handle(map, isolate)); return 1; - } else if (feedback->ToStrongHeapObject(&heap_object) && + } else if (feedback->GetHeapObjectIfStrong(&heap_object) && heap_object == heap_object->GetReadOnlyRoots().premonomorphic_symbol()) { - if (GetFeedbackExtra()->ToWeakHeapObject(&heap_object)) { + if (GetFeedbackExtra()->GetHeapObjectIfWeak(&heap_object)) { Map* map = Map::cast(heap_object); maps->push_back(handle(map, isolate)); return 1; @@ -957,32 +958,32 @@ MaybeObjectHandle FeedbackNexus::FindHandlerForMap(Handle<Map> map) const { Isolate* isolate = GetIsolate(); bool is_named_feedback = IsPropertyNameFeedback(feedback); HeapObject* heap_object; - if ((feedback->ToStrongHeapObject(&heap_object) && + if ((feedback->GetHeapObjectIfStrong(&heap_object) && heap_object->IsWeakFixedArray()) || is_named_feedback) { WeakFixedArray* array; if (is_named_feedback) { - array = WeakFixedArray::cast(GetFeedbackExtra()->ToStrongHeapObject()); + array = + WeakFixedArray::cast(GetFeedbackExtra()->GetHeapObjectAssumeStrong()); } else { array = WeakFixedArray::cast(heap_object); } const int increment = 2; HeapObject* heap_object; for (int i = 0; i < array->length(); i += increment) { - DCHECK(array->Get(i)->IsWeakOrClearedHeapObject()); - if (array->Get(i)->ToWeakHeapObject(&heap_object)) { + DCHECK(array->Get(i)->IsWeakOrCleared()); + if (array->Get(i)->GetHeapObjectIfWeak(&heap_object)) { Map* array_map = Map::cast(heap_object); - if (array_map == *map && - !array->Get(i + increment - 1)->IsClearedWeakHeapObject()) { + if (array_map == *map && !array->Get(i + increment - 1)->IsCleared()) { MaybeObject* handler = array->Get(i + increment - 1); DCHECK(IC::IsHandler(handler)); return handle(handler, isolate); } } } - } else if (feedback->ToWeakHeapObject(&heap_object)) { + } else if (feedback->GetHeapObjectIfWeak(&heap_object)) { Map* cell_map = Map::cast(heap_object); - if (cell_map == *map && !GetFeedbackExtra()->IsClearedWeakHeapObject()) { + if (cell_map == *map && !GetFeedbackExtra()->IsCleared()) { MaybeObject* handler = GetFeedbackExtra(); DCHECK(IC::IsHandler(handler)); return handle(handler, isolate); @@ -1004,12 +1005,13 @@ bool FeedbackNexus::FindHandlers(MaybeObjectHandles* code_list, int count = 0; bool is_named_feedback = IsPropertyNameFeedback(feedback); HeapObject* heap_object; - if ((feedback->ToStrongHeapObject(&heap_object) && + if ((feedback->GetHeapObjectIfStrong(&heap_object) && heap_object->IsWeakFixedArray()) || is_named_feedback) { WeakFixedArray* array; if (is_named_feedback) { - array = WeakFixedArray::cast(GetFeedbackExtra()->ToStrongHeapObject()); + array = + WeakFixedArray::cast(GetFeedbackExtra()->GetHeapObjectAssumeStrong()); } else { array = WeakFixedArray::cast(heap_object); } @@ -1017,18 +1019,18 @@ bool FeedbackNexus::FindHandlers(MaybeObjectHandles* code_list, HeapObject* heap_object; for (int i = 0; i < array->length(); i += increment) { // Be sure to skip handlers whose maps have been cleared. - DCHECK(array->Get(i)->IsWeakOrClearedHeapObject()); - if (array->Get(i)->ToWeakHeapObject(&heap_object) && - !array->Get(i + increment - 1)->IsClearedWeakHeapObject()) { + DCHECK(array->Get(i)->IsWeakOrCleared()); + if (array->Get(i)->GetHeapObjectIfWeak(&heap_object) && + !array->Get(i + increment - 1)->IsCleared()) { MaybeObject* handler = array->Get(i + increment - 1); DCHECK(IC::IsHandler(handler)); code_list->push_back(handle(handler, isolate)); count++; } } - } else if (feedback->ToWeakHeapObject(&heap_object)) { + } else if (feedback->GetHeapObjectIfWeak(&heap_object)) { MaybeObject* extra = GetFeedbackExtra(); - if (!extra->IsClearedWeakHeapObject()) { + if (!extra->IsCleared()) { DCHECK(IC::IsHandler(extra)); code_list->push_back(handle(extra, isolate)); count++; @@ -1041,7 +1043,7 @@ Name* FeedbackNexus::FindFirstName() const { if (IsKeyedStoreICKind(kind()) || IsKeyedLoadICKind(kind())) { MaybeObject* feedback = GetFeedback(); if (IsPropertyNameFeedback(feedback)) { - return Name::cast(feedback->ToStrongHeapObject()); + return Name::cast(feedback->GetHeapObjectAssumeStrong()); } } return nullptr; @@ -1115,32 +1117,33 @@ IcCheckType FeedbackNexus::GetKeyType() const { MaybeObject* feedback = GetFeedback(); if (feedback == MaybeObject::FromObject( *FeedbackVector::MegamorphicSentinel(GetIsolate()))) { - return static_cast<IcCheckType>(Smi::ToInt(GetFeedbackExtra()->ToObject())); + return static_cast<IcCheckType>( + Smi::ToInt(GetFeedbackExtra()->cast<Object>())); } return IsPropertyNameFeedback(feedback) ? PROPERTY : ELEMENT; } BinaryOperationHint FeedbackNexus::GetBinaryOperationFeedback() const { DCHECK_EQ(kind(), FeedbackSlotKind::kBinaryOp); - int feedback = Smi::ToInt(GetFeedback()->ToSmi()); + int feedback = Smi::ToInt(GetFeedback()->cast<Smi>()); return BinaryOperationHintFromFeedback(feedback); } CompareOperationHint FeedbackNexus::GetCompareOperationFeedback() const { DCHECK_EQ(kind(), FeedbackSlotKind::kCompareOp); - int feedback = Smi::ToInt(GetFeedback()->ToSmi()); + int feedback = Smi::ToInt(GetFeedback()->cast<Smi>()); return CompareOperationHintFromFeedback(feedback); } ForInHint FeedbackNexus::GetForInFeedback() const { DCHECK_EQ(kind(), FeedbackSlotKind::kForIn); - int feedback = Smi::ToInt(GetFeedback()->ToSmi()); + int feedback = Smi::ToInt(GetFeedback()->cast<Smi>()); return ForInHintFromFeedback(feedback); } Handle<FeedbackCell> FeedbackNexus::GetFeedbackCell() const { DCHECK_EQ(FeedbackSlotKind::kCreateClosure, kind()); - return handle(FeedbackCell::cast(GetFeedback()->ToObject()), + return handle(FeedbackCell::cast(GetFeedback()->cast<Object>()), vector()->GetIsolate()); } @@ -1149,7 +1152,7 @@ MaybeHandle<JSObject> FeedbackNexus::GetConstructorFeedback() const { Isolate* isolate = GetIsolate(); MaybeObject* feedback = GetFeedback(); HeapObject* heap_object; - if (feedback->ToWeakHeapObject(&heap_object)) { + if (feedback->GetHeapObjectIfWeak(&heap_object)) { return handle(JSObject::cast(heap_object), isolate); } return MaybeHandle<JSObject>(); @@ -1182,8 +1185,9 @@ void FeedbackNexus::Collect(Handle<String> type, int position) { *FeedbackVector::UninitializedSentinel(isolate))) { types = SimpleNumberDictionary::New(isolate, 1); } else { - types = handle(SimpleNumberDictionary::cast(feedback->ToStrongHeapObject()), - isolate); + types = handle( + SimpleNumberDictionary::cast(feedback->GetHeapObjectAssumeStrong()), + isolate); } Handle<ArrayList> position_specific_types; @@ -1220,7 +1224,8 @@ std::vector<int> FeedbackNexus::GetSourcePositions() const { } Handle<SimpleNumberDictionary> types( - SimpleNumberDictionary::cast(feedback->ToStrongHeapObject()), isolate); + SimpleNumberDictionary::cast(feedback->GetHeapObjectAssumeStrong()), + isolate); for (int index = SimpleNumberDictionary::kElementsStartIndex; index < types->length(); index += SimpleNumberDictionary::kEntrySize) { @@ -1247,7 +1252,8 @@ std::vector<Handle<String>> FeedbackNexus::GetTypesForSourcePositions( } Handle<SimpleNumberDictionary> types( - SimpleNumberDictionary::cast(feedback->ToStrongHeapObject()), isolate); + SimpleNumberDictionary::cast(feedback->GetHeapObjectAssumeStrong()), + isolate); int entry = types->FindEntry(isolate, position); if (entry == SimpleNumberDictionary::kNotFound) { @@ -1305,10 +1311,10 @@ JSObject* FeedbackNexus::GetTypeProfile() const { return *isolate->factory()->NewJSObject(isolate->object_function()); } - return *ConvertToJSObject( - isolate, - handle(SimpleNumberDictionary::cast(feedback->ToStrongHeapObject()), - isolate)); + return *ConvertToJSObject(isolate, + handle(SimpleNumberDictionary::cast( + feedback->GetHeapObjectAssumeStrong()), + isolate)); } void FeedbackNexus::ResetTypeProfile() { |