Chromium Code Reviews| Index: src/code-stubs.h |
| diff --git a/src/code-stubs.h b/src/code-stubs.h |
| index 55d7e5d809d12227531bded89766b17576d1e3e4..46c7b56847582325b4c49f87725c272e994d742a 100644 |
| --- a/src/code-stubs.h |
| +++ b/src/code-stubs.h |
| @@ -83,6 +83,7 @@ namespace internal { |
| V(TransitionElementsKind) \ |
| V(StoreArrayLiteralElement) \ |
| V(StubFailureTrampoline) \ |
| + V(ArrayConstructor) \ |
| V(ProfileEntryHook) \ |
| /* IC Handler stubs */ \ |
| V(LoadField) |
| @@ -266,6 +267,7 @@ struct CodeStubInterfaceDescriptor { |
| CodeStubInterfaceDescriptor(); |
| int register_param_count_; |
| const Register* stack_parameter_count_; |
| + int hint_stack_parameter_count_; |
| StubFunctionMode function_mode_; |
| Register* register_params_; |
| Address deoptimization_handler_; |
| @@ -277,8 +279,17 @@ struct CodeStubInterfaceDescriptor { |
| } |
| return register_param_count_; |
| } |
| + |
| + bool initialized() const { return register_param_count_ >= 0; } |
| }; |
| +// A helper to make up for the fact that type Register is not fully |
| +// defined outside of the platform directories |
| +#define DESCRIPTOR_GET_PARAMETER_REGISTER(descriptor, index) \ |
| + ((index) == (descriptor)->register_param_count_) \ |
| + ? *((descriptor)->stack_parameter_count_) \ |
| + : (descriptor)->register_params_[(index)] |
| + |
| class HydrogenCodeStub : public CodeStub { |
| public: |
| @@ -622,6 +633,22 @@ class InstanceofStub: public PlatformCodeStub { |
| }; |
| +class ArrayConstructorStub: public PlatformCodeStub { |
| + public: |
| + enum ArgumentCountKey { ANY, NONE, ONE, MORE_THAN_ONE }; |
| + explicit ArrayConstructorStub(Isolate* isolate, int argument_count); |
|
Hannes Payer (out of office)
2013/04/23 11:42:50
explicit is just used in the single argument case
mvstanton
2013/04/23 14:19:58
Done.
|
| + explicit ArrayConstructorStub(Isolate* isolate); |
| + |
| + void Generate(MacroAssembler* masm); |
| + |
| + private: |
| + virtual CodeStub::Major MajorKey() { return ArrayConstructor; } |
| + virtual int MinorKey() { return argument_count_; } |
| + |
| + ArgumentCountKey argument_count_; |
| +}; |
| + |
| + |
| class MathPowStub: public PlatformCodeStub { |
| public: |
| enum ExponentType { INTEGER, DOUBLE, TAGGED, ON_STACK}; |
| @@ -1447,10 +1474,48 @@ class TransitionElementsKindStub : public HydrogenCodeStub { |
| }; |
| -class ArrayNoArgumentConstructorStub : public HydrogenCodeStub { |
| +class ArrayConstructorStubBase : public HydrogenCodeStub { |
| public: |
| - ArrayNoArgumentConstructorStub() |
| + ArrayConstructorStubBase(ElementsKind kind, AllocationSiteMode mode) |
| : HydrogenCodeStub(CODE_STUB_IS_NOT_MISS) { |
| + bit_field_ = ElementsKindBits::encode(kind) | |
| + AllocationSiteModeBits::encode(mode == TRACK_ALLOCATION_SITE); |
| + } |
| + |
| + ElementsKind elements_kind() const { |
| + return ElementsKindBits::decode(bit_field_); |
| + } |
| + |
| + AllocationSiteMode mode() const { |
| + return AllocationSiteModeBits::decode(bit_field_) |
| + ? TRACK_ALLOCATION_SITE |
| + : DONT_TRACK_ALLOCATION_SITE; |
| + } |
| + |
| + virtual bool IsPregenerated() { return true; } |
| + static void GenerateStubsAheadOfTime(Isolate* isolate); |
| + static void InstallDescriptors(Isolate* isolate); |
| + |
| + // Parameters accessed via CodeStubGraphBuilder::GetParameter() |
| + static const int kPropertyCell = 0; |
| + |
| + private: |
| + int NotMissMinorKey() { return bit_field_; } |
| + |
| + class ElementsKindBits: public BitField<ElementsKind, 0, 8> {}; |
| + class AllocationSiteModeBits: public BitField<bool, 8, 1> {}; |
| + uint32_t bit_field_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(ArrayConstructorStubBase); |
| +}; |
| + |
| + |
| +class ArrayNoArgumentConstructorStub : public ArrayConstructorStubBase { |
| + public: |
| + ArrayNoArgumentConstructorStub( |
| + ElementsKind kind, |
| + AllocationSiteMode mode = TRACK_ALLOCATION_SITE) |
| + : ArrayConstructorStubBase(kind, mode) { |
| } |
| virtual Handle<Code> GenerateCode(); |
| @@ -1461,16 +1526,18 @@ class ArrayNoArgumentConstructorStub : public HydrogenCodeStub { |
| private: |
| Major MajorKey() { return ArrayNoArgumentConstructor; } |
| - int NotMissMinorKey() { return 0; } |
| DISALLOW_COPY_AND_ASSIGN(ArrayNoArgumentConstructorStub); |
| }; |
| -class ArraySingleArgumentConstructorStub : public HydrogenCodeStub { |
| +class ArraySingleArgumentConstructorStub : public ArrayConstructorStubBase { |
| public: |
| - ArraySingleArgumentConstructorStub() |
| - : HydrogenCodeStub(CODE_STUB_IS_NOT_MISS) {} |
| + ArraySingleArgumentConstructorStub( |
| + ElementsKind kind, |
| + AllocationSiteMode mode = TRACK_ALLOCATION_SITE) |
| + : ArrayConstructorStubBase(kind, mode) { |
| + } |
| virtual Handle<Code> GenerateCode(); |
| @@ -1480,16 +1547,18 @@ class ArraySingleArgumentConstructorStub : public HydrogenCodeStub { |
| private: |
| Major MajorKey() { return ArraySingleArgumentConstructor; } |
| - int NotMissMinorKey() { return 0; } |
| DISALLOW_COPY_AND_ASSIGN(ArraySingleArgumentConstructorStub); |
| }; |
| -class ArrayNArgumentsConstructorStub : public HydrogenCodeStub { |
| +class ArrayNArgumentsConstructorStub : public ArrayConstructorStubBase { |
| public: |
| - ArrayNArgumentsConstructorStub() |
| - : HydrogenCodeStub(CODE_STUB_IS_NOT_MISS) {} |
| + ArrayNArgumentsConstructorStub( |
| + ElementsKind kind, |
| + AllocationSiteMode mode = TRACK_ALLOCATION_SITE) : |
| + ArrayConstructorStubBase(kind, mode) { |
| + } |
| virtual Handle<Code> GenerateCode(); |
| @@ -1499,7 +1568,6 @@ class ArrayNArgumentsConstructorStub : public HydrogenCodeStub { |
| private: |
| Major MajorKey() { return ArrayNArgumentsConstructor; } |
| - int NotMissMinorKey() { return 0; } |
| DISALLOW_COPY_AND_ASSIGN(ArrayNArgumentsConstructorStub); |
| }; |