Chromium Code Reviews| Index: src/code-stubs.h |
| diff --git a/src/code-stubs.h b/src/code-stubs.h |
| index 455945af280e3ada0d2149b50c88c9b11bd143bc..a5be52966a0d26d27650175335e141a63d89baba 100644 |
| --- a/src/code-stubs.h |
| +++ b/src/code-stubs.h |
| @@ -180,11 +180,15 @@ class CodeStub BASE_EMBEDDED { |
| // Lookup the code in the (possibly custom) cache. |
| bool FindCodeInCache(Code** code_out); |
| - virtual void InitializeInterfaceDescriptor( |
| - CodeStubInterfaceDescriptor* descriptor) {} |
| + virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() { |
|
mvstanton
2014/09/08 14:58:38
Good, I'll be able to add implementations for the
|
| + UNREACHABLE(); // Default returns an uninitialized descriptor. |
| + return CallInterfaceDescriptor(); |
| + } |
| + |
| + virtual void InitializeDescriptor(CodeStubDescriptor* descriptor) {} |
| - static void InitializeInterfaceDescriptor(Isolate* isolate, uint32_t key, |
| - CodeStubInterfaceDescriptor* desc); |
| + static void InitializeDescriptor(Isolate* isolate, uint32_t key, |
| + CodeStubDescriptor* desc); |
| // Returns information for computing the number key. |
| virtual Major MajorKey() const = 0; |
| @@ -293,11 +297,10 @@ class CodeStub BASE_EMBEDDED { |
| DEFINE_CODE_STUB(NAME, SUPER) |
| -#define DEFINE_HYDROGEN_CODE_STUB(NAME, SUPER) \ |
| - public: \ |
| - virtual void InitializeInterfaceDescriptor( \ |
| - CodeStubInterfaceDescriptor* descriptor) OVERRIDE; \ |
| - virtual Handle<Code> GenerateCode() OVERRIDE; \ |
| +#define DEFINE_HYDROGEN_CODE_STUB(NAME, SUPER) \ |
| + public: \ |
| + virtual void InitializeDescriptor(CodeStubDescriptor* descriptor) OVERRIDE; \ |
| + virtual Handle<Code> GenerateCode() OVERRIDE; \ |
| DEFINE_CODE_STUB(NAME, SUPER) |
| #define DEFINE_HANDLER_CODE_STUB(NAME, SUPER) \ |
| @@ -305,6 +308,12 @@ class CodeStub BASE_EMBEDDED { |
| virtual Handle<Code> GenerateCode() OVERRIDE; \ |
| DEFINE_CODE_STUB(NAME, SUPER) |
| +#define DEFINE_CALL_INTERFACE_DESCRIPTOR(NAME) \ |
| + public: \ |
| + virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() OVERRIDE { \ |
| + return NAME##Descriptor(isolate()); \ |
| + } |
| + |
| class PlatformCodeStub : public CodeStub { |
| public: |
| @@ -327,20 +336,16 @@ enum StubFunctionMode { NOT_JS_FUNCTION_STUB_MODE, JS_FUNCTION_STUB_MODE }; |
| enum HandlerArgumentsMode { DONT_PASS_ARGUMENTS, PASS_ARGUMENTS }; |
| -class CodeStubInterfaceDescriptor { |
| +class CodeStubDescriptor { |
| public: |
| - explicit CodeStubInterfaceDescriptor(CodeStub* stub); |
| + explicit CodeStubDescriptor(CodeStub* stub); |
| - CodeStubInterfaceDescriptor(Isolate* isolate, uint32_t stub_key); |
| + CodeStubDescriptor(Isolate* isolate, uint32_t stub_key); |
| - void Initialize(CodeStub::Major major, |
| - CallInterfaceDescriptor call_descriptor, |
| - Address deoptimization_handler = NULL, |
| + void Initialize(Address deoptimization_handler = NULL, |
| int hint_stack_parameter_count = -1, |
| StubFunctionMode function_mode = NOT_JS_FUNCTION_STUB_MODE); |
| - void Initialize(CodeStub::Major major, |
| - CallInterfaceDescriptor call_descriptor, |
| - Register stack_parameter_count, |
| + void Initialize(Register stack_parameter_count, |
| Address deoptimization_handler = NULL, |
| int hint_stack_parameter_count = -1, |
| StubFunctionMode function_mode = NOT_JS_FUNCTION_STUB_MODE, |
| @@ -354,34 +359,13 @@ class CodeStubInterfaceDescriptor { |
| DCHECK(!stack_parameter_count_.is_valid()); |
| } |
| - bool IsInitialized() const { return call_descriptor_.IsInitialized(); } |
| - |
| + void set_call_descriptor(CallInterfaceDescriptor d) { call_descriptor_ = d; } |
| CallInterfaceDescriptor call_descriptor() const { return call_descriptor_; } |
| - int GetEnvironmentLength() const { |
| - return call_descriptor().GetEnvironmentLength(); |
| - } |
| - |
| - int GetRegisterParameterCount() const { |
| - return call_descriptor().GetRegisterParameterCount(); |
| - } |
| - |
| - Register GetParameterRegister(int index) const { |
| - return call_descriptor().GetParameterRegister(index); |
| - } |
| - |
| - Representation GetParameterRepresentation(int index) const { |
| - return call_descriptor().GetParameterRepresentation(index); |
| - } |
| - |
| int GetEnvironmentParameterCount() const { |
| return call_descriptor().GetEnvironmentParameterCount(); |
| } |
| - Register GetEnvironmentParameterRegister(int index) const { |
| - return call_descriptor().GetEnvironmentParameterRegister(index); |
| - } |
| - |
| Representation GetEnvironmentParameterRepresentation(int index) const { |
| return call_descriptor().GetEnvironmentParameterRepresentation(index); |
| } |
| @@ -412,7 +396,6 @@ class CodeStubInterfaceDescriptor { |
| Register stack_parameter_count() const { return stack_parameter_count_; } |
| StubFunctionMode function_mode() const { return function_mode_; } |
| Address deoptimization_handler() const { return deoptimization_handler_; } |
| - CodeStub::Major MajorKey() const { return major_; } |
| private: |
| CallInterfaceDescriptor call_descriptor_; |
| @@ -427,7 +410,6 @@ class CodeStubInterfaceDescriptor { |
| ExternalReference miss_handler_; |
| bool has_miss_handler_; |
| - CodeStub::Major major_; |
| }; |
| @@ -451,7 +433,7 @@ class HydrogenCodeStub : public CodeStub { |
| bool IsUninitialized() const { return IsMissBits::decode(minor_key_); } |
| - Handle<Code> GenerateLightweightMissCode(); |
| + Handle<Code> GenerateLightweightMissCode(ExternalReference miss); |
| template<class StateType> |
| void TraceTransition(StateType from, StateType to); |
| @@ -475,7 +457,7 @@ class HydrogenCodeStub : public CodeStub { |
| class IsMissBits : public BitField<bool, kSubMinorKeyBits, 1> {}; |
| class SubMinorKeyBits : public BitField<int, 0, kSubMinorKeyBits> {}; |
| - void GenerateLightweightMiss(MacroAssembler* masm); |
| + void GenerateLightweightMiss(MacroAssembler* masm, ExternalReference miss); |
| DEFINE_CODE_STUB_BASE(HydrogenCodeStub, CodeStub); |
| }; |
| @@ -549,6 +531,7 @@ class ToNumberStub: public HydrogenCodeStub { |
| public: |
| explicit ToNumberStub(Isolate* isolate) : HydrogenCodeStub(isolate) { } |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(ToNumber); |
| DEFINE_HYDROGEN_CODE_STUB(ToNumber, HydrogenCodeStub); |
| }; |
| @@ -560,6 +543,7 @@ class NumberToStringStub FINAL : public HydrogenCodeStub { |
| // Parameters accessed via CodeStubGraphBuilder::GetParameter() |
| static const int kNumber = 0; |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(NumberToString); |
| DEFINE_HYDROGEN_CODE_STUB(NumberToString, HydrogenCodeStub); |
| }; |
| @@ -583,6 +567,7 @@ class FastNewClosureStub : public HydrogenCodeStub { |
| class StrictModeBits : public BitField<StrictMode, 0, 1> {}; |
| class IsGeneratorBits : public BitField<bool, 1, 1> {}; |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(FastNewClosure); |
| DEFINE_HYDROGEN_CODE_STUB(FastNewClosure, HydrogenCodeStub); |
| }; |
| @@ -604,6 +589,7 @@ class FastNewContextStub FINAL : public HydrogenCodeStub { |
| private: |
| class SlotsBits : public BitField<int, 0, 8> {}; |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(FastNewContext); |
| DEFINE_HYDROGEN_CODE_STUB(FastNewContext, HydrogenCodeStub); |
| }; |
| @@ -623,6 +609,7 @@ class FastCloneShallowArrayStub : public HydrogenCodeStub { |
| private: |
| class AllocationSiteModeBits: public BitField<AllocationSiteMode, 0, 1> {}; |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(FastCloneShallowArray); |
| DEFINE_HYDROGEN_CODE_STUB(FastCloneShallowArray, HydrogenCodeStub); |
| }; |
| @@ -644,6 +631,7 @@ class FastCloneShallowObjectStub : public HydrogenCodeStub { |
| private: |
| class LengthBits : public BitField<int, 0, 4> {}; |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(FastCloneShallowObject); |
| DEFINE_HYDROGEN_CODE_STUB(FastCloneShallowObject, HydrogenCodeStub); |
| }; |
| @@ -655,6 +643,7 @@ class CreateAllocationSiteStub : public HydrogenCodeStub { |
| static void GenerateAheadOfTime(Isolate* isolate); |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(CreateAllocationSite); |
| DEFINE_HYDROGEN_CODE_STUB(CreateAllocationSite, HydrogenCodeStub); |
| }; |
| @@ -675,9 +664,6 @@ class InstanceofStub: public PlatformCodeStub { |
| static Register left() { return InstanceofDescriptor::left(); } |
| static Register right() { return InstanceofDescriptor::right(); } |
| - virtual void InitializeInterfaceDescriptor( |
| - CodeStubInterfaceDescriptor* descriptor); |
| - |
| private: |
| Flags flags() const { return FlagBits::decode(minor_key_); } |
| @@ -695,6 +681,7 @@ class InstanceofStub: public PlatformCodeStub { |
| class FlagBits : public BitField<Flags, 0, 3> {}; |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(Instanceof); |
| DEFINE_PLATFORM_CODE_STUB(Instanceof, PlatformCodeStub); |
| }; |
| @@ -834,8 +821,9 @@ class HandlerStub : public HydrogenCodeStub { |
| virtual ExtraICState GetExtraICState() const { return kind(); } |
| virtual InlineCacheState GetICState() const { return MONOMORPHIC; } |
| - virtual void InitializeInterfaceDescriptor( |
| - CodeStubInterfaceDescriptor* descriptor) OVERRIDE; |
| + virtual void InitializeDescriptor(CodeStubDescriptor* descriptor) OVERRIDE; |
| + |
| + virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() OVERRIDE; |
| protected: |
| explicit HandlerStub(Isolate* isolate) : HydrogenCodeStub(isolate) {} |
| @@ -1069,6 +1057,7 @@ class BinaryOpICStub : public HydrogenCodeStub { |
| static void GenerateAheadOfTime(Isolate* isolate, |
| const BinaryOpIC::State& state); |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOp); |
| DEFINE_HYDROGEN_CODE_STUB(BinaryOpIC, HydrogenCodeStub); |
| }; |
| @@ -1137,6 +1126,7 @@ class BinaryOpWithAllocationSiteStub FINAL : public BinaryOpICStub { |
| static const int kLeft = 1; |
| static const int kRight = 2; |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOpWithAllocationSite); |
| DEFINE_HYDROGEN_CODE_STUB(BinaryOpWithAllocationSite, BinaryOpICStub); |
| }; |
| @@ -1180,6 +1170,7 @@ class StringAddStub FINAL : public HydrogenCodeStub { |
| virtual void PrintBaseName(OStream& os) const OVERRIDE; // NOLINT |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(StringAdd); |
| DEFINE_HYDROGEN_CODE_STUB(StringAdd, HydrogenCodeStub); |
| }; |
| @@ -1319,6 +1310,7 @@ class CompareNilICStub : public HydrogenCodeStub { |
| friend class CompareNilIC; |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(CompareNil); |
| DEFINE_HYDROGEN_CODE_STUB(CompareNilIC, HydrogenCodeStub); |
| }; |
| @@ -1434,6 +1426,7 @@ class RegExpConstructResultStub FINAL : public HydrogenCodeStub { |
| static const int kIndex = 1; |
| static const int kInput = 2; |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(RegExpConstructResult); |
| DEFINE_HYDROGEN_CODE_STUB(RegExpConstructResult, HydrogenCodeStub); |
| }; |
| @@ -1446,9 +1439,6 @@ class CallFunctionStub: public PlatformCodeStub { |
| minor_key_ = ArgcBits::encode(argc) | FlagBits::encode(flags); |
| } |
| - virtual void InitializeInterfaceDescriptor( |
| - CodeStubInterfaceDescriptor* descriptor); |
| - |
| static int ExtractArgcFromMinorKey(int minor_key) { |
| return ArgcBits::decode(minor_key); |
| } |
| @@ -1470,6 +1460,7 @@ class CallFunctionStub: public PlatformCodeStub { |
| class ArgcBits : public BitField<unsigned, 2, Code::kArgumentsBits> {}; |
| STATIC_ASSERT(Code::kArgumentsBits + 2 <= kStubMinorKeyBits); |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(CallFunction); |
| DEFINE_PLATFORM_CODE_STUB(CallFunction, PlatformCodeStub); |
| }; |
| @@ -1481,9 +1472,6 @@ class CallConstructStub: public PlatformCodeStub { |
| minor_key_ = FlagBits::encode(flags); |
| } |
| - virtual void InitializeInterfaceDescriptor( |
| - CodeStubInterfaceDescriptor* descriptor); |
| - |
| virtual void FinishCode(Handle<Code> code) { |
| code->set_has_function_cache(RecordCallTarget()); |
| } |
| @@ -1499,6 +1487,7 @@ class CallConstructStub: public PlatformCodeStub { |
| class FlagBits : public BitField<CallConstructorFlags, 0, 1> {}; |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(CallConstruct); |
| DEFINE_PLATFORM_CODE_STUB(CallConstruct, PlatformCodeStub); |
| }; |
| @@ -1682,6 +1671,7 @@ class LoadDictionaryElementStub : public HydrogenCodeStub { |
| explicit LoadDictionaryElementStub(Isolate* isolate) |
| : HydrogenCodeStub(isolate) {} |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(Load); |
| DEFINE_HYDROGEN_CODE_STUB(LoadDictionaryElement, HydrogenCodeStub); |
| }; |
| @@ -1693,6 +1683,7 @@ class KeyedLoadGenericStub : public HydrogenCodeStub { |
| virtual Code::Kind GetCodeKind() const { return Code::KEYED_LOAD_IC; } |
| virtual InlineCacheState GetICState() const { return GENERIC; } |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(Load); |
| DEFINE_HYDROGEN_CODE_STUB(KeyedLoadGeneric, HydrogenCodeStub); |
| }; |
| @@ -1753,6 +1744,7 @@ class MegamorphicLoadStub : public HydrogenCodeStub { |
| return static_cast<ExtraICState>(sub_minor_key()); |
| } |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(Load); |
| DEFINE_HYDROGEN_CODE_STUB(MegamorphicLoad, HydrogenCodeStub); |
| }; |
| @@ -1777,6 +1769,7 @@ class VectorLoadStub : public HydrogenCodeStub { |
| private: |
| LoadIC::State state() const { return LoadIC::State(GetExtraICState()); } |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(VectorLoadIC); |
| DEFINE_HYDROGEN_CODE_STUB(VectorLoad, HydrogenCodeStub); |
| }; |
| @@ -1790,6 +1783,7 @@ class VectorKeyedLoadStub : public VectorLoadStub { |
| return Code::KEYED_LOAD_IC; |
| } |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(VectorLoadIC); |
| DEFINE_HYDROGEN_CODE_STUB(VectorKeyedLoad, VectorLoadStub); |
| }; |
| @@ -1859,6 +1853,7 @@ class LoadFastElementStub : public HydrogenCodeStub { |
| class ElementsKindBits: public BitField<ElementsKind, 0, 8> {}; |
| class IsJSArrayBits: public BitField<bool, 8, 1> {}; |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(Load); |
| DEFINE_HYDROGEN_CODE_STUB(LoadFastElement, HydrogenCodeStub); |
| }; |
| @@ -1888,6 +1883,7 @@ class StoreFastElementStub : public HydrogenCodeStub { |
| class StoreModeBits: public BitField<KeyedAccessStoreMode, 8, 4> {}; |
| class IsJSArrayBits: public BitField<bool, 12, 1> {}; |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(Store); |
| DEFINE_HYDROGEN_CODE_STUB(StoreFastElement, HydrogenCodeStub); |
| }; |
| @@ -1916,6 +1912,7 @@ class TransitionElementsKindStub : public HydrogenCodeStub { |
| class ToKindBits: public BitField<ElementsKind, 0, 8> {}; |
| class IsJSArrayBits: public BitField<bool, 16, 1> {}; |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(TransitionElementsKind); |
| DEFINE_HYDROGEN_CODE_STUB(TransitionElementsKind, HydrogenCodeStub); |
| }; |
| @@ -1978,6 +1975,7 @@ class ArrayNoArgumentConstructorStub : public ArrayConstructorStubBase { |
| BasePrintName(os, "ArrayNoArgumentConstructorStub"); |
| } |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(ArrayConstructorConstantArgCount); |
| DEFINE_HYDROGEN_CODE_STUB(ArrayNoArgumentConstructor, |
| ArrayConstructorStubBase); |
| }; |
| @@ -1997,6 +1995,7 @@ class ArraySingleArgumentConstructorStub : public ArrayConstructorStubBase { |
| BasePrintName(os, "ArraySingleArgumentConstructorStub"); |
| } |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(ArrayConstructor); |
| DEFINE_HYDROGEN_CODE_STUB(ArraySingleArgumentConstructor, |
| ArrayConstructorStubBase); |
| }; |
| @@ -2016,6 +2015,7 @@ class ArrayNArgumentsConstructorStub : public ArrayConstructorStubBase { |
| BasePrintName(os, "ArrayNArgumentsConstructorStub"); |
| } |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(ArrayConstructor); |
| DEFINE_HYDROGEN_CODE_STUB(ArrayNArgumentsConstructor, |
| ArrayConstructorStubBase); |
| }; |
| @@ -2051,6 +2051,7 @@ class InternalArrayNoArgumentConstructorStub : public |
| ElementsKind kind) |
| : InternalArrayConstructorStubBase(isolate, kind) { } |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(InternalArrayConstructorConstantArgCount); |
| DEFINE_HYDROGEN_CODE_STUB(InternalArrayNoArgumentConstructor, |
| InternalArrayConstructorStubBase); |
| }; |
| @@ -2063,6 +2064,7 @@ class InternalArraySingleArgumentConstructorStub : public |
| ElementsKind kind) |
| : InternalArrayConstructorStubBase(isolate, kind) { } |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(InternalArrayConstructor); |
| DEFINE_HYDROGEN_CODE_STUB(InternalArraySingleArgumentConstructor, |
| InternalArrayConstructorStubBase); |
| }; |
| @@ -2074,6 +2076,7 @@ class InternalArrayNArgumentsConstructorStub : public |
| InternalArrayNArgumentsConstructorStub(Isolate* isolate, ElementsKind kind) |
| : InternalArrayConstructorStubBase(isolate, kind) { } |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(InternalArrayConstructor); |
| DEFINE_HYDROGEN_CODE_STUB(InternalArrayNArgumentsConstructor, |
| InternalArrayConstructorStubBase); |
| }; |
| @@ -2179,6 +2182,7 @@ class ToBooleanStub: public HydrogenCodeStub { |
| class TypesBits : public BitField<byte, 0, NUMBER_OF_TYPES> {}; |
| class ResultModeBits : public BitField<ResultMode, NUMBER_OF_TYPES, 2> {}; |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(ToBoolean); |
| DEFINE_HYDROGEN_CODE_STUB(ToBoolean, HydrogenCodeStub); |
| }; |
| @@ -2232,6 +2236,7 @@ class ElementsTransitionAndStoreStub : public HydrogenCodeStub { |
| class IsJSArrayBits : public BitField<bool, 16, 1> {}; |
| class StoreModeBits : public BitField<KeyedAccessStoreMode, 17, 4> {}; |
| + DEFINE_CALL_INTERFACE_DESCRIPTOR(ElementTransitionAndStore); |
| DEFINE_HYDROGEN_CODE_STUB(ElementsTransitionAndStore, HydrogenCodeStub); |
| }; |
| @@ -2319,6 +2324,7 @@ class StringCompareStub : public PlatformCodeStub { |
| }; |
| +#undef DEFINE_CALL_INTERFACE_DESCRIPTOR |
| #undef DEFINE_PLATFORM_CODE_STUB |
| #undef DEFINE_HANDLER_CODE_STUB |
| #undef DEFINE_HYDROGEN_CODE_STUB |