Index: src/code-stubs.h |
diff --git a/src/code-stubs.h b/src/code-stubs.h |
index c58acd6b16d4674a2b4da3f7a49d6ceca0c62cfe..84d9b023b3a237b36aee866c75b1ed5119e20d76 100644 |
--- a/src/code-stubs.h |
+++ b/src/code-stubs.h |
@@ -40,6 +40,7 @@ namespace internal { |
#define CODE_STUB_LIST_ALL_PLATFORMS(V) \ |
V(CallFunction) \ |
V(CallConstruct) \ |
+ V(UnaryOp) \ |
V(BinaryOp) \ |
V(StringAdd) \ |
V(SubString) \ |
@@ -592,6 +593,73 @@ class StoreGlobalStub : public HydrogenCodeStub { |
}; |
+class UnaryOpStub : public HydrogenCodeStub { |
+ public: |
+ // Stub without type info available -> construct uninitialized |
+ explicit UnaryOpStub(Token::Value operation) |
+ : HydrogenCodeStub(UNINITIALIZED), operation_(operation) { } |
+ explicit UnaryOpStub(Code::ExtraICState ic_state) : |
+ state_(StateBits::decode(ic_state)), |
+ operation_(OperatorBits::decode(ic_state)) { } |
+ |
+ virtual void InitializeInterfaceDescriptor( |
+ Isolate* isolate, |
+ CodeStubInterfaceDescriptor* descriptor); |
+ |
+ virtual Code::Kind GetCodeKind() const { return Code::UNARY_OP_IC; } |
+ virtual InlineCacheState GetICState() { |
+ if (state_.Contains(GENERIC)) { |
+ return MEGAMORPHIC; |
+ } else if (state_.IsEmpty()) { |
+ return PREMONOMORPHIC; |
+ } else { |
+ return MONOMORPHIC; |
+ } |
+ } |
+ virtual Code::ExtraICState GetExtraICState() { |
+ return OperatorBits::encode(operation_) | |
+ StateBits::encode(state_.ToIntegral()); |
+ } |
+ |
+ Token::Value operation() { return operation_; } |
+ Handle<JSFunction> ToJSFunction(Isolate* isolate); |
+ Builtins::JavaScript ToJSBuiltin(); |
+ |
+ void UpdateStatus(Handle<Object> object); |
+ MaybeObject* Result(Handle<Object> object, Isolate* isolate); |
+ Handle<Code> GenerateCode(); |
+ Handle<Type> GetType(Isolate* isolate); |
+ |
+ protected: |
+ void PrintState(StringStream* stream); |
+ void PrintBaseName(StringStream* stream); |
+ |
+ private: |
+ enum UnaryOpType { |
+ SMI, |
+ HEAP_NUMBER, |
+ GENERIC, |
+ NUMBER_OF_TYPES |
+ }; |
+ |
+ class State : public EnumSet<UnaryOpType, byte> { |
+ public: |
+ State() : EnumSet<UnaryOpType, byte>() { } |
+ explicit State(byte bits) : EnumSet<UnaryOpType, byte>(bits) { } |
+ void Print(StringStream* stream) const; |
+ }; |
+ |
+ class StateBits : public BitField<int, 0, NUMBER_OF_TYPES> { }; |
+ class OperatorBits : public BitField<Token::Value, NUMBER_OF_TYPES, 8> { }; |
+ |
+ State state_; |
+ Token::Value operation_; |
+ |
+ virtual CodeStub::Major MajorKey() { return UnaryOp; } |
+ virtual int NotMissMinorKey() { return GetExtraICState(); } |
+}; |
+ |
+ |
class FastCloneShallowArrayStub : public HydrogenCodeStub { |
public: |
// Maximum length of copied elements array. |