| Index: src/code-stubs.h
|
| diff --git a/src/code-stubs.h b/src/code-stubs.h
|
| index 55d7e5d809d12227531bded89766b17576d1e3e4..fa609240e0850ad1b427e992c101330e90c00585 100644
|
| --- a/src/code-stubs.h
|
| +++ b/src/code-stubs.h
|
| @@ -47,6 +47,7 @@ namespace internal {
|
| V(StringCompare) \
|
| V(Compare) \
|
| V(CompareIC) \
|
| + V(CompareNilIC) \
|
| V(MathPow) \
|
| V(StringLength) \
|
| V(FunctionPrototype) \
|
| @@ -946,6 +947,102 @@ class ICCompareStub: public PlatformCodeStub {
|
| };
|
|
|
|
|
| +class CompareNilICStub : public HydrogenCodeStub {
|
| + public:
|
| + enum Types {
|
| + kCompareAgainstNull = 1 << 0,
|
| + kCompareAgainstUndefined = 1 << 1,
|
| + kCompareAgainstMonomorphicMap = 1 << 2,
|
| + kCompareAgainstUndetectable = 1 << 3,
|
| + kFullCompare = kCompareAgainstNull | kCompareAgainstUndefined |
|
| + kCompareAgainstUndetectable
|
| + };
|
| +
|
| + CompareNilICStub(EqualityKind kind, NilValue nil, Types types)
|
| + : HydrogenCodeStub(CODE_STUB_IS_NOT_MISS), bit_field_(0) {
|
| + bit_field_ = EqualityKindField::encode(kind) |
|
| + NilValueField::encode(nil) |
|
| + TypesField::encode(types);
|
| + }
|
| +
|
| + virtual InlineCacheState GetICState() {
|
| + Types types = GetTypes();
|
| + if (types == kFullCompare) {
|
| + return MEGAMORPHIC;
|
| + } else if ((types & kCompareAgainstMonomorphicMap) != 0) {
|
| + return MONOMORPHIC;
|
| + } else {
|
| + return PREMONOMORPHIC;
|
| + }
|
| + }
|
| +
|
| + virtual Code::Kind GetCodeKind() const { return Code::COMPARE_NIL_IC; }
|
| +
|
| + Handle<Code> GenerateCode();
|
| +
|
| + static Handle<Code> GetUninitialized(Isolate* isolate,
|
| + EqualityKind kind,
|
| + NilValue nil) {
|
| + return CompareNilICStub(kind, nil).GetCode(isolate);
|
| + }
|
| +
|
| + virtual void InitializeInterfaceDescriptor(
|
| + Isolate* isolate,
|
| + CodeStubInterfaceDescriptor* descriptor);
|
| +
|
| + static void InitializeForIsolate(Isolate* isolate) {
|
| + CompareNilICStub compare_stub(kStrictEquality, kNullValue);
|
| + compare_stub.InitializeInterfaceDescriptor(
|
| + isolate,
|
| + isolate->code_stub_interface_descriptor(CodeStub::CompareNilIC));
|
| + }
|
| +
|
| + virtual Code::ExtraICState GetExtraICState() {
|
| + return bit_field_;
|
| + }
|
| +
|
| + EqualityKind GetKind() { return EqualityKindField::decode(bit_field_); }
|
| + NilValue GetNilValue() { return NilValueField::decode(bit_field_); }
|
| + Types GetTypes() { return TypesField::decode(bit_field_); }
|
| +
|
| + static Types TypesFromExtraICState(
|
| + Code::ExtraICState state) {
|
| + return TypesField::decode(state);
|
| + }
|
| + static EqualityKind EqualityKindFromExtraICState(
|
| + Code::ExtraICState state) {
|
| + return EqualityKindField::decode(state);
|
| + }
|
| + static NilValue NilValueFromExtraICState(Code::ExtraICState state) {
|
| + return NilValueField::decode(state);
|
| + }
|
| +
|
| + static Types GetPatchedICFlags(Code::ExtraICState extra_ic_state,
|
| + Handle<Object> object,
|
| + bool* already_monomorphic);
|
| +
|
| + private:
|
| + friend class CompareNilIC;
|
| +
|
| + class EqualityKindField : public BitField<EqualityKind, 0, 1> {};
|
| + class NilValueField : public BitField<NilValue, 1, 1> {};
|
| + class TypesField : public BitField<Types, 3, 4> {};
|
| +
|
| + CompareNilICStub(EqualityKind kind, NilValue nil)
|
| + : HydrogenCodeStub(CODE_STUB_IS_MISS), bit_field_(0) {
|
| + bit_field_ = EqualityKindField::encode(kind) |
|
| + NilValueField::encode(nil);
|
| + }
|
| +
|
| + virtual CodeStub::Major MajorKey() { return CompareNilIC; }
|
| + virtual int NotMissMinorKey() { return bit_field_; }
|
| +
|
| + int bit_field_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(CompareNilICStub);
|
| +};
|
| +
|
| +
|
| class CEntryStub : public PlatformCodeStub {
|
| public:
|
| explicit CEntryStub(int result_size,
|
|
|