| Index: src/feedback-vector.cc
|
| diff --git a/src/feedback-vector.cc b/src/feedback-vector.cc
|
| index 4003068e9b5960e7af1b332c2b926abd9b5c68ba..87713d190ec71bce6101e5be07562705272c64e9 100644
|
| --- a/src/feedback-vector.cc
|
| +++ b/src/feedback-vector.cc
|
| @@ -149,6 +149,8 @@ const char* FeedbackMetadata::Kind2String(FeedbackSlotKind kind) {
|
| return "kCreateClosure";
|
| case FeedbackSlotKind::kLiteral:
|
| return "LITERAL";
|
| + case FeedbackSlotKind::kTypeProfile:
|
| + return "TYPE_PROFILE";
|
| case FeedbackSlotKind::kGeneral:
|
| return "STUB";
|
| case FeedbackSlotKind::kKindsNumber:
|
| @@ -219,6 +221,7 @@ Handle<FeedbackVector> FeedbackVector::New(Isolate* isolate,
|
| case FeedbackSlotKind::kStoreKeyedStrict:
|
| case FeedbackSlotKind::kStoreDataPropertyInLiteral:
|
| case FeedbackSlotKind::kGeneral:
|
| + case FeedbackSlotKind::kTypeProfile:
|
| array->set(index, *uninitialized_sentinel, SKIP_WRITE_BARRIER);
|
| break;
|
|
|
| @@ -336,7 +339,8 @@ void FeedbackVector::ClearSlots(JSFunction* host_function) {
|
| break;
|
| }
|
| case FeedbackSlotKind::kCreateClosure: {
|
| - break;
|
| + case FeedbackSlotKind::kTypeProfile:
|
| + break;
|
| }
|
| case FeedbackSlotKind::kGeneral: {
|
| if (obj->IsHeapObject()) {
|
| @@ -1019,5 +1023,50 @@ void StoreDataPropertyInLiteralICNexus::ConfigureMonomorphic(
|
| SetFeedbackExtra(*name);
|
| }
|
|
|
| +InlineCacheState CollectTypeProfileICNexus::StateFromFeedback() const {
|
| + Isolate* isolate = GetIsolate();
|
| + Object* feedback = GetFeedback();
|
| +
|
| + if (feedback == *FeedbackVector::UninitializedSentinel(isolate)) {
|
| + return UNINITIALIZED;
|
| + } else if (feedback == *FeedbackVector::MegamorphicSentinel(isolate)) {
|
| + return MEGAMORPHIC;
|
| + } else if (feedback->IsName()) {
|
| + // Don't check if the map is cleared.
|
| + return MONOMORPHIC;
|
| + }
|
| +
|
| + DCHECK(feedback->IsArrayList());
|
| + return POLYMORPHIC;
|
| +}
|
| +
|
| +void CollectTypeProfileICNexus::ConfigureMonomorphic(Handle<Name> type) {
|
| + SetFeedback(*type);
|
| +}
|
| +
|
| +void CollectTypeProfileICNexus::ConfigurePolymorphic(Handle<Name> type) {
|
| + Isolate* isolate = GetIsolate();
|
| +
|
| + Object* known_types = GetFeedback();
|
| + Handle<ArrayList> types;
|
| + if (known_types->IsName()) {
|
| + types = ArrayList::New(isolate, kMaxKeyedPolymorphism);
|
| + ArrayList::Add(types, Handle<Name>(Name::cast(known_types), isolate));
|
| + ArrayList::Add(types, type);
|
| + } else {
|
| + // This should create the union, not a list with double entries.
|
| + DCHECK(known_types->IsArrayList());
|
| + types = Handle<ArrayList>(ArrayList::cast(known_types), isolate);
|
| + ArrayList::Add(types, type);
|
| +
|
| + // We've reached an arbitrary number of too many different types.
|
| + if (types->Length() > kMaxKeyedPolymorphism) {
|
| + SetFeedback(*FeedbackVector::MegamorphicSentinel(isolate));
|
| + return;
|
| + }
|
| + }
|
| + SetFeedback(*types);
|
| +}
|
| +
|
| } // namespace internal
|
| } // namespace v8
|
|
|