Index: src/type-feedback-vector.h |
diff --git a/src/type-feedback-vector.h b/src/type-feedback-vector.h |
index 378c26a9809023b21c58e8f2ddee72ffbec41f2a..9131fe77db1418ae55eb2e8905cc096338a6c109 100644 |
--- a/src/type-feedback-vector.h |
+++ b/src/type-feedback-vector.h |
@@ -24,7 +24,8 @@ enum class FeedbackVectorSlotKind { |
CALL_IC, |
LOAD_IC, |
- LOAD_GLOBAL_IC, |
+ LOAD_GLOBAL_NOT_INSIDE_TYPEOF_IC, |
+ LOAD_GLOBAL_INSIDE_TYPEOF_IC, |
KEYED_LOAD_IC, |
STORE_SLOPPY_IC, |
STORE_STRICT_IC, |
@@ -50,7 +51,8 @@ inline bool IsLoadICKind(FeedbackVectorSlotKind kind) { |
} |
inline bool IsLoadGlobalICKind(FeedbackVectorSlotKind kind) { |
- return kind == FeedbackVectorSlotKind::LOAD_GLOBAL_IC; |
+ return kind == FeedbackVectorSlotKind::LOAD_GLOBAL_NOT_INSIDE_TYPEOF_IC || |
+ kind == FeedbackVectorSlotKind::LOAD_GLOBAL_INSIDE_TYPEOF_IC; |
} |
inline bool IsKeyedLoadICKind(FeedbackVectorSlotKind kind) { |
@@ -67,6 +69,13 @@ inline bool IsKeyedStoreICKind(FeedbackVectorSlotKind kind) { |
kind == FeedbackVectorSlotKind::KEYED_STORE_STRICT_IC; |
} |
+inline TypeofMode GetTypeofModeFromICKind(FeedbackVectorSlotKind kind) { |
+ DCHECK(IsLoadGlobalICKind(kind)); |
+ return (kind == FeedbackVectorSlotKind::LOAD_GLOBAL_INSIDE_TYPEOF_IC) |
+ ? INSIDE_TYPEOF |
+ : NOT_INSIDE_TYPEOF; |
+} |
+ |
inline LanguageMode GetLanguageModeFromICKind(FeedbackVectorSlotKind kind) { |
DCHECK(IsStoreICKind(kind) || IsKeyedStoreICKind(kind)); |
return (kind == FeedbackVectorSlotKind::STORE_SLOPPY_IC || |
@@ -89,8 +98,11 @@ class FeedbackVectorSpecBase { |
return AddSlot(FeedbackVectorSlotKind::LOAD_IC); |
} |
- FeedbackVectorSlot AddLoadGlobalICSlot() { |
- return AddSlot(FeedbackVectorSlotKind::LOAD_GLOBAL_IC); |
+ FeedbackVectorSlot AddLoadGlobalICSlot(TypeofMode typeof_mode) { |
+ return AddSlot( |
+ typeof_mode == INSIDE_TYPEOF |
+ ? FeedbackVectorSlotKind::LOAD_GLOBAL_INSIDE_TYPEOF_IC |
+ : FeedbackVectorSlotKind::LOAD_GLOBAL_NOT_INSIDE_TYPEOF_IC); |
} |
FeedbackVectorSlot AddCreateClosureSlot() { |
@@ -312,6 +324,11 @@ class TypeFeedbackVector : public FixedArray { |
DEFINE_SLOT_KIND_PREDICATE(IsKeyedStoreIC) |
#undef DEFINE_SLOT_KIND_PREDICATE |
+ // Returns typeof mode encoded into kind of given slot. |
+ inline TypeofMode GetTypeofMode(FeedbackVectorSlot slot) const { |
+ return GetTypeofModeFromICKind(GetKind(slot)); |
+ } |
+ |
// Returns language mode encoded into kind of given slot. |
inline LanguageMode GetLanguageMode(FeedbackVectorSlot slot) const { |
return GetLanguageModeFromICKind(GetKind(slot)); |
@@ -344,10 +361,6 @@ class TypeFeedbackVector : public FixedArray { |
// garbage collection (e.g., for patching the cache). |
static inline Symbol* RawUninitializedSentinel(Isolate* isolate); |
- static const int kDummyLoadICSlot = 0; |
- |
- static Handle<TypeFeedbackVector> DummyVector(Isolate* isolate); |
- |
private: |
void ClearSlotsImpl(SharedFunctionInfo* shared, bool force_clear); |
@@ -529,10 +542,6 @@ class LoadICNexus : public FeedbackNexus { |
: FeedbackNexus(vector, slot) { |
DCHECK(vector->IsLoadIC(slot)); |
} |
- explicit LoadICNexus(Isolate* isolate) |
- : FeedbackNexus( |
- TypeFeedbackVector::DummyVector(isolate), |
- FeedbackVectorSlot(TypeFeedbackVector::kDummyLoadICSlot)) {} |
LoadICNexus(TypeFeedbackVector* vector, FeedbackVectorSlot slot) |
: FeedbackNexus(vector, slot) { |
DCHECK(vector->IsLoadIC(slot)); |