Index: src/objects.h |
diff --git a/src/objects.h b/src/objects.h |
index 56e90dd3f980c13416bde4d734147f2023f3c0e6..145e1ac67a5309524252bdc63f57bc6c3b1d13b8 100644 |
--- a/src/objects.h |
+++ b/src/objects.h |
@@ -4353,6 +4353,7 @@ class Code: public HeapObject { |
V(UNARY_OP_IC) \ |
V(BINARY_OP_IC) \ |
V(COMPARE_IC) \ |
+ V(COMPARE_NIL_IC) \ |
V(TO_BOOLEAN_IC) |
enum Kind { |
@@ -4464,6 +4465,8 @@ class Code: public HeapObject { |
inline Kind kind(); |
inline InlineCacheState ic_state(); // Only valid for IC stubs. |
inline ExtraICState extra_ic_state(); // Only valid for IC stubs. |
+ inline ExtraICState extended_extra_ic_state(); // Only valid for |
+ // non-call IC stubs. |
inline StubType type(); // Only valid for monomorphic IC stubs. |
inline int arguments_count(); // Only valid for call IC stubs. |
@@ -4479,6 +4482,7 @@ class Code: public HeapObject { |
inline bool is_unary_op_stub() { return kind() == UNARY_OP_IC; } |
inline bool is_binary_op_stub() { return kind() == BINARY_OP_IC; } |
inline bool is_compare_ic_stub() { return kind() == COMPARE_IC; } |
+ inline bool is_compare_nil_ic_stub() { return kind() == COMPARE_NIL_IC; } |
inline bool is_to_boolean_ic_stub() { return kind() == TO_BOOLEAN_IC; } |
// [major_key]: For kind STUB or BINARY_OP_IC, the major key. |
@@ -4557,6 +4561,9 @@ class Code: public HeapObject { |
inline byte to_boolean_state(); |
inline void set_to_boolean_state(byte value); |
+ // [compare_nil]: For kind COMPARE_NIL_IC tells what state the stub is in. |
+ byte compare_nil_state(); |
+ |
// [has_function_cache]: For kind STUB tells whether there is a function |
// cache is passed to the stub. |
inline bool has_function_cache(); |
@@ -4576,6 +4583,7 @@ class Code: public HeapObject { |
// Find the first map in an IC stub. |
Map* FindFirstMap(); |
void FindAllMaps(MapHandleList* maps); |
+ void ReplaceFirstMap(Map* replace); |
// Find the first code in an IC stub. |
Code* FindFirstCode(); |
@@ -4628,6 +4636,7 @@ class Code: public HeapObject { |
static inline Kind ExtractKindFromFlags(Flags flags); |
static inline InlineCacheHolderFlag ExtractCacheHolderFromFlags(Flags flags); |
static inline ExtraICState ExtractExtraICStateFromFlags(Flags flags); |
+ static inline ExtraICState ExtractExtendedExtraICStateFromFlags(Flags flags); |
static inline int ExtractArgumentsCountFromFlags(Flags flags); |
static inline Flags RemoveTypeFromFlags(Flags flags); |
@@ -4767,8 +4776,11 @@ class Code: public HeapObject { |
class TypeField: public BitField<StubType, 3, 3> {}; |
class CacheHolderField: public BitField<InlineCacheHolderFlag, 6, 1> {}; |
class KindField: public BitField<Kind, 7, 4> {}; |
- class ExtraICStateField: public BitField<ExtraICState, 11, 5> {}; |
- class IsPregeneratedField: public BitField<bool, 16, 1> {}; |
+ class IsPregeneratedField: public BitField<bool, 11, 1> {}; |
+ class ExtraICStateField: public BitField<ExtraICState, 12, 5> {}; |
+ class ExtendedExtraICStateField: public BitField<ExtraICState, 12, |
+ PlatformSmiTagging::kSmiValueSize - 12 + 1> {}; // NOLINT |
+ STATIC_ASSERT(ExtraICStateField::kShift == ExtendedExtraICStateField::kShift); |
// KindSpecificFlags1 layout (STUB and OPTIMIZED_FUNCTION) |
static const int kStackSlotsFirstBit = 0; |
@@ -4841,6 +4853,13 @@ class Code: public HeapObject { |
PlatformSmiTagging::kSmiValueSize - Code::kArgumentsCountShift + 1; |
static const int kMaxArguments = (1 << kArgumentsBits) - 1; |
+ // ICs can use either argument count or ExtendedExtraIC, since their storage |
+ // overlaps. |
+ STATIC_ASSERT(ExtraICStateField::kShift + |
+ ExtraICStateField::kSize + kArgumentsBits == |
+ ExtendedExtraICStateField::kShift + |
+ ExtendedExtraICStateField::kSize); |
+ |
// This constant should be encodable in an ARM instruction. |
static const int kFlagsNotUsedInLookup = |
TypeField::kMask | CacheHolderField::kMask; |