| Index: src/objects-inl.h
|
| diff --git a/src/objects-inl.h b/src/objects-inl.h
|
| index a14fccb073fb7936f1efe9f83bf9d33ddad1646a..822b31052178f2ec452c473273785e89a171539b 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,23 @@ 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((kind != Code::CALL_IC &&
|
| + kind != Code::KEYED_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);
|
| + // TODO(danno): This is a bit of a hack right now since there are still
|
| + // clients of this API that pass "extra" values in for argc. These clients
|
| + // should be retrofitted to used ExtendedExtraICState.
|
| + if (kind != Code::COMPARE_NIL_IC) {
|
| + bits |= (argc << kArgumentsCountShift);
|
| + }
|
| return static_cast<Flags>(bits);
|
| }
|
|
|
| @@ -3975,6 +3993,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 +5148,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 +5157,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 ||
|
|
|