Index: src/code-stubs.h |
diff --git a/src/code-stubs.h b/src/code-stubs.h |
index e4cbe1863a2c117db9916c950c7f1ae9e924bcc9..7520d538c04083746aa051c8829dd032436dcfd7 100644 |
--- a/src/code-stubs.h |
+++ b/src/code-stubs.h |
@@ -1260,50 +1260,17 @@ class ICCompareStub: public PlatformCodeStub { |
class CompareNilICStub : public HydrogenCodeStub { |
public: |
- enum CompareNilType { |
- UNDEFINED, |
- NULL_TYPE, |
- MONOMORPHIC_MAP, |
- UNDETECTABLE, |
- GENERIC, |
- NUMBER_OF_TYPES |
- }; |
+ Handle<Type> GetType(Isolate* isolate, Handle<Map> map = Handle<Map>()); |
+ Handle<Type> GetInputType(Isolate* isolate, Handle<Map> map); |
- class State : public EnumSet<CompareNilType, byte> { |
- public: |
- State() : EnumSet<CompareNilType, byte>(0) { } |
- explicit State(byte bits) : EnumSet<CompareNilType, byte>(bits) { } |
- |
- static State Generic() { |
- State set; |
- set.Add(UNDEFINED); |
- set.Add(NULL_TYPE); |
- set.Add(UNDETECTABLE); |
- set.Add(GENERIC); |
- return set; |
- } |
- |
- void Print(StringStream* stream) const; |
- }; |
- |
- static Handle<Type> StateToType( |
- Isolate* isolate, State state, Handle<Map> map = Handle<Map>()); |
- |
- // At most 6 different types can be distinguished, because the Code object |
- // only has room for a single byte to hold a set and there are two more |
- // boolean flags we need to store. :-P |
- STATIC_ASSERT(NUMBER_OF_TYPES <= 6); |
- |
- CompareNilICStub(NilValue nil, State state = State()) |
- : nil_value_(nil), state_(state) { |
- } |
+ explicit CompareNilICStub(NilValue nil) : nil_value_(nil) { } |
CompareNilICStub(Code::ExtraICState ic_state, |
InitializationState init_state = INITIALIZED) |
- : HydrogenCodeStub(init_state) { |
- nil_value_ = NilValueField::decode(ic_state); |
- state_ = State(ExtractTypesFromExtraICState(ic_state)); |
- } |
+ : HydrogenCodeStub(init_state), |
+ nil_value_(NilValueField::decode(ic_state)), |
+ state_(State(TypesField::decode(ic_state))) { |
+ } |
static Handle<Code> GetUninitialized(Isolate* isolate, |
NilValue nil) { |
@@ -1322,7 +1289,7 @@ class CompareNilICStub : public HydrogenCodeStub { |
} |
virtual InlineCacheState GetICState() { |
- if (state_ == State::Generic()) { |
+ if (state_.Contains(GENERIC)) { |
return MEGAMORPHIC; |
} else if (state_.Contains(MONOMORPHIC_MAP)) { |
return MONOMORPHIC; |
@@ -1335,22 +1302,15 @@ class CompareNilICStub : public HydrogenCodeStub { |
Handle<Code> GenerateCode(); |
- // extra ic state = nil_value | type_n-1 | ... | type_0 |
virtual Code::ExtraICState GetExtraICState() { |
- return NilValueField::encode(nil_value_) | state_.ToIntegral(); |
- } |
- static byte ExtractTypesFromExtraICState(Code::ExtraICState state) { |
- return state & ((1 << NUMBER_OF_TYPES) - 1); |
- } |
- static NilValue ExtractNilValueFromExtraICState(Code::ExtraICState state) { |
- return NilValueField::decode(state); |
+ return NilValueField::encode(nil_value_) | |
+ TypesField::encode(state_.ToIntegral()); |
} |
void UpdateStatus(Handle<Object> object); |
bool IsMonomorphic() const { return state_.Contains(MONOMORPHIC_MAP); } |
NilValue GetNilValue() const { return nil_value_; } |
- State GetState() const { return state_; } |
void ClearState() { state_.RemoveAll(); } |
virtual void PrintState(StringStream* stream); |
@@ -1359,12 +1319,32 @@ class CompareNilICStub : public HydrogenCodeStub { |
private: |
friend class CompareNilIC; |
+ enum CompareNilType { |
+ UNDEFINED, |
+ NULL_TYPE, |
+ MONOMORPHIC_MAP, |
+ GENERIC, |
+ NUMBER_OF_TYPES |
+ }; |
+ |
+ // At most 6 different types can be distinguished, because the Code object |
+ // only has room for a single byte to hold a set and there are two more |
+ // boolean flags we need to store. :-P |
+ STATIC_ASSERT(NUMBER_OF_TYPES <= 6); |
+ |
+ class State : public EnumSet<CompareNilType, byte> { |
+ public: |
+ State() : EnumSet<CompareNilType, byte>(0) { } |
+ explicit State(byte bits) : EnumSet<CompareNilType, byte>(bits) { } |
+ |
+ void Print(StringStream* stream) const; |
+ }; |
+ |
CompareNilICStub(NilValue nil, InitializationState init_state) |
- : HydrogenCodeStub(init_state) { |
- nil_value_ = nil; |
- } |
+ : HydrogenCodeStub(init_state), nil_value_(nil) { } |
- class NilValueField : public BitField<NilValue, NUMBER_OF_TYPES, 1> {}; |
+ class NilValueField : public BitField<NilValue, 0, 1> {}; |
+ class TypesField : public BitField<byte, 1, NUMBER_OF_TYPES> {}; |
virtual CodeStub::Major MajorKey() { return CompareNilIC; } |
virtual int NotMissMinorKey() { return GetExtraICState(); } |