Index: src/code-stubs.cc |
diff --git a/src/code-stubs.cc b/src/code-stubs.cc |
index aa2c82172c16250172db0fa2494b067b532ca0d9..99a8043920a8cddd087b5ddbaaa1a0b107b013f9 100644 |
--- a/src/code-stubs.cc |
+++ b/src/code-stubs.cc |
@@ -407,44 +407,62 @@ 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; |
+void CompareNilICStub::Record(Handle<Object> object) { |
+ ASSERT(!types_.IsFullCompare()); |
+ if (IsStrictEquality()) { |
+ if (IsNullValue()) { |
+ types_.SetTo(NULL_TYPE); |
} else { |
- return CompareNilICStub::kCompareAgainstUndefined; |
+ types_.SetTo(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_.BeFullCompare(); |
+ } else if (IsMonomorphic()) { |
+ types_.BeFullCompare(); |
} else { |
- types = static_cast<CompareNilICStub::Types>( |
- types | CompareNilICStub::kCompareAgainstMonomorphicMap); |
+ types_.Add(MONOMORPHIC_MAP); |
} |
} |
- return types; |
} |
+void CompareNilICStub::Types::Add(Type type) { |
+ set_.Add(type); |
+} |
+ |
+void CompareNilICStub::Types::SetTo(Type type) { |
+ Clear(); |
+ Add(type); |
+} |
+ |
+void CompareNilICStub::PrintName(StringStream* stream) { |
+ stream->Add("CompareNilICStub_"); |
+ types_.Print(stream); |
+ if (IsNullValue()) { |
+ stream->Add("(NullValue|"); |
+ } else { |
+ stream->Add("(UndefinedValue|"); |
+ } |
+ if (IsStrictEquality()) { |
+ stream->Add("StrictEquality)"); |
+ } else { |
+ stream->Add("NonStrictEquality)"); |
+ } |
+} |
+ |
+void CompareNilICStub::Types::Print(StringStream* stream) const { |
Sven Panne
2013/05/13 14:24:50
This doesn't produce very readable output when Typ
oliv
2013/05/13 18:03:58
ok, done
|
+ if (IsEmpty()) stream->Add("None"); |
+ if (Contains(UNDEFINED)) stream->Add("Undefined"); |
+ if (Contains(NULL_TYPE)) stream->Add("Null"); |
+ if (Contains(MONOMORPHIC_MAP)) stream->Add("MonomorphicMap"); |
+ if (Contains(UNDETECTABLE)) stream->Add("Undetectable"); |
+} |
void InstanceofStub::PrintName(StringStream* stream) { |
const char* args = ""; |