Chromium Code Reviews| Index: src/code-stubs.cc |
| diff --git a/src/code-stubs.cc b/src/code-stubs.cc |
| index 6b6e25019dedf6ebbbfe1344b250a656a813260f..22fba54238b729012795c49dfe90df45fd0f15d8 100644 |
| --- a/src/code-stubs.cc |
| +++ b/src/code-stubs.cc |
| @@ -431,24 +431,24 @@ void ICCompareStub::Generate(MacroAssembler* masm) { |
| void CompareNilICStub::Record(Handle<Object> object) { |
| - ASSERT(types_ != Types::FullCompare()); |
| + ASSERT(state_ != State::Generic()); |
| if (object->IsNull()) { |
| - types_.Add(NULL_TYPE); |
| + state_.Add(NULL_TYPE); |
| } else if (object->IsUndefined()) { |
| - types_.Add(UNDEFINED); |
| + state_.Add(UNDEFINED); |
| } else if (object->IsUndetectableObject() || |
| - object->IsOddball() || |
| - !object->IsHeapObject()) { |
| - types_ = Types::FullCompare(); |
| + object->IsOddball() || |
|
Jakob Kummerow
2013/06/11 17:58:07
nit: I kinda preferred the old indentation here, b
rossberg
2013/06/12 17:21:32
Done. (That actually was an unintended side-effect
|
| + !object->IsHeapObject()) { |
| + state_ = State::Generic(); |
| } else if (IsMonomorphic()) { |
| - types_ = Types::FullCompare(); |
| + state_ = State::Generic(); |
| } else { |
| - types_.Add(MONOMORPHIC_MAP); |
| + state_.Add(MONOMORPHIC_MAP); |
| } |
| } |
| -void CompareNilICStub::Types::TraceTransition(Types to) const { |
| +void CompareNilICStub::State::TraceTransition(State to) const { |
| #ifdef DEBUG |
| if (!FLAG_trace_ic) return; |
| char buffer[100]; |
| @@ -467,13 +467,13 @@ void CompareNilICStub::Types::TraceTransition(Types to) const { |
| void CompareNilICStub::PrintName(StringStream* stream) { |
| stream->Add("CompareNilICStub_"); |
| - types_.Print(stream); |
| + state_.Print(stream); |
| stream->Add((nil_value_ == kNullValue) ? "(NullValue|": |
| "(UndefinedValue|"); |
| } |
| -void CompareNilICStub::Types::Print(StringStream* stream) const { |
| +void CompareNilICStub::State::Print(StringStream* stream) const { |
| stream->Add("("); |
| SimpleListPrinter printer(stream); |
| if (IsEmpty()) printer.Add("None"); |
| @@ -481,10 +481,38 @@ void CompareNilICStub::Types::Print(StringStream* stream) const { |
| if (Contains(NULL_TYPE)) printer.Add("Null"); |
| if (Contains(MONOMORPHIC_MAP)) printer.Add("MonomorphicMap"); |
| if (Contains(UNDETECTABLE)) printer.Add("Undetectable"); |
| + if (Contains(GENERIC)) printer.Add("Generic"); |
| stream->Add(")"); |
| } |
| +Handle<Type> CompareNilICStub::StateToType( |
| + Isolate* isolate, State state, Handle<Map> map) { |
|
Jakob Kummerow
2013/06/11 17:58:07
nit: one line per argument please
rossberg
2013/06/12 17:21:32
Done, but, seriously? :)
|
| + if (state.Contains(CompareNilICStub::GENERIC)) { |
| + return handle(Type::Any(), isolate); |
| + } |
| + |
| + Handle<Type> result(Type::None(), isolate); |
| + if (state.Contains(CompareNilICStub::UNDEFINED)) { |
| + result = handle(Type::Union(result, handle(Type::Undefined(), isolate)), |
| + isolate); |
| + } |
| + if (state.Contains(CompareNilICStub::NULL_TYPE)) { |
| + result = handle(Type::Union(result, handle(Type::Null(), isolate)), |
| + isolate); |
| + } |
| + if (state.Contains(CompareNilICStub::UNDETECTABLE)) { |
| + result = handle(Type::Union(result, handle(Type::Undetectable(), isolate)), |
| + isolate); |
| + } else if (state.Contains(CompareNilICStub::MONOMORPHIC_MAP)) { |
| + Type* type = map.is_null() ? Type::Detectable() : Type::Class(map); |
| + result = handle(Type::Union(result, handle(type, isolate)), isolate); |
| + } |
| + |
| + return result; |
| +} |
| + |
| + |
| void InstanceofStub::PrintName(StringStream* stream) { |
| const char* args = ""; |
| if (HasArgsInRegisters()) { |