summaryrefslogtreecommitdiff
path: root/deps/v8/src/feedback-vector.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/feedback-vector.cc')
-rw-r--r--deps/v8/src/feedback-vector.cc130
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() {