| Index: src/code-stubs.h
|
| diff --git a/src/code-stubs.h b/src/code-stubs.h
|
| index 0ea7ac96b59b29e563ce4e95267ffdbb593ecadd..edbc93d142c7cf3e32fe2ac4f05ffc491b29bb11 100644
|
| --- a/src/code-stubs.h
|
| +++ b/src/code-stubs.h
|
| @@ -1124,46 +1124,50 @@ class ICCompareStub: public PlatformCodeStub {
|
|
|
| class CompareNilICStub : public HydrogenCodeStub {
|
| public:
|
| - enum Type {
|
| + enum CompareNilType {
|
| UNDEFINED,
|
| NULL_TYPE,
|
| MONOMORPHIC_MAP,
|
| UNDETECTABLE,
|
| + GENERIC,
|
| NUMBER_OF_TYPES
|
| };
|
|
|
| - class Types : public EnumSet<Type, byte> {
|
| + class State : public EnumSet<CompareNilType, byte> {
|
| public:
|
| - Types() : EnumSet<Type, byte>(0) { }
|
| - explicit Types(byte bits) : EnumSet<Type, byte>(bits) { }
|
| + State() : EnumSet<CompareNilType, byte>(0) { }
|
| + explicit State(byte bits) : EnumSet<CompareNilType, byte>(bits) { }
|
|
|
| - static Types FullCompare() {
|
| - Types set;
|
| + 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;
|
| - void TraceTransition(Types to) const;
|
| + void TraceTransition(State to) 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, Types types = Types())
|
| - : types_(types) {
|
| - nil_value_ = nil;
|
| + CompareNilICStub(NilValue nil, State state = State())
|
| + : nil_value_(nil), state_(state) {
|
| }
|
|
|
| CompareNilICStub(Code::ExtraICState ic_state,
|
| InitializationState init_state = INITIALIZED)
|
| : HydrogenCodeStub(init_state) {
|
| nil_value_ = NilValueField::decode(ic_state);
|
| - types_ = Types(ExtractTypesFromExtraICState(ic_state));
|
| + state_ = State(ExtractTypesFromExtraICState(ic_state));
|
| }
|
|
|
| static Handle<Code> GetUninitialized(Isolate* isolate,
|
| @@ -1183,9 +1187,9 @@ class CompareNilICStub : public HydrogenCodeStub {
|
| }
|
|
|
| virtual InlineCacheState GetICState() {
|
| - if (types_ == Types::FullCompare()) {
|
| + if (state_ == State::Generic()) {
|
| return MEGAMORPHIC;
|
| - } else if (types_.Contains(MONOMORPHIC_MAP)) {
|
| + } else if (state_.Contains(MONOMORPHIC_MAP)) {
|
| return MONOMORPHIC;
|
| } else {
|
| return PREMONOMORPHIC;
|
| @@ -1198,20 +1202,18 @@ class CompareNilICStub : public HydrogenCodeStub {
|
|
|
| // extra ic state = nil_value | type_n-1 | ... | type_0
|
| virtual Code::ExtraICState GetExtraICState() {
|
| - return NilValueField::encode(nil_value_) |
|
| - types_.ToIntegral();
|
| + return NilValueField::encode(nil_value_) | state_.ToIntegral();
|
| }
|
| - static byte ExtractTypesFromExtraICState(
|
| - Code::ExtraICState state) {
|
| + static byte ExtractTypesFromExtraICState(Code::ExtraICState state) {
|
| return state & ((1 << NUMBER_OF_TYPES) - 1);
|
| }
|
|
|
| void Record(Handle<Object> object);
|
|
|
| - bool IsMonomorphic() const { return types_.Contains(MONOMORPHIC_MAP); }
|
| + bool IsMonomorphic() const { return state_.Contains(MONOMORPHIC_MAP); }
|
| NilValue GetNilValue() const { return nil_value_; }
|
| - Types GetTypes() const { return types_; }
|
| - void ClearTypes() { types_.RemoveAll(); }
|
| + State GetState() const { return state_; }
|
| + void ClearState() { state_.RemoveAll(); }
|
|
|
| virtual void PrintName(StringStream* stream);
|
|
|
| @@ -1229,7 +1231,7 @@ class CompareNilICStub : public HydrogenCodeStub {
|
| virtual int NotMissMinorKey() { return GetExtraICState(); }
|
|
|
| NilValue nil_value_;
|
| - Types types_;
|
| + State state_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(CompareNilICStub);
|
| };
|
|
|