| Index: src/ic.h
 | 
| diff --git a/src/ic.h b/src/ic.h
 | 
| index bfb73ac6a530772ad7bc02e9ee88a9a07c726b38..3db352acfd6d9449b47ea0416ea45e357b699738 100644
 | 
| --- a/src/ic.h
 | 
| +++ b/src/ic.h
 | 
| @@ -250,11 +250,13 @@ class IC {
 | 
|      UNREACHABLE();
 | 
|      return Handle<Code>::null();
 | 
|    }
 | 
| -  virtual StrictModeFlag strict_mode() const { return kNonStrictMode; }
 | 
| +
 | 
|    bool TryRemoveInvalidPrototypeDependentStub(Handle<Object> receiver,
 | 
|                                                Handle<String> name);
 | 
|    void TryRemoveInvalidHandlers(Handle<Map> map, Handle<String> name);
 | 
|  
 | 
| +  virtual ExtraICState extra_ic_state() { return kNoExtraICState; }
 | 
| +
 | 
|   private:
 | 
|    Code* raw_target() const { return GetTargetAtAddress(address()); }
 | 
|  
 | 
| @@ -296,8 +298,13 @@ class IC_Utility {
 | 
|  
 | 
|  class CallICBase: public IC {
 | 
|   public:
 | 
| -  class Contextual: public BitField<bool, 0, 1> {};
 | 
| +  // ExtraICState bits
 | 
| +  class Contextual: public BitField<ContextualMode, 0, 1> {};
 | 
|    class StringStubState: public BitField<StringStubFeedback, 1, 1> {};
 | 
| +  static ExtraICState ComputeExtraICState(ContextualMode mode,
 | 
| +                                          StringStubFeedback feedback) {
 | 
| +    return Contextual::encode(mode) | StringStubState::encode(feedback);
 | 
| +  }
 | 
|  
 | 
|    // Returns a JSFunction or a Failure.
 | 
|    MUST_USE_RESULT MaybeObject* LoadFunction(Handle<Object> object,
 | 
| @@ -307,8 +314,6 @@ class CallICBase: public IC {
 | 
|    CallICBase(Code::Kind kind, Isolate* isolate)
 | 
|        : IC(EXTRA_CALL_FRAME, isolate), kind_(kind) {}
 | 
|  
 | 
| -  virtual Code::ExtraICState extra_ic_state() { return Code::kNoExtraICState; }
 | 
| -
 | 
|    // Compute a monomorphic stub if possible, otherwise return a null handle.
 | 
|    Handle<Code> ComputeMonomorphicStub(LookupResult* lookup,
 | 
|                                        Handle<Object> object,
 | 
| @@ -334,14 +339,14 @@ class CallICBase: public IC {
 | 
|    static void GenerateMiss(MacroAssembler* masm,
 | 
|                             int argc,
 | 
|                             IC::UtilityId id,
 | 
| -                           Code::ExtraICState extra_state);
 | 
| +                           ExtraICState extra_state);
 | 
|  
 | 
|    static void GenerateNormal(MacroAssembler* masm, int argc);
 | 
|  
 | 
|    static void GenerateMonomorphicCacheProbe(MacroAssembler* masm,
 | 
|                                              int argc,
 | 
|                                              Code::Kind kind,
 | 
| -                                            Code::ExtraICState extra_state);
 | 
| +                                            ExtraICState extra_state);
 | 
|  
 | 
|    virtual Handle<Code> megamorphic_stub();
 | 
|    virtual Handle<Code> pre_monomorphic_stub();
 | 
| @@ -363,31 +368,31 @@ class CallIC: public CallICBase {
 | 
|    // Code generator routines.
 | 
|    static void GenerateInitialize(MacroAssembler* masm,
 | 
|                                   int argc,
 | 
| -                                 Code::ExtraICState extra_state) {
 | 
| +                                 ExtraICState extra_state) {
 | 
|      GenerateMiss(masm, argc, extra_state);
 | 
|    }
 | 
|  
 | 
|    static void GenerateMiss(MacroAssembler* masm,
 | 
|                             int argc,
 | 
| -                           Code::ExtraICState extra_state) {
 | 
| +                           ExtraICState extra_state) {
 | 
|      CallICBase::GenerateMiss(masm, argc, IC::kCallIC_Miss, extra_state);
 | 
|    }
 | 
|  
 | 
|    static void GenerateMegamorphic(MacroAssembler* masm,
 | 
|                                    int argc,
 | 
| -                                  Code::ExtraICState extra_ic_state);
 | 
| +                                  ExtraICState extra_ic_state);
 | 
|  
 | 
|    static void GenerateNormal(MacroAssembler* masm, int argc) {
 | 
|      CallICBase::GenerateNormal(masm, argc);
 | 
| -    GenerateMiss(masm, argc, Code::kNoExtraICState);
 | 
| +    GenerateMiss(masm, argc, kNoExtraICState);
 | 
|    }
 | 
|    bool TryUpdateExtraICState(LookupResult* lookup, Handle<Object> object);
 | 
|  
 | 
|   protected:
 | 
| -  virtual Code::ExtraICState extra_ic_state() { return extra_ic_state_; }
 | 
| +  virtual ExtraICState extra_ic_state() { return extra_ic_state_; }
 | 
|  
 | 
|   private:
 | 
| -  Code::ExtraICState extra_ic_state_;
 | 
| +  ExtraICState extra_ic_state_;
 | 
|  };
 | 
|  
 | 
|  
 | 
| @@ -408,7 +413,7 @@ class KeyedCallIC: public CallICBase {
 | 
|  
 | 
|    static void GenerateMiss(MacroAssembler* masm, int argc) {
 | 
|      CallICBase::GenerateMiss(masm, argc, IC::kKeyedCallIC_Miss,
 | 
| -                             Code::kNoExtraICState);
 | 
| +                             kNoExtraICState);
 | 
|    }
 | 
|  
 | 
|    static void GenerateMegamorphic(MacroAssembler* masm, int argc);
 | 
| @@ -559,13 +564,28 @@ class KeyedLoadIC: public LoadIC {
 | 
|  
 | 
|  class StoreIC: public IC {
 | 
|   public:
 | 
| +  // ExtraICState bits
 | 
| +  class StrictModeState: public BitField<StrictModeFlag, 0, 1> {};
 | 
| +  static ExtraICState ComputeExtraICState(StrictModeFlag flag) {
 | 
| +    return StrictModeState::encode(flag);
 | 
| +  }
 | 
| +
 | 
| +  static StrictModeFlag GetStrictMode(ExtraICState state) {
 | 
| +    return StrictModeState::decode(state);
 | 
| +  }
 | 
| +
 | 
| +  // For convenience, a statically declared encoding of strict mode extra
 | 
| +  // IC state.
 | 
| +  static const ExtraICState kStrictModeState =
 | 
| +      1 << StrictModeState::kShift;
 | 
| +
 | 
|    StoreIC(FrameDepth depth, Isolate* isolate)
 | 
|        : IC(depth, isolate),
 | 
| -        strict_mode_(Code::GetStrictMode(target()->extra_ic_state())) {
 | 
| +        strict_mode_(GetStrictMode(target()->extra_ic_state())) {
 | 
|      ASSERT(IsStoreStub());
 | 
|    }
 | 
|  
 | 
| -  virtual StrictModeFlag strict_mode() const { return strict_mode_; }
 | 
| +  StrictModeFlag strict_mode() const { return strict_mode_; }
 | 
|  
 | 
|    // Code generators for stub routines. Only called once at startup.
 | 
|    static void GenerateSlow(MacroAssembler* masm);
 | 
| @@ -642,11 +662,15 @@ class StoreIC: public IC {
 | 
|                                        Handle<Object> value,
 | 
|                                        InlineCacheHolderFlag cache_holder);
 | 
|  
 | 
| +  virtual ExtraICState extra_ic_state() {
 | 
| +    return ComputeExtraICState(strict_mode());
 | 
| +  }
 | 
| +
 | 
|   private:
 | 
|    void set_target(Code* code) {
 | 
|      // Strict mode must be preserved across IC patching.
 | 
| -    ASSERT(Code::GetStrictMode(code->extra_ic_state()) ==
 | 
| -           Code::GetStrictMode(target()->extra_ic_state()));
 | 
| +    ASSERT(GetStrictMode(code->extra_ic_state()) ==
 | 
| +           GetStrictMode(target()->extra_ic_state()));
 | 
|      IC::set_target(code);
 | 
|    }
 | 
|  
 | 
| @@ -681,6 +705,22 @@ enum KeyedStoreIncrementLength {
 | 
|  
 | 
|  class KeyedStoreIC: public StoreIC {
 | 
|   public:
 | 
| +  // ExtraICState bits (building on IC)
 | 
| +  // ExtraICState bits
 | 
| +  class ExtraICStateKeyedAccessStoreMode:
 | 
| +      public BitField<KeyedAccessStoreMode, 1, 4> {};  // NOLINT
 | 
| +
 | 
| +  static ExtraICState ComputeExtraICState(StrictModeFlag flag,
 | 
| +                                                KeyedAccessStoreMode mode) {
 | 
| +    return StrictModeState::encode(flag) |
 | 
| +        ExtraICStateKeyedAccessStoreMode::encode(mode);
 | 
| +  }
 | 
| +
 | 
| +  static KeyedAccessStoreMode GetKeyedAccessStoreMode(
 | 
| +      ExtraICState extra_state) {
 | 
| +    return ExtraICStateKeyedAccessStoreMode::decode(extra_state);
 | 
| +  }
 | 
| +
 | 
|    KeyedStoreIC(FrameDepth depth, Isolate* isolate)
 | 
|        : StoreIC(depth, isolate) {
 | 
|      ASSERT(target()->is_keyed_store_stub());
 | 
| @@ -707,6 +747,10 @@ class KeyedStoreIC: public StoreIC {
 | 
|  
 | 
|    virtual void UpdateMegamorphicCache(Type* type, Name* name, Code* code) { }
 | 
|  
 | 
| +  virtual ExtraICState extra_ic_state() {
 | 
| +    return ComputeExtraICState(strict_mode(), STANDARD_STORE);
 | 
| +  }
 | 
| +
 | 
|    virtual Handle<Code> pre_monomorphic_stub() {
 | 
|      return pre_monomorphic_stub(isolate(), strict_mode());
 | 
|    }
 | 
| @@ -735,7 +779,7 @@ class KeyedStoreIC: public StoreIC {
 | 
|   private:
 | 
|    void set_target(Code* code) {
 | 
|      // Strict mode must be preserved across IC patching.
 | 
| -    ASSERT(Code::GetStrictMode(code->extra_ic_state()) == strict_mode());
 | 
| +    ASSERT(GetStrictMode(code->extra_ic_state()) == strict_mode());
 | 
|      IC::set_target(code);
 | 
|    }
 | 
|  
 | 
| 
 |