| Index: src/code-stubs.cc
|
| diff --git a/src/code-stubs.cc b/src/code-stubs.cc
|
| index 6b6e25019dedf6ebbbfe1344b250a656a813260f..5bec7e05f913be19ef8526f76e86580b99041115 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();
|
| + 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,40 @@ 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) {
|
| + 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()) {
|
|
|