| Index: src/ic.h
 | 
| diff --git a/src/ic.h b/src/ic.h
 | 
| index 213a48182635badf5c833729e0d8d143e999b6c8..8e2890bfad09853e0d0b23804ba2a66c6bc0bb06 100644
 | 
| --- a/src/ic.h
 | 
| +++ b/src/ic.h
 | 
| @@ -42,6 +42,7 @@ const int kMaxKeyedPolymorphism = 4;
 | 
|  #define IC_UTIL_LIST(ICU)                             \
 | 
|    ICU(LoadIC_Miss)                                    \
 | 
|    ICU(KeyedLoadIC_Miss)                               \
 | 
| +  ICU(CallIC_Miss)                                    \
 | 
|    ICU(StoreIC_Miss)                                   \
 | 
|    ICU(StoreIC_ArrayLength)                            \
 | 
|    ICU(StoreIC_Slow)                                   \
 | 
| @@ -111,6 +112,10 @@ class IC {
 | 
|    bool IsStoreStub() const {
 | 
|      return target()->is_store_stub() || target()->is_keyed_store_stub();
 | 
|    }
 | 
| +
 | 
| +  bool IsCallStub() const {
 | 
| +    return target()->is_call_stub();
 | 
| +  }
 | 
|  #endif
 | 
|  
 | 
|    // Determines which map must be used for keeping the code stub.
 | 
| @@ -280,6 +285,93 @@ class IC_Utility {
 | 
|  };
 | 
|  
 | 
|  
 | 
| +class CallIC: public IC {
 | 
| + public:
 | 
| +  enum CallType { METHOD, FUNCTION };
 | 
| +  enum StubType { GENERIC, MONOMORPHIC };
 | 
| +  enum ArgumentCheck { ARGUMENTS_MATCH, ARGUMENTS_DONT_MATCH };
 | 
| +  enum FunctionAttributes { NOT_STRICT_OR_NATIVE, STRICT_OR_NATIVE };
 | 
| +
 | 
| +  class State V8_FINAL BASE_EMBEDDED {
 | 
| +   public:
 | 
| +    explicit State(ExtraICState extra_ic_state);
 | 
| +
 | 
| +    State(int argc,
 | 
| +          CallType call_type,
 | 
| +          StubType stub_type = GENERIC,
 | 
| +          ArgumentCheck argument_check = ARGUMENTS_MATCH,
 | 
| +          FunctionAttributes attributes = NOT_STRICT_OR_NATIVE)
 | 
| +        : argc_(argc),
 | 
| +        call_type_(call_type),
 | 
| +        stub_type_(stub_type),
 | 
| +        argument_check_(argument_check),
 | 
| +        function_attributes_(attributes) {
 | 
| +    }
 | 
| +
 | 
| +    InlineCacheState GetICState() const {
 | 
| +      return stub_type_ == CallIC::MONOMORPHIC
 | 
| +          ? ::v8::internal::MONOMORPHIC
 | 
| +          : ::v8::internal::GENERIC;
 | 
| +    }
 | 
| +
 | 
| +    ExtraICState GetExtraICState() const;
 | 
| +
 | 
| +    static void GenerateAheadOfTime(
 | 
| +        Isolate*, void (*Generate)(Isolate*, const State&));
 | 
| +
 | 
| +    int arg_count() const { return argc_; }
 | 
| +
 | 
| +    CallType call_type() const { return call_type_; }
 | 
| +    StubType stub_type() const { return stub_type_; }
 | 
| +    ArgumentCheck argument_check() const { return argument_check_; }
 | 
| +    FunctionAttributes function_attributes() const {
 | 
| +      return function_attributes_;
 | 
| +    }
 | 
| +
 | 
| +    void Print(StringStream* stream) const;
 | 
| +
 | 
| +   private:
 | 
| +    class ArgBits: public BitField<int, 0, Code::kArgumentsBits> {};
 | 
| +    class CallTypeBits: public BitField<CallType, Code::kArgumentsBits, 1> {};
 | 
| +    class StubTypeBits:
 | 
| +        public BitField<StubType, Code::kArgumentsBits + 1, 1> {};  // NOLINT
 | 
| +    class ArgumentCheckBits:
 | 
| +        public BitField<ArgumentCheck,
 | 
| +            Code::kArgumentsBits + 2, 1> {};  // NOLINT
 | 
| +    class FunctionAttributeBits:
 | 
| +        public BitField<FunctionAttributes,
 | 
| +            Code::kArgumentsBits + 3, 1> {};  // NOLINT
 | 
| +
 | 
| +    int argc_;
 | 
| +    CallType call_type_;
 | 
| +    StubType stub_type_;
 | 
| +    ArgumentCheck argument_check_;
 | 
| +    FunctionAttributes function_attributes_;
 | 
| +  };
 | 
| +
 | 
| +  explicit CallIC(Isolate* isolate)
 | 
| +      : IC(EXTRA_CALL_FRAME, isolate) {
 | 
| +  }
 | 
| +
 | 
| +  void HandleMiss(Handle<Object> receiver,
 | 
| +                  Handle<Object> function,
 | 
| +                  Handle<FixedArray> vector,
 | 
| +                  Handle<Smi> slot);
 | 
| +
 | 
| +  // Code generator routines.
 | 
| +  static void GenerateNormal(MacroAssembler* masm, int argc,
 | 
| +                             CallType call_type);
 | 
| +  static Handle<Code> initialize_stub(Isolate* isolate,
 | 
| +                                      int argc,
 | 
| +                                      CallType call_type);
 | 
| +
 | 
| +  static void Clear(Isolate* isolate, Address address, Code* target);
 | 
| +
 | 
| + private:
 | 
| +  void PatchMegamorphic(int arg_count, CallType call_type);
 | 
| +};
 | 
| +
 | 
| +
 | 
|  class LoadIC: public IC {
 | 
|   public:
 | 
|    // ExtraICState bits
 | 
| 
 |