explicit HydrogenCodeStub(Isolate* isolate,
InitializationState state = INITIALIZED)
: CodeStub(isolate) {
- is_uninitialized_ = (state == UNINITIALIZED);
+ minor_key_ = IsMissBits::encode(state == UNINITIALIZED);
}
virtual Code::Kind GetCodeKind() const { return Code::STUB; }
return isolate()->code_stub_interface_descriptor(MajorKey());
}
- bool IsUninitialized() { return is_uninitialized_; }
-
template<class SubClass>
static Handle<Code> GetUninitialized(Isolate* isolate) {
SubClass::GenerateAheadOfTime(isolate);
// Retrieve the code for the stub. Generate the code if needed.
virtual Handle<Code> GenerateCode() = 0;
- virtual int NotMissMinorKey() const = 0;
+ bool IsUninitialized() const { return IsMissBits::decode(minor_key_); }
+
+ // TODO(yangguo): we use this temporarily to construct the minor key.
+ // We want to remove NotMissMinorKey methods one by one and eventually
+ // remove HydrogenStub::MinorKey and turn CodeStub::MinorKey into a
+ // non-virtual method that directly returns minor_key_.
+ virtual int NotMissMinorKey() const {
+ return SubMinorKeyBits::decode(minor_key_);
+ }
Handle<Code> GenerateLightweightMissCode();
template<class StateType>
void TraceTransition(StateType from, StateType to);
+ protected:
+ void set_sub_minor_key(uint32_t key) {
+ minor_key_ = SubMinorKeyBits::update(minor_key_, key);
+ }
+
+ uint32_t sub_minor_key() const { return SubMinorKeyBits::decode(minor_key_); }
+
+ static const int kSubMinorKeyBits = kStubMinorKeyBits - 1;
+
private:
- class MinorKeyBits: public BitField<int, 0, kStubMinorKeyBits - 1> {};
- class IsMissBits: public BitField<bool, kStubMinorKeyBits - 1, 1> {};
+ class SubMinorKeyBits : public BitField<int, 0, kSubMinorKeyBits> {};
+ class IsMissBits : public BitField<bool, kSubMinorKeyBits, 1> {};
void GenerateLightweightMiss(MacroAssembler* masm);
virtual uint32_t MinorKey() const {
- return IsMissBits::encode(is_uninitialized_) |
- MinorKeyBits::encode(NotMissMinorKey());
+ return IsMissBits::encode(IsUninitialized()) |
+ SubMinorKeyBits::encode(NotMissMinorKey());
}
-
- bool is_uninitialized_;
};
}
private:
- Major MajorKey() const { return ToNumber; }
- int NotMissMinorKey() const { return 0; }
+ virtual Major MajorKey() const V8_OVERRIDE { return ToNumber; }
};
private:
virtual Major MajorKey() const V8_OVERRIDE { return NumberToString; }
- virtual int NotMissMinorKey() const V8_OVERRIDE { return 0; }
};
class FastNewClosureStub : public HydrogenCodeStub {
public:
- FastNewClosureStub(Isolate* isolate,
- StrictMode strict_mode,
+ FastNewClosureStub(Isolate* isolate, StrictMode strict_mode,
bool is_generator)
- : HydrogenCodeStub(isolate),
- strict_mode_(strict_mode),
- is_generator_(is_generator) { }
+ : HydrogenCodeStub(isolate) {
+ set_sub_minor_key(StrictModeBits::encode(strict_mode) |
+ IsGeneratorBits::encode(is_generator));
+ }
virtual Handle<Code> GenerateCode() V8_OVERRIDE;
static void InstallDescriptors(Isolate* isolate);
- StrictMode strict_mode() const { return strict_mode_; }
- bool is_generator() const { return is_generator_; }
+ StrictMode strict_mode() const {
+ return StrictModeBits::decode(sub_minor_key());
+ }
+
+ bool is_generator() const { return IsGeneratorBits::decode(sub_minor_key()); }
private:
- class StrictModeBits: public BitField<bool, 0, 1> {};
- class IsGeneratorBits: public BitField<bool, 1, 1> {};
+ virtual Major MajorKey() const V8_OVERRIDE { return FastNewClosure; }
- Major MajorKey() const { return FastNewClosure; }
- int NotMissMinorKey() const {
- return StrictModeBits::encode(strict_mode_ == STRICT) |
- IsGeneratorBits::encode(is_generator_);
- }
+ class StrictModeBits : public BitField<StrictMode, 0, 1> {};
+ class IsGeneratorBits : public BitField<bool, 1, 1> {};
- StrictMode strict_mode_;
- bool is_generator_;
+ DISALLOW_COPY_AND_ASSIGN(FastNewClosureStub);
};
class AllocationSiteModeBits: public BitField<AllocationSiteMode, 0, 1> {};
// Ensure data fits within available bits.
- Major MajorKey() const { return FastCloneShallowArray; }
+ virtual Major MajorKey() const V8_OVERRIDE { return FastCloneShallowArray; }
int NotMissMinorKey() const {
return AllocationSiteModeBits::encode(allocation_site_mode_);
}
private:
int length_;
- Major MajorKey() const { return FastCloneShallowObject; }
+ virtual Major MajorKey() const V8_OVERRIDE { return FastCloneShallowObject; }
int NotMissMinorKey() const { return length_; }
DISALLOW_COPY_AND_ASSIGN(FastCloneShallowObjectStub);
CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE;
private:
- Major MajorKey() const { return CreateAllocationSite; }
- int NotMissMinorKey() const { return 0; }
+ virtual Major MajorKey() const V8_OVERRIDE { return CreateAllocationSite; }
DISALLOW_COPY_AND_ASSIGN(CreateAllocationSiteStub);
};
CodeStubInterfaceDescriptor* descriptor);
private:
- Major MajorKey() const { return Instanceof; }
+ virtual Major MajorKey() const V8_OVERRIDE { return Instanceof; }
Flags flags() const { return FlagBits::decode(minor_key_); }
void Generate(MacroAssembler* masm);
private:
- virtual CodeStub::Major MajorKey() const { return ArrayConstructor; }
+ virtual Major MajorKey() const V8_OVERRIDE { return ArrayConstructor; }
ArgumentCountKey argument_count() const {
return ArgumentCountBits::decode(minor_key_);
void Generate(MacroAssembler* masm);
private:
- virtual CodeStub::Major MajorKey() const { return InternalArrayConstructor; }
+ virtual Major MajorKey() const V8_OVERRIDE {
+ return InternalArrayConstructor;
+ }
void GenerateCase(MacroAssembler* masm, ElementsKind kind);
virtual void Generate(MacroAssembler* masm);
private:
- virtual CodeStub::Major MajorKey() const { return MathPow; }
+ virtual Major MajorKey() const V8_OVERRIDE { return MathPow; }
ExponentType exponent_type() const {
return ExponentTypeBits::decode(minor_key_);
void GenerateMiss(MacroAssembler* masm, IC::UtilityId id);
private:
- virtual CodeStub::Major MajorKey() const { return CallIC; }
+ virtual Major MajorKey() const V8_OVERRIDE { return CallIC; }
virtual void PrintState(OStream& os) const V8_OVERRIDE; // NOLINT
private:
virtual void PrintState(OStream& os) const V8_OVERRIDE; // NOLINT
- virtual CodeStub::Major MajorKey() const { return CallIC_Array; }
+ virtual Major MajorKey() const V8_OVERRIDE { return CallIC_Array; }
DISALLOW_COPY_AND_ASSIGN(CallIC_ArrayStub);
};
virtual Code::Kind GetCodeKind() const { return Code::HANDLER; }
private:
- virtual CodeStub::Major MajorKey() const { return FunctionPrototype; }
+ virtual Major MajorKey() const V8_OVERRIDE { return FunctionPrototype; }
DISALLOW_COPY_AND_ASSIGN(FunctionPrototypeStub);
};
private:
class EncodedLoadFieldByIndexBits : public BitField<int, 0, 13> {};
- virtual CodeStub::Major MajorKey() const { return LoadField; }
+ virtual Major MajorKey() const V8_OVERRIDE { return LoadField; }
FieldIndex index_;
};
virtual Code::StubType GetStubType() { return Code::FAST; }
private:
- virtual CodeStub::Major MajorKey() const { return LoadConstant; }
+ virtual Major MajorKey() const V8_OVERRIDE { return LoadConstant; }
};
virtual Code::StubType GetStubType() { return Code::FAST; }
private:
- virtual CodeStub::Major MajorKey() const { return StringLength; }
+ virtual Major MajorKey() const V8_OVERRIDE { return StringLength; }
};
private:
class EncodedStoreFieldByIndexBits : public BitField<int, 0, 13> {};
class RepresentationBits : public BitField<int, 13, 4> {};
- virtual CodeStub::Major MajorKey() const { return StoreField; }
+ virtual Major MajorKey() const V8_OVERRIDE { return StoreField; }
FieldIndex index_;
Representation representation_;
};
}
private:
- Major MajorKey() const { return StoreGlobal; }
+ virtual Major MajorKey() const V8_OVERRIDE { return StoreGlobal; }
class IsConstantBits: public BitField<bool, 0, 1> {};
class RepresentationBits: public BitField<Representation::Kind, 1, 8> {};
class RightStateField: public BitField<int, 7, 4> { };
class HandlerStateField: public BitField<int, 11, 4> { };
- virtual CodeStub::Major MajorKey() const { return CompareIC; }
+ virtual Major MajorKey() const V8_OVERRIDE { return CompareIC; }
virtual uint32_t MinorKey() const;
virtual Code::Kind GetCodeKind() const { return Code::COMPARE_IC; }
class NilValueField : public BitField<NilValue, 0, 1> {};
class TypesField : public BitField<byte, 1, NUMBER_OF_TYPES> {};
- virtual CodeStub::Major MajorKey() const { return CompareNilIC; }
+ virtual Major MajorKey() const V8_OVERRIDE { return CompareNilIC; }
virtual int NotMissMinorKey() const { return GetExtraICState(); }
NilValue nil_value_;
static void GenerateAheadOfTime(Isolate* isolate);
private:
- Major MajorKey() const { return CEntry; }
+ virtual Major MajorKey() const V8_OVERRIDE { return CEntry; }
bool save_doubles() const { return SaveDoublesBits::decode(minor_key_); }
#ifdef _WIN64
void GenerateBody(MacroAssembler* masm, bool is_construct);
private:
- Major MajorKey() const { return JSEntry; }
+ virtual Major MajorKey() const V8_OVERRIDE { return JSEntry; }
virtual void FinishCode(Handle<Code> code);
}
private:
- Major MajorKey() const { return ArgumentsAccess; }
+ virtual Major MajorKey() const V8_OVERRIDE { return ArgumentsAccess; }
Type type() const { return TypeBits::decode(minor_key_); }
explicit RegExpExecStub(Isolate* isolate) : PlatformCodeStub(isolate) { }
private:
- Major MajorKey() const { return RegExpExec; }
+ virtual Major MajorKey() const V8_OVERRIDE { return RegExpExec; }
void Generate(MacroAssembler* masm);
CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE;
virtual Major MajorKey() const V8_OVERRIDE { return RegExpConstructResult; }
- virtual int NotMissMinorKey() const V8_OVERRIDE { return 0; }
static void InstallDescriptors(Isolate* isolate);
CodeStubInterfaceDescriptor* descriptor);
private:
- Major MajorKey() const { return CallFunction; }
+ virtual Major MajorKey() const V8_OVERRIDE { return CallFunction; }
int argc() const { return ArgcBits::decode(minor_key_); }
int flags() const { return FlagBits::decode(minor_key_); }
CodeStubInterfaceDescriptor* descriptor);
private:
- Major MajorKey() const { return CallConstruct; }
+ virtual Major MajorKey() const V8_OVERRIDE { return CallConstruct; }
CallConstructorFlags flags() const { return FlagBits::decode(minor_key_); }
class LoadDictionaryElementStub : public HydrogenCodeStub {
public:
explicit LoadDictionaryElementStub(Isolate* isolate)
- : HydrogenCodeStub(isolate) {}
+ : HydrogenCodeStub(isolate) {
+ set_sub_minor_key(DICTIONARY_ELEMENTS);
+ }
virtual Handle<Code> GenerateCode() V8_OVERRIDE;
CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE;
private:
- Major MajorKey() const { return LoadElement; }
- int NotMissMinorKey() const { return DICTIONARY_ELEMENTS; }
+ virtual Major MajorKey() const V8_OVERRIDE { return LoadElement; }
DISALLOW_COPY_AND_ASSIGN(LoadDictionaryElementStub);
};
void Generate(MacroAssembler* masm);
private:
- Major MajorKey() const { return LoadElement; }
+ virtual Major MajorKey() const V8_OVERRIDE { return LoadElement; }
DISALLOW_COPY_AND_ASSIGN(LoadDictionaryElementPlatformStub);
};
virtual InlineCacheState GetICState() const { return GENERIC; }
private:
- Major MajorKey() const { return KeyedLoadGeneric; }
- int NotMissMinorKey() const { return 0; }
+ virtual Major MajorKey() const V8_OVERRIDE { return KeyedLoadGeneric; }
DISALLOW_COPY_AND_ASSIGN(KeyedLoadGenericStub);
};
virtual bool SometimesSetsUpAFrame() { return false; }
private:
- Major MajorKey() const { return DoubleToI; }
+ virtual Major MajorKey() const V8_OVERRIDE { return DoubleToI; }
Register source() const {
return Register::from_code(SourceRegisterBits::decode(minor_key_));
class IsJSArrayBits: public BitField<bool, 8, 1> {};
uint32_t bit_field_;
- Major MajorKey() const { return LoadElement; }
+ virtual Major MajorKey() const V8_OVERRIDE { return LoadElement; }
int NotMissMinorKey() const { return bit_field_; }
DISALLOW_COPY_AND_ASSIGN(LoadFastElementStub);
class IsJSArrayBits: public BitField<bool, 12, 1> {};
uint32_t bit_field_;
- Major MajorKey() const { return StoreElement; }
+ virtual Major MajorKey() const V8_OVERRIDE { return StoreElement; }
int NotMissMinorKey() const { return bit_field_; }
DISALLOW_COPY_AND_ASSIGN(StoreFastElementStub);
class IsJSArrayBits: public BitField<bool, 16, 1> {};
uint32_t bit_field_;
- Major MajorKey() const { return TransitionElementsKind; }
+ virtual Major MajorKey() const V8_OVERRIDE { return TransitionElementsKind; }
int NotMissMinorKey() const { return bit_field_; }
DISALLOW_COPY_AND_ASSIGN(TransitionElementsKindStub);
CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE;
private:
- Major MajorKey() const { return ArrayNoArgumentConstructor; }
+ virtual Major MajorKey() const V8_OVERRIDE {
+ return ArrayNoArgumentConstructor;
+ }
virtual void PrintName(OStream& os) const V8_OVERRIDE { // NOLINT
BasePrintName(os, "ArrayNoArgumentConstructorStub");
CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE;
private:
- Major MajorKey() const { return ArraySingleArgumentConstructor; }
+ virtual Major MajorKey() const V8_OVERRIDE {
+ return ArraySingleArgumentConstructor;
+ }
virtual void PrintName(OStream& os) const { // NOLINT
BasePrintName(os, "ArraySingleArgumentConstructorStub");
CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE;
private:
- Major MajorKey() const { return ArrayNArgumentsConstructor; }
+ virtual Major MajorKey() const V8_OVERRIDE {
+ return ArrayNArgumentsConstructor;
+ }
virtual void PrintName(OStream& os) const { // NOLINT
BasePrintName(os, "ArrayNArgumentsConstructorStub");
CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE;
private:
- Major MajorKey() const { return InternalArrayNoArgumentConstructor; }
+ virtual Major MajorKey() const V8_OVERRIDE {
+ return InternalArrayNoArgumentConstructor;
+ }
DISALLOW_COPY_AND_ASSIGN(InternalArrayNoArgumentConstructorStub);
};
CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE;
private:
- Major MajorKey() const { return InternalArraySingleArgumentConstructor; }
+ virtual Major MajorKey() const V8_OVERRIDE {
+ return InternalArraySingleArgumentConstructor;
+ }
DISALLOW_COPY_AND_ASSIGN(InternalArraySingleArgumentConstructorStub);
};
CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE;
private:
- Major MajorKey() const { return InternalArrayNArgumentsConstructor; }
+ virtual Major MajorKey() const V8_OVERRIDE {
+ return InternalArrayNArgumentsConstructor;
+ }
DISALLOW_COPY_AND_ASSIGN(InternalArrayNArgumentsConstructorStub);
};
void Generate(MacroAssembler* masm);
private:
- Major MajorKey() const { return StoreElement; }
+ virtual Major MajorKey() const V8_OVERRIDE { return StoreElement; }
ElementsKind elements_kind() const {
return ElementsKindBits::decode(minor_key_);
class TypesBits : public BitField<byte, 0, NUMBER_OF_TYPES> {};
class ResultModeBits : public BitField<ResultMode, NUMBER_OF_TYPES, 2> {};
- Major MajorKey() const { return ToBoolean; }
+ virtual Major MajorKey() const V8_OVERRIDE { return ToBoolean; }
int NotMissMinorKey() const {
return TypesBits::encode(types_.ToByte()) | ResultModeBits::encode(mode_);
}
class IsJSArrayBits: public BitField<bool, 16, 1> {};
class StoreModeBits: public BitField<KeyedAccessStoreMode, 17, 4> {};
- Major MajorKey() const { return ElementsTransitionAndStore; }
+ virtual Major MajorKey() const V8_OVERRIDE {
+ return ElementsTransitionAndStore;
+ }
int NotMissMinorKey() const {
return FromBits::encode(from_kind_) |
ToBits::encode(to_kind_) |
: PlatformCodeStub(isolate) { }
private:
- Major MajorKey() const { return StoreArrayLiteralElement; }
+ virtual Major MajorKey() const V8_OVERRIDE {
+ return StoreArrayLiteralElement;
+ }
void Generate(MacroAssembler* masm);
static void GenerateAheadOfTime(Isolate* isolate);
private:
- Major MajorKey() const { return StubFailureTrampoline; }
+ virtual Major MajorKey() const V8_OVERRIDE { return StubFailureTrampoline; }
StubFunctionMode function_mode() const {
return FunctionModeField::decode(minor_key_);
intptr_t stack_pointer,
Isolate* isolate);
- Major MajorKey() const { return ProfileEntryHook; }
+ virtual Major MajorKey() const V8_OVERRIDE { return ProfileEntryHook; }
void Generate(MacroAssembler* masm);