| 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.
|
|
|