Index: src/code-stubs.h |
diff --git a/src/code-stubs.h b/src/code-stubs.h |
index 55d7e5d809d12227531bded89766b17576d1e3e4..09dce88e190d991311d5c444fbaf6428907401c9 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,9 @@ struct CodeStubInterfaceDescriptor { |
CodeStubInterfaceDescriptor(); |
int register_param_count_; |
const Register* stack_parameter_count_; |
+ // if hint_stack_parameter_count_ > 0, the code stub can optimize the |
+ // return sequence. Default value is -1, which means it is ignored. |
+ int hint_stack_parameter_count_; |
StubFunctionMode function_mode_; |
Register* register_params_; |
Address deoptimization_handler_; |
@@ -277,8 +281,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 +635,22 @@ class InstanceofStub: public PlatformCodeStub { |
}; |
+class ArrayConstructorStub: public PlatformCodeStub { |
+ public: |
+ enum ArgumentCountKey { ANY, NONE, ONE, MORE_THAN_ONE }; |
+ ArrayConstructorStub(Isolate* isolate, int argument_count); |
+ 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 +1476,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 +1528,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 +1549,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 +1570,6 @@ class ArrayNArgumentsConstructorStub : public HydrogenCodeStub { |
private: |
Major MajorKey() { return ArrayNArgumentsConstructor; } |
- int NotMissMinorKey() { return 0; } |
DISALLOW_COPY_AND_ASSIGN(ArrayNArgumentsConstructorStub); |
}; |