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