Index: src/objects-inl.h |
diff --git a/src/objects-inl.h b/src/objects-inl.h |
index 8e87fd7b7336c3d2de8b8f998e4254036cc1113f..4e6ef8e37da6f819c06a0837ebc86ceb048f0d91 100644 |
--- a/src/objects-inl.h |
+++ b/src/objects-inl.h |
@@ -2572,14 +2572,20 @@ bool Code::is_inline_cache_stub() { |
Code::Flags Code::ComputeFlags(Kind kind, |
InLoopFlag in_loop, |
InlineCacheState ic_state, |
+ ExtraICState extra_ic_state, |
PropertyType type, |
int argc, |
InlineCacheHolderFlag holder) { |
+ // Extra IC state is only allowed for monomorphic call IC stubs. |
+ ASSERT(extra_ic_state == kNoExtraICState || |
+ (kind == CALL_IC && (ic_state == MONOMORPHIC || |
+ ic_state == MONOMORPHIC_PROTOTYPE_FAILURE))); |
// Compute the bit mask. |
int bits = kind << kFlagsKindShift; |
if (in_loop) bits |= kFlagsICInLoopMask; |
bits |= ic_state << kFlagsICStateShift; |
bits |= type << kFlagsTypeShift; |
+ bits |= extra_ic_state << kFlagsExtraICStateShift; |
bits |= argc << kFlagsArgumentsCountShift; |
if (holder == PROTOTYPE_MAP) bits |= kFlagsCacheInPrototypeMapMask; |
// Cast to flags and validate result before returning it. |
@@ -2588,6 +2594,7 @@ Code::Flags Code::ComputeFlags(Kind kind, |
ASSERT(ExtractICStateFromFlags(result) == ic_state); |
ASSERT(ExtractICInLoopFromFlags(result) == in_loop); |
ASSERT(ExtractTypeFromFlags(result) == type); |
+ ASSERT(ExtractExtraICStateFromFlags(result) == extra_ic_state); |
ASSERT(ExtractArgumentsCountFromFlags(result) == argc); |
return result; |
} |
@@ -2595,10 +2602,12 @@ Code::Flags Code::ComputeFlags(Kind kind, |
Code::Flags Code::ComputeMonomorphicFlags(Kind kind, |
PropertyType type, |
+ ExtraICState extra_ic_state, |
InlineCacheHolderFlag holder, |
InLoopFlag in_loop, |
int argc) { |
- return ComputeFlags(kind, in_loop, MONOMORPHIC, type, argc, holder); |
+ return ComputeFlags( |
+ kind, in_loop, MONOMORPHIC, extra_ic_state, type, argc, holder); |
} |
@@ -2614,6 +2623,12 @@ InlineCacheState Code::ExtractICStateFromFlags(Flags flags) { |
} |
+Code::ExtraICState Code::ExtractExtraICStateFromFlags(Flags flags) { |
+ int bits = (flags & kFlagsExtraICStateMask) >> kFlagsExtraICStateShift; |
+ return static_cast<ExtraICState>(bits); |
+} |
+ |
+ |
InLoopFlag Code::ExtractICInLoopFromFlags(Flags flags) { |
int bits = (flags & kFlagsICInLoopMask); |
return bits != 0 ? IN_LOOP : NOT_IN_LOOP; |