| Index: src/code-stubs.h
|
| diff --git a/src/code-stubs.h b/src/code-stubs.h
|
| index 4180e27da0a4f3189e6b6bccb13857903d25c204..a6c2294ba2d23f742363498aa708b9954be3900b 100644
|
| --- a/src/code-stubs.h
|
| +++ b/src/code-stubs.h
|
| @@ -277,11 +277,6 @@ struct CodeStubInterfaceDescriptor {
|
| int hint_stack_parameter_count_;
|
| StubFunctionMode function_mode_;
|
| Register* register_params_;
|
| - // Specifies Representations for the stub's parameter. Points to an array of
|
| - // Representations of the same length of the numbers of parameters to the
|
| - // stub, or if NULL (the default value), Representation of each parameter
|
| - // assumed to be Tagged()
|
| - Representation* register_param_representations_;
|
|
|
| Address deoptimization_handler_;
|
| HandlerArgumentsMode handler_arguments_mode_;
|
| @@ -586,18 +581,50 @@ class FastNewContextStub V8_FINAL : public HydrogenCodeStub {
|
| class FastCloneShallowArrayStub : public HydrogenCodeStub {
|
| public:
|
| // Maximum length of copied elements array.
|
| - static const int kMaximumInlinedCloneLength = 8;
|
| + static const int kMaximumClonedLength = 8;
|
| + enum Mode {
|
| + CLONE_ELEMENTS,
|
| + CLONE_DOUBLE_ELEMENTS,
|
| + COPY_ON_WRITE_ELEMENTS,
|
| + CLONE_ANY_ELEMENTS,
|
| + LAST_CLONE_MODE = CLONE_ANY_ELEMENTS
|
| + };
|
| +
|
| + static const int kFastCloneModeCount = LAST_CLONE_MODE + 1;
|
|
|
| FastCloneShallowArrayStub(Isolate* isolate,
|
| - AllocationSiteMode allocation_site_mode)
|
| + Mode mode,
|
| + AllocationSiteMode allocation_site_mode,
|
| + int length)
|
| : HydrogenCodeStub(isolate),
|
| - allocation_site_mode_(allocation_site_mode) {}
|
| + mode_(mode),
|
| + allocation_site_mode_(allocation_site_mode),
|
| + length_((mode == COPY_ON_WRITE_ELEMENTS) ? 0 : length) {
|
| + ASSERT_GE(length_, 0);
|
| + ASSERT_LE(length_, kMaximumClonedLength);
|
| + }
|
|
|
| + Mode mode() const { return mode_; }
|
| + int length() const { return length_; }
|
| AllocationSiteMode allocation_site_mode() const {
|
| return allocation_site_mode_;
|
| }
|
|
|
| - virtual Handle<Code> GenerateCode();
|
| + ElementsKind ComputeElementsKind() const {
|
| + switch (mode()) {
|
| + case CLONE_ELEMENTS:
|
| + case COPY_ON_WRITE_ELEMENTS:
|
| + return FAST_ELEMENTS;
|
| + case CLONE_DOUBLE_ELEMENTS:
|
| + return FAST_DOUBLE_ELEMENTS;
|
| + case CLONE_ANY_ELEMENTS:
|
| + /*fall-through*/;
|
| + }
|
| + UNREACHABLE();
|
| + return LAST_ELEMENTS_KIND;
|
| + }
|
| +
|
| + virtual Handle<Code> GenerateCode() V8_OVERRIDE;
|
|
|
| virtual void InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE;
|
| @@ -605,13 +632,22 @@ class FastCloneShallowArrayStub : public HydrogenCodeStub {
|
| static void InstallDescriptors(Isolate* isolate);
|
|
|
| private:
|
| + Mode mode_;
|
| AllocationSiteMode allocation_site_mode_;
|
| + int length_;
|
|
|
| class AllocationSiteModeBits: public BitField<AllocationSiteMode, 0, 1> {};
|
| + class ModeBits: public BitField<Mode, 1, 4> {};
|
| + class LengthBits: public BitField<int, 5, 4> {};
|
| // Ensure data fits within available bits.
|
| + STATIC_ASSERT(LAST_ALLOCATION_SITE_MODE == 1);
|
| + STATIC_ASSERT(kFastCloneModeCount < 16);
|
| + STATIC_ASSERT(kMaximumClonedLength < 16);
|
| Major MajorKey() { return FastCloneShallowArray; }
|
| int NotMissMinorKey() {
|
| - return AllocationSiteModeBits::encode(allocation_site_mode_);
|
| + return AllocationSiteModeBits::encode(allocation_site_mode_)
|
| + | ModeBits::encode(mode_)
|
| + | LengthBits::encode(length_);
|
| }
|
| };
|
|
|
|
|