| Index: src/code-stubs.cc
|
| diff --git a/src/code-stubs.cc b/src/code-stubs.cc
|
| index aa2c82172c16250172db0fa2494b067b532ca0d9..12b00827d7489b5593637add1aff6ba50f2495e4 100644
|
| --- a/src/code-stubs.cc
|
| +++ b/src/code-stubs.cc
|
| @@ -408,41 +408,50 @@ void ICCompareStub::Generate(MacroAssembler* masm) {
|
| }
|
|
|
|
|
| -CompareNilICStub::Types CompareNilICStub::GetPatchedICFlags(
|
| - Code::ExtraICState extra_ic_state,
|
| - Handle<Object> object,
|
| - bool* already_monomorphic) {
|
| - Types types = TypesField::decode(extra_ic_state);
|
| - NilValue nil = NilValueField::decode(extra_ic_state);
|
| - EqualityKind kind = EqualityKindField::decode(extra_ic_state);
|
| - ASSERT(types != CompareNilICStub::kFullCompare);
|
| - *already_monomorphic =
|
| - (types & CompareNilICStub::kCompareAgainstMonomorphicMap) != 0;
|
| - if (kind == kStrictEquality) {
|
| - if (nil == kNullValue) {
|
| - return CompareNilICStub::kCompareAgainstNull;
|
| - } else {
|
| - return CompareNilICStub::kCompareAgainstUndefined;
|
| - }
|
| +void CompareNilICStub::Record(Handle<Object> object) {
|
| + ASSERT(types_ != Types::FullCompare());
|
| + if (equality_kind_ == kStrictEquality) {
|
| + // When testing for strict equality only one value will evaluate to true
|
| + types_.RemoveAll();
|
| + types_.Add((nil_value_ == kNullValue) ? NULL_TYPE:
|
| + UNDEFINED);
|
| } else {
|
| if (object->IsNull()) {
|
| - types = static_cast<CompareNilICStub::Types>(
|
| - types | CompareNilICStub::kCompareAgainstNull);
|
| + types_.Add(NULL_TYPE);
|
| } else if (object->IsUndefined()) {
|
| - types = static_cast<CompareNilICStub::Types>(
|
| - types | CompareNilICStub::kCompareAgainstUndefined);
|
| + types_.Add(UNDEFINED);
|
| } else if (object->IsUndetectableObject() ||
|
| object->IsOddball() ||
|
| !object->IsHeapObject()) {
|
| - types = CompareNilICStub::kFullCompare;
|
| - } else if ((types & CompareNilICStub::kCompareAgainstMonomorphicMap) != 0) {
|
| - types = CompareNilICStub::kFullCompare;
|
| + types_ = Types::FullCompare();
|
| + } else if (IsMonomorphic()) {
|
| + types_ = Types::FullCompare();
|
| } else {
|
| - types = static_cast<CompareNilICStub::Types>(
|
| - types | CompareNilICStub::kCompareAgainstMonomorphicMap);
|
| + types_.Add(MONOMORPHIC_MAP);
|
| }
|
| }
|
| - return types;
|
| +}
|
| +
|
| +
|
| +void CompareNilICStub::PrintName(StringStream* stream) {
|
| + stream->Add("CompareNilICStub_");
|
| + types_.Print(stream);
|
| + stream->Add((nil_value_ == kNullValue) ? "(NullValue|":
|
| + "(UndefinedValue|");
|
| + stream->Add((equality_kind_ == kStrictEquality) ? "StrictEquality)":
|
| + "NonStrictEquality)");
|
| +}
|
| +
|
| +
|
| +void CompareNilICStub::Types::Print(StringStream* stream) const {
|
| + stream->Add("(");
|
| + SimpleListPrinter printer(stream);
|
| + if (IsEmpty()) printer.Add("None");
|
| + if (Contains(UNDEFINED)) printer.Add("Undefined");
|
| + if (Contains(NULL_TYPE)) printer.Add("Null");
|
| + if (Contains(MONOMORPHIC_MAP)) printer.Add("MonomorphicMap");
|
| + if (Contains(UNDETECTABLE)) printer.Add("Undetectable");
|
| + stream->Add(")");
|
| }
|
|
|
|
|
| @@ -552,15 +561,18 @@ void ToBooleanStub::PrintName(StringStream* stream) {
|
|
|
|
|
| void ToBooleanStub::Types::Print(StringStream* stream) const {
|
| - if (IsEmpty()) stream->Add("None");
|
| - if (Contains(UNDEFINED)) stream->Add("Undefined");
|
| - if (Contains(BOOLEAN)) stream->Add("Bool");
|
| - if (Contains(NULL_TYPE)) stream->Add("Null");
|
| - if (Contains(SMI)) stream->Add("Smi");
|
| - if (Contains(SPEC_OBJECT)) stream->Add("SpecObject");
|
| - if (Contains(STRING)) stream->Add("String");
|
| - if (Contains(SYMBOL)) stream->Add("Symbol");
|
| - if (Contains(HEAP_NUMBER)) stream->Add("HeapNumber");
|
| + stream->Add("(");
|
| + SimpleListPrinter printer(stream);
|
| + if (IsEmpty()) printer.Add("None");
|
| + if (Contains(UNDEFINED)) printer.Add("Undefined");
|
| + if (Contains(BOOLEAN)) printer.Add("Bool");
|
| + if (Contains(NULL_TYPE)) printer.Add("Null");
|
| + if (Contains(SMI)) printer.Add("Smi");
|
| + if (Contains(SPEC_OBJECT)) printer.Add("SpecObject");
|
| + if (Contains(STRING)) printer.Add("String");
|
| + if (Contains(SYMBOL)) printer.Add("Symbol");
|
| + if (Contains(HEAP_NUMBER)) printer.Add("HeapNumber");
|
| + stream->Add(")");
|
| }
|
|
|
|
|
|
|