Index: src/code-stubs.h |
diff --git a/src/code-stubs.h b/src/code-stubs.h |
index e4cbe1863a2c117db9916c950c7f1ae9e924bcc9..14781799c59db971f2f6afc476f479c9c3661890 100644 |
--- a/src/code-stubs.h |
+++ b/src/code-stubs.h |
@@ -84,7 +84,8 @@ namespace internal { |
V(KeyedStoreElement) \ |
V(DebuggerStatement) \ |
V(NameDictionaryLookup) \ |
- V(ElementsTransitionAndStore) \ |
+ V(ElementsTransitionAndStoreStrict) \ |
+ V(ElementsTransitionAndStoreNonStrict) \ |
danno
2013/07/10 12:33:44
I had another look at KeyedStoreIC_Miss and KeyedS
Benedikt Meurer
2013/07/10 13:23:45
Done.
|
V(TransitionElementsKind) \ |
V(StoreArrayLiteralElement) \ |
V(StubFailureTrampoline) \ |
@@ -2210,47 +2211,97 @@ class ToBooleanStub: public HydrogenCodeStub { |
}; |
-class ElementsTransitionAndStoreStub : public PlatformCodeStub { |
+class ElementsTransitionAndStoreStub : public HydrogenCodeStub { |
public: |
+ ElementsKind from() const { return from_; } |
+ ElementsKind to() const { return to_; } |
+ bool is_jsarray() const { return is_jsarray_; } |
+ KeyedAccessStoreMode store_mode() const { return store_mode_; } |
+ |
+ Handle<Code> GenerateCode(); |
+ |
+ void InitializeInterfaceDescriptor( |
+ Isolate* isolate, |
+ CodeStubInterfaceDescriptor* descriptor); |
+ |
+ protected: |
ElementsTransitionAndStoreStub(ElementsKind from, |
ElementsKind to, |
bool is_jsarray, |
- StrictModeFlag strict_mode, |
KeyedAccessStoreMode store_mode) |
: from_(from), |
to_(to), |
is_jsarray_(is_jsarray), |
- strict_mode_(strict_mode), |
- store_mode_(store_mode) {} |
+ store_mode_(store_mode) { |
+ ASSERT(!IsFastHoleyElementsKind(from) || IsFastHoleyElementsKind(to)); |
+ } |
+ |
+ virtual Address GetDeoptimizationHandler() const = 0; |
private: |
- class FromBits: public BitField<ElementsKind, 0, 8> {}; |
- class ToBits: public BitField<ElementsKind, 8, 8> {}; |
- class IsJSArrayBits: public BitField<bool, 16, 1> {}; |
- class StrictModeBits: public BitField<StrictModeFlag, 17, 1> {}; |
+ class FromBits: public BitField<ElementsKind, 0, 8> {}; |
+ class ToBits: public BitField<ElementsKind, 8, 8> {}; |
+ class IsJSArrayBits: public BitField<bool, 16, 1> {}; |
class StoreModeBits: public BitField<KeyedAccessStoreMode, 18, 4> {}; |
- Major MajorKey() { return ElementsTransitionAndStore; } |
- int MinorKey() { |
- return FromBits::encode(from_) | |
- ToBits::encode(to_) | |
- IsJSArrayBits::encode(is_jsarray_) | |
- StrictModeBits::encode(strict_mode_) | |
- StoreModeBits::encode(store_mode_); |
+ int NotMissMinorKey() { |
+ return FromBits::encode(from()) | |
+ ToBits::encode(to()) | |
+ IsJSArrayBits::encode(is_jsarray()) | |
+ StoreModeBits::encode(store_mode()); |
} |
- void Generate(MacroAssembler* masm); |
- |
ElementsKind from_; |
ElementsKind to_; |
bool is_jsarray_; |
- StrictModeFlag strict_mode_; |
KeyedAccessStoreMode store_mode_; |
DISALLOW_COPY_AND_ASSIGN(ElementsTransitionAndStoreStub); |
}; |
+class ElementsTransitionAndStoreNonStrictStub |
+ : public ElementsTransitionAndStoreStub { |
+ public: |
+ ElementsTransitionAndStoreNonStrictStub(ElementsKind from, |
+ ElementsKind to, |
+ bool is_jsarray, |
+ KeyedAccessStoreMode store_mode) |
+ : ElementsTransitionAndStoreStub(from, to, is_jsarray, store_mode) { } |
+ |
+ private: |
+ Address GetDeoptimizationHandler() const { |
+ return Runtime::FunctionForId( |
+ Runtime::kElementsTransitionAndStoreNonStrict)->entry; |
+ } |
+ |
+ Major MajorKey() { return ElementsTransitionAndStoreNonStrict; } |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ElementsTransitionAndStoreNonStrictStub); |
+}; |
+ |
+ |
+class ElementsTransitionAndStoreStrictStub |
+ : public ElementsTransitionAndStoreStub { |
+ public: |
+ ElementsTransitionAndStoreStrictStub(ElementsKind from, |
+ ElementsKind to, |
+ bool is_jsarray, |
+ KeyedAccessStoreMode store_mode) |
+ : ElementsTransitionAndStoreStub(from, to, is_jsarray, store_mode) { } |
+ |
+ private: |
+ Address GetDeoptimizationHandler() const { |
+ return Runtime::FunctionForId( |
+ Runtime::kElementsTransitionAndStoreStrict)->entry; |
+ } |
+ |
+ Major MajorKey() { return ElementsTransitionAndStoreStrict; } |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ElementsTransitionAndStoreStrictStub); |
+}; |
+ |
+ |
class StoreArrayLiteralElementStub : public PlatformCodeStub { |
public: |
StoreArrayLiteralElementStub() |