Revert "Revert "Upgrade to 5.0.71.48"" DO NOT MERGE
This reverts commit f2e3994fa5148cc3d9946666f0b0596290192b0e,
and updates the x64 makefile properly so it doesn't break that
build.
FPIIM-449
Change-Id: Ib83e35bfbae6af627451c926a9650ec57c045605
(cherry picked from commit 109988c7ccb6f3fd1a58574fa3dfb88beaef6632)
diff --git a/src/type-feedback-vector.cc b/src/type-feedback-vector.cc
index 698f2a6..4519bd6 100644
--- a/src/type-feedback-vector.cc
+++ b/src/type-feedback-vector.cc
@@ -15,8 +15,13 @@
static bool IsPropertyNameFeedback(Object* feedback) {
- return feedback->IsString() ||
- (feedback->IsSymbol() && !Symbol::cast(feedback)->is_private());
+ if (feedback->IsString()) return true;
+ if (!feedback->IsSymbol()) return false;
+ Symbol* symbol = Symbol::cast(feedback);
+ Heap* heap = symbol->GetHeap();
+ return symbol != heap->uninitialized_symbol() &&
+ symbol != heap->premonomorphic_symbol() &&
+ symbol != heap->megamorphic_symbol();
}
@@ -335,6 +340,10 @@
void FeedbackNexus::ConfigureMegamorphic() {
+ // Keyed ICs must use ConfigureMegamorphicKeyed.
+ DCHECK_NE(FeedbackVectorSlotKind::KEYED_LOAD_IC, vector()->GetKind(slot()));
+ DCHECK_NE(FeedbackVectorSlotKind::KEYED_STORE_IC, vector()->GetKind(slot()));
+
Isolate* isolate = GetIsolate();
SetFeedback(*TypeFeedbackVector::MegamorphicSentinel(isolate),
SKIP_WRITE_BARRIER);
@@ -342,6 +351,21 @@
SKIP_WRITE_BARRIER);
}
+void KeyedLoadICNexus::ConfigureMegamorphicKeyed(IcCheckType property_type) {
+ Isolate* isolate = GetIsolate();
+ SetFeedback(*TypeFeedbackVector::MegamorphicSentinel(isolate),
+ SKIP_WRITE_BARRIER);
+ SetFeedbackExtra(Smi::FromInt(static_cast<int>(property_type)),
+ SKIP_WRITE_BARRIER);
+}
+
+void KeyedStoreICNexus::ConfigureMegamorphicKeyed(IcCheckType property_type) {
+ Isolate* isolate = GetIsolate();
+ SetFeedback(*TypeFeedbackVector::MegamorphicSentinel(isolate),
+ SKIP_WRITE_BARRIER);
+ SetFeedbackExtra(Smi::FromInt(static_cast<int>(property_type)),
+ SKIP_WRITE_BARRIER);
+}
InlineCacheState LoadICNexus::StateFromFeedback() const {
Isolate* isolate = GetIsolate();
@@ -819,10 +843,20 @@
return mode;
}
+IcCheckType KeyedLoadICNexus::GetKeyType() const {
+ Object* feedback = GetFeedback();
+ if (feedback == *TypeFeedbackVector::MegamorphicSentinel(GetIsolate())) {
+ return static_cast<IcCheckType>(Smi::cast(GetFeedbackExtra())->value());
+ }
+ return IsPropertyNameFeedback(feedback) ? PROPERTY : ELEMENT;
+}
IcCheckType KeyedStoreICNexus::GetKeyType() const {
- // The structure of the vector slots tells us the type.
- return GetFeedback()->IsName() ? PROPERTY : ELEMENT;
+ Object* feedback = GetFeedback();
+ if (feedback == *TypeFeedbackVector::MegamorphicSentinel(GetIsolate())) {
+ return static_cast<IcCheckType>(Smi::cast(GetFeedbackExtra())->value());
+ }
+ return IsPropertyNameFeedback(feedback) ? PROPERTY : ELEMENT;
}
} // namespace internal
} // namespace v8