Index: src/objects-inl.h |
diff --git a/src/objects-inl.h b/src/objects-inl.h |
index a14fccb073fb7936f1efe9f83bf9d33ddad1646a..a4f4de320672ec4019a4c194929b079d86f06751 100644 |
--- a/src/objects-inl.h |
+++ b/src/objects-inl.h |
@@ -3634,6 +3634,12 @@ Code::ExtraICState Code::extra_ic_state() { |
} |
+Code::ExtraICState Code::extended_extra_ic_state() { |
+ ASSERT(is_inline_cache_stub() || ic_state() == DEBUG_STUB); |
+ return ExtractExtendedExtraICStateFromFlags(flags()); |
+} |
+ |
+ |
Code::StubType Code::type() { |
return ExtractTypeFromFlags(flags()); |
} |
@@ -3663,6 +3669,7 @@ int Code::major_key() { |
kind() == UNARY_OP_IC || |
kind() == BINARY_OP_IC || |
kind() == COMPARE_IC || |
+ kind() == COMPARE_NIL_IC || |
kind() == LOAD_IC || |
kind() == KEYED_LOAD_IC || |
kind() == TO_BOOLEAN_IC); |
@@ -3676,6 +3683,7 @@ void Code::set_major_key(int major) { |
kind() == UNARY_OP_IC || |
kind() == BINARY_OP_IC || |
kind() == COMPARE_IC || |
+ kind() == COMPARE_NIL_IC || |
kind() == LOAD_IC || |
kind() == KEYED_LOAD_IC || |
kind() == STORE_IC || |
@@ -3940,13 +3948,22 @@ Code::Flags Code::ComputeFlags(Kind kind, |
int argc, |
InlineCacheHolderFlag holder) { |
ASSERT(argc <= Code::kMaxArguments); |
+ // Since the extended extra ic state overlaps with the argument count |
+ // for CALL_ICs, do so checks to make sure that they don't interfere. |
+ ASSERT(argc == -1 || kind == Code::CALL_IC || |
+ kind == Code::KEYED_CALL_IC || kind == Code::STUB); |
+ ASSERT(kind != Code::CALL_IC || |
+ (ExtraICStateField::encode(extra_ic_state) | true)); |
// Compute the bit mask. |
unsigned int bits = KindField::encode(kind) |
| ICStateField::encode(ic_state) |
| TypeField::encode(type) |
- | ExtraICStateField::encode(extra_ic_state) |
- | (argc << kArgumentsCountShift) |
+ | ExtendedExtraICStateField::encode(extra_ic_state) |
| CacheHolderField::encode(holder); |
+ if (kind < Code::FIRST_IC_KIND || kind > LAST_IC_KIND || |
+ kind == Code::CALL_IC || kind == Code::KEYED_CALL_IC) { |
+ bits |= (argc << kArgumentsCountShift); |
+ } |
return static_cast<Flags>(bits); |
} |
@@ -3975,6 +3992,12 @@ Code::ExtraICState Code::ExtractExtraICStateFromFlags(Flags flags) { |
} |
+Code::ExtraICState Code::ExtractExtendedExtraICStateFromFlags( |
+ Flags flags) { |
+ return ExtendedExtraICStateField::decode(flags); |
+} |
+ |
+ |
Code::StubType Code::ExtractTypeFromFlags(Flags flags) { |
return TypeField::decode(flags); |
} |
@@ -5124,7 +5147,8 @@ void Code::set_type_feedback_info(Object* value, WriteBarrierMode mode) { |
int Code::stub_info() { |
- ASSERT(kind() == COMPARE_IC || kind() == BINARY_OP_IC || kind() == LOAD_IC); |
+ ASSERT(kind() == COMPARE_IC || kind() == COMPARE_NIL_IC || |
+ kind() == BINARY_OP_IC || kind() == LOAD_IC); |
Object* value = READ_FIELD(this, kTypeFeedbackInfoOffset); |
return Smi::cast(value)->value(); |
} |
@@ -5132,6 +5156,7 @@ int Code::stub_info() { |
void Code::set_stub_info(int value) { |
ASSERT(kind() == COMPARE_IC || |
+ kind() == COMPARE_NIL_IC || |
kind() == BINARY_OP_IC || |
kind() == STUB || |
kind() == LOAD_IC || |