| Index: src/type-info.cc
|
| diff --git a/src/type-info.cc b/src/type-info.cc
|
| index bffeccfbc19810e3742e185fe6e9b489edaf2f3a..15a64ef84510cddac13933d5d1fbd510980d96ee 100644
|
| --- a/src/type-info.cc
|
| +++ b/src/type-info.cc
|
| @@ -131,6 +131,21 @@ bool TypeFeedbackOracle::StoreIsUninitialized(TypeFeedbackId ast_id) {
|
| }
|
|
|
|
|
| +bool TypeFeedbackOracle::StoreIsUninitialized(FeedbackVectorICSlot slot) {
|
| + if (!slot.IsInvalid()) {
|
| + Code::Kind kind = feedback_vector_->GetKind(slot);
|
| + if (kind == Code::STORE_IC) {
|
| + StoreICNexus nexus(feedback_vector_, slot);
|
| + return nexus.StateFromFeedback();
|
| + } else if (kind == Code::KEYED_STORE_IC) {
|
| + KeyedStoreICNexus nexus(feedback_vector_, slot);
|
| + return nexus.StateFromFeedback();
|
| + }
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +
|
| bool TypeFeedbackOracle::CallIsUninitialized(FeedbackVectorICSlot slot) {
|
| Handle<Object> value = GetInfo(slot);
|
| return value->IsUndefined() ||
|
| @@ -180,18 +195,17 @@ void TypeFeedbackOracle::GetStoreModeAndKeyType(
|
| }
|
|
|
|
|
| -void TypeFeedbackOracle::GetLoadKeyType(
|
| - TypeFeedbackId ast_id, IcCheckType* key_type) {
|
| - Handle<Object> maybe_code = GetInfo(ast_id);
|
| - if (maybe_code->IsCode()) {
|
| - Handle<Code> code = Handle<Code>::cast(maybe_code);
|
| - if (code->kind() == Code::KEYED_LOAD_IC) {
|
| - ExtraICState extra_ic_state = code->extra_ic_state();
|
| - *key_type = KeyedLoadIC::GetKeyType(extra_ic_state);
|
| - return;
|
| - }
|
| +void TypeFeedbackOracle::GetStoreModeAndKeyType(
|
| + FeedbackVectorICSlot slot, KeyedAccessStoreMode* store_mode,
|
| + IcCheckType* key_type) {
|
| + if (!slot.IsInvalid()) {
|
| + KeyedStoreICNexus nexus(feedback_vector_, slot);
|
| + *store_mode = nexus.GetKeyedAccessStoreMode();
|
| + *key_type = nexus.GetKeyType();
|
| + } else {
|
| + *store_mode = STANDARD_STORE;
|
| + *key_type = ELEMENT;
|
| }
|
| - *key_type = ELEMENT;
|
| }
|
|
|
|
|
| @@ -366,6 +380,15 @@ void TypeFeedbackOracle::AssignmentReceiverTypes(TypeFeedbackId id,
|
| }
|
|
|
|
|
| +void TypeFeedbackOracle::AssignmentReceiverTypes(FeedbackVectorICSlot slot,
|
| + Handle<Name> name,
|
| + SmallMapList* receiver_types) {
|
| + receiver_types->Clear();
|
| + Code::Flags flags = Code::ComputeHandlerFlags(Code::STORE_IC);
|
| + CollectReceiverTypes(slot, name, flags, receiver_types);
|
| +}
|
| +
|
| +
|
| void TypeFeedbackOracle::KeyedAssignmentReceiverTypes(
|
| TypeFeedbackId id, SmallMapList* receiver_types,
|
| KeyedAccessStoreMode* store_mode, IcCheckType* key_type) {
|
| @@ -375,6 +398,15 @@ void TypeFeedbackOracle::KeyedAssignmentReceiverTypes(
|
| }
|
|
|
|
|
| +void TypeFeedbackOracle::KeyedAssignmentReceiverTypes(
|
| + FeedbackVectorICSlot slot, SmallMapList* receiver_types,
|
| + KeyedAccessStoreMode* store_mode, IcCheckType* key_type) {
|
| + receiver_types->Clear();
|
| + CollectReceiverTypes(slot, receiver_types);
|
| + GetStoreModeAndKeyType(slot, store_mode, key_type);
|
| +}
|
| +
|
| +
|
| void TypeFeedbackOracle::CountReceiverTypes(TypeFeedbackId id,
|
| SmallMapList* receiver_types) {
|
| receiver_types->Clear();
|
| @@ -382,6 +414,15 @@ void TypeFeedbackOracle::CountReceiverTypes(TypeFeedbackId id,
|
| }
|
|
|
|
|
| +void TypeFeedbackOracle::CollectReceiverTypes(FeedbackVectorICSlot slot,
|
| + Handle<Name> name,
|
| + Code::Flags flags,
|
| + SmallMapList* types) {
|
| + StoreICNexus nexus(feedback_vector_, slot);
|
| + CollectReceiverTypes<FeedbackNexus>(&nexus, name, flags, types);
|
| +}
|
| +
|
| +
|
| void TypeFeedbackOracle::CollectReceiverTypes(TypeFeedbackId ast_id,
|
| Handle<Name> name,
|
| Code::Flags flags,
|
| @@ -419,6 +460,13 @@ void TypeFeedbackOracle::CollectReceiverTypes(TypeFeedbackId ast_id,
|
| }
|
|
|
|
|
| +void TypeFeedbackOracle::CollectReceiverTypes(FeedbackVectorICSlot slot,
|
| + SmallMapList* types) {
|
| + KeyedStoreICNexus nexus(feedback_vector_, slot);
|
| + CollectReceiverTypes<FeedbackNexus>(&nexus, types);
|
| +}
|
| +
|
| +
|
| template <class T>
|
| void TypeFeedbackOracle::CollectReceiverTypes(T* obj, SmallMapList* types) {
|
| MapHandleList maps;
|
|
|