| Index: src/stub-cache.cc | 
| diff --git a/src/stub-cache.cc b/src/stub-cache.cc | 
| index 86e72012135fb305bf5f6e3c660b1648e3a9172e..df19f8af100c6c4aa6e3c8b6ca19e7ce2190fc31 100644 | 
| --- a/src/stub-cache.cc | 
| +++ b/src/stub-cache.cc | 
| @@ -594,6 +594,7 @@ MaybeObject* StubCache::ComputeKeyedStoreField(String* name, | 
| MaybeObject* StubCache::ComputeCallConstant(int argc, | 
| InLoopFlag in_loop, | 
| Code::Kind kind, | 
| +                                            Code::ExtraICState extra_ic_state, | 
| String* name, | 
| Object* object, | 
| JSObject* holder, | 
| @@ -613,12 +614,12 @@ MaybeObject* StubCache::ComputeCallConstant(int argc, | 
| check = BOOLEAN_CHECK; | 
| } | 
|  | 
| -  Code::Flags flags = | 
| -      Code::ComputeMonomorphicFlags(kind, | 
| -                                    CONSTANT_FUNCTION, | 
| -                                    cache_holder, | 
| -                                    in_loop, | 
| -                                    argc); | 
| +  Code::Flags flags = Code::ComputeMonomorphicFlags(kind, | 
| +                                                    CONSTANT_FUNCTION, | 
| +                                                    extra_ic_state, | 
| +                                                    cache_holder, | 
| +                                                    in_loop, | 
| +                                                    argc); | 
| Object* code = map_holder->map()->FindInCodeCache(name, flags); | 
| if (code->IsUndefined()) { | 
| // If the function hasn't been compiled yet, we cannot do it now | 
| @@ -627,7 +628,8 @@ MaybeObject* StubCache::ComputeCallConstant(int argc, | 
| // caches. | 
| if (!function->is_compiled()) return Failure::InternalError(); | 
| // Compile the stub - only create stubs for fully compiled functions. | 
| -    CallStubCompiler compiler(argc, in_loop, kind, cache_holder); | 
| +    CallStubCompiler compiler( | 
| +        argc, in_loop, kind, extra_ic_state, cache_holder); | 
| { MaybeObject* maybe_code = | 
| compiler.CompileCallConstant(object, holder, function, name, check); | 
| if (!maybe_code->ToObject(&code)) return maybe_code; | 
| @@ -667,12 +669,14 @@ MaybeObject* StubCache::ComputeCallField(int argc, | 
|  | 
| Code::Flags flags = Code::ComputeMonomorphicFlags(kind, | 
| FIELD, | 
| +                                                    Code::kNoExtraICState, | 
| cache_holder, | 
| in_loop, | 
| argc); | 
| Object* code = map_holder->map()->FindInCodeCache(name, flags); | 
| if (code->IsUndefined()) { | 
| -    CallStubCompiler compiler(argc, in_loop, kind, cache_holder); | 
| +    CallStubCompiler compiler( | 
| +        argc, in_loop, kind, Code::kNoExtraICState, cache_holder); | 
| { MaybeObject* maybe_code = | 
| compiler.CompileCallField(JSObject::cast(object), | 
| holder, | 
| @@ -710,15 +714,16 @@ MaybeObject* StubCache::ComputeCallInterceptor(int argc, | 
| object = holder; | 
| } | 
|  | 
| -  Code::Flags flags = | 
| -      Code::ComputeMonomorphicFlags(kind, | 
| -                                    INTERCEPTOR, | 
| -                                    cache_holder, | 
| -                                    NOT_IN_LOOP, | 
| -                                    argc); | 
| +  Code::Flags flags = Code::ComputeMonomorphicFlags(kind, | 
| +                                                    INTERCEPTOR, | 
| +                                                    Code::kNoExtraICState, | 
| +                                                    cache_holder, | 
| +                                                    NOT_IN_LOOP, | 
| +                                                    argc); | 
| Object* code = map_holder->map()->FindInCodeCache(name, flags); | 
| if (code->IsUndefined()) { | 
| -    CallStubCompiler compiler(argc, NOT_IN_LOOP, kind, cache_holder); | 
| +    CallStubCompiler compiler( | 
| +        argc, NOT_IN_LOOP, kind, Code::kNoExtraICState, cache_holder); | 
| { MaybeObject* maybe_code = | 
| compiler.CompileCallInterceptor(JSObject::cast(object), holder, name); | 
| if (!maybe_code->ToObject(&code)) return maybe_code; | 
| @@ -760,12 +765,12 @@ MaybeObject* StubCache::ComputeCallGlobal(int argc, | 
| InlineCacheHolderFlag cache_holder = | 
| IC::GetCodeCacheForObject(receiver, holder); | 
| JSObject* map_holder = IC::GetCodeCacheHolder(receiver, cache_holder); | 
| -  Code::Flags flags = | 
| -      Code::ComputeMonomorphicFlags(kind, | 
| -                                    NORMAL, | 
| -                                    cache_holder, | 
| -                                    in_loop, | 
| -                                    argc); | 
| +  Code::Flags flags = Code::ComputeMonomorphicFlags(kind, | 
| +                                                    NORMAL, | 
| +                                                    Code::kNoExtraICState, | 
| +                                                    cache_holder, | 
| +                                                    in_loop, | 
| +                                                    argc); | 
| Object* code = map_holder->map()->FindInCodeCache(name, flags); | 
| if (code->IsUndefined()) { | 
| // If the function hasn't been compiled yet, we cannot do it now | 
| @@ -773,7 +778,8 @@ MaybeObject* StubCache::ComputeCallGlobal(int argc, | 
| // internal error which will make sure we do not update any | 
| // caches. | 
| if (!function->is_compiled()) return Failure::InternalError(); | 
| -    CallStubCompiler compiler(argc, in_loop, kind, cache_holder); | 
| +    CallStubCompiler compiler( | 
| +        argc, in_loop, kind, Code::kNoExtraICState, cache_holder); | 
| { MaybeObject* maybe_code = | 
| compiler.CompileCallGlobal(receiver, holder, cell, function, name); | 
| if (!maybe_code->ToObject(&code)) return maybe_code; | 
| @@ -839,8 +845,12 @@ static MaybeObject* FillCache(MaybeObject* maybe_code) { | 
| Code* StubCache::FindCallInitialize(int argc, | 
| InLoopFlag in_loop, | 
| Code::Kind kind) { | 
| -  Code::Flags flags = | 
| -      Code::ComputeFlags(kind, in_loop, UNINITIALIZED, NORMAL, argc); | 
| +  Code::Flags flags = Code::ComputeFlags(kind, | 
| +                                         in_loop, | 
| +                                         UNINITIALIZED, | 
| +                                         Code::kNoExtraICState, | 
| +                                         NORMAL, | 
| +                                         argc); | 
| Object* result = ProbeCache(flags)->ToObjectUnchecked(); | 
| ASSERT(!result->IsUndefined()); | 
| // This might be called during the marking phase of the collector | 
| @@ -852,8 +862,12 @@ Code* StubCache::FindCallInitialize(int argc, | 
| MaybeObject* StubCache::ComputeCallInitialize(int argc, | 
| InLoopFlag in_loop, | 
| Code::Kind kind) { | 
| -  Code::Flags flags = | 
| -      Code::ComputeFlags(kind, in_loop, UNINITIALIZED, NORMAL, argc); | 
| +  Code::Flags flags = Code::ComputeFlags(kind, | 
| +                                         in_loop, | 
| +                                         UNINITIALIZED, | 
| +                                         Code::kNoExtraICState, | 
| +                                         NORMAL, | 
| +                                         argc); | 
| Object* probe; | 
| { MaybeObject* maybe_probe = ProbeCache(flags); | 
| if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 
| @@ -895,8 +909,12 @@ Handle<Code> StubCache::ComputeKeyedCallInitialize(int argc, | 
| MaybeObject* StubCache::ComputeCallPreMonomorphic(int argc, | 
| InLoopFlag in_loop, | 
| Code::Kind kind) { | 
| -  Code::Flags flags = | 
| -      Code::ComputeFlags(kind, in_loop, PREMONOMORPHIC, NORMAL, argc); | 
| +  Code::Flags flags = Code::ComputeFlags(kind, | 
| +                                         in_loop, | 
| +                                         PREMONOMORPHIC, | 
| +                                         Code::kNoExtraICState, | 
| +                                         NORMAL, | 
| +                                         argc); | 
| Object* probe; | 
| { MaybeObject* maybe_probe = ProbeCache(flags); | 
| if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 
| @@ -910,8 +928,12 @@ MaybeObject* StubCache::ComputeCallPreMonomorphic(int argc, | 
| MaybeObject* StubCache::ComputeCallNormal(int argc, | 
| InLoopFlag in_loop, | 
| Code::Kind kind) { | 
| -  Code::Flags flags = | 
| -      Code::ComputeFlags(kind, in_loop, MONOMORPHIC, NORMAL, argc); | 
| +  Code::Flags flags = Code::ComputeFlags(kind, | 
| +                                         in_loop, | 
| +                                         MONOMORPHIC, | 
| +                                         Code::kNoExtraICState, | 
| +                                         NORMAL, | 
| +                                         argc); | 
| Object* probe; | 
| { MaybeObject* maybe_probe = ProbeCache(flags); | 
| if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 
| @@ -925,8 +947,12 @@ MaybeObject* StubCache::ComputeCallNormal(int argc, | 
| MaybeObject* StubCache::ComputeCallMegamorphic(int argc, | 
| InLoopFlag in_loop, | 
| Code::Kind kind) { | 
| -  Code::Flags flags = | 
| -      Code::ComputeFlags(kind, in_loop, MEGAMORPHIC, NORMAL, argc); | 
| +  Code::Flags flags = Code::ComputeFlags(kind, | 
| +                                         in_loop, | 
| +                                         MEGAMORPHIC, | 
| +                                         Code::kNoExtraICState, | 
| +                                         NORMAL, | 
| +                                         argc); | 
| Object* probe; | 
| { MaybeObject* maybe_probe = ProbeCache(flags); | 
| if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 
| @@ -940,8 +966,13 @@ MaybeObject* StubCache::ComputeCallMegamorphic(int argc, | 
| MaybeObject* StubCache::ComputeCallMiss(int argc, Code::Kind kind) { | 
| // MONOMORPHIC_PROTOTYPE_FAILURE state is used to make sure that miss stubs | 
| // and monomorphic stubs are not mixed up together in the stub cache. | 
| -  Code::Flags flags = Code::ComputeFlags( | 
| -     kind, NOT_IN_LOOP, MONOMORPHIC_PROTOTYPE_FAILURE, NORMAL, argc); | 
| +  Code::Flags flags = Code::ComputeFlags(kind, | 
| +                                         NOT_IN_LOOP, | 
| +                                         MONOMORPHIC_PROTOTYPE_FAILURE, | 
| +                                         Code::kNoExtraICState, | 
| +                                         NORMAL, | 
| +                                         argc, | 
| +                                         OWN_MAP); | 
| Object* probe; | 
| { MaybeObject* maybe_probe = ProbeCache(flags); | 
| if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 
| @@ -954,8 +985,12 @@ MaybeObject* StubCache::ComputeCallMiss(int argc, Code::Kind kind) { | 
|  | 
| #ifdef ENABLE_DEBUGGER_SUPPORT | 
| MaybeObject* StubCache::ComputeCallDebugBreak(int argc, Code::Kind kind) { | 
| -  Code::Flags flags = | 
| -      Code::ComputeFlags(kind, NOT_IN_LOOP, DEBUG_BREAK, NORMAL, argc); | 
| +  Code::Flags flags = Code::ComputeFlags(kind, | 
| +                                         NOT_IN_LOOP, | 
| +                                         DEBUG_BREAK, | 
| +                                         Code::kNoExtraICState, | 
| +                                         NORMAL, | 
| +                                         argc); | 
| Object* probe; | 
| { MaybeObject* maybe_probe = ProbeCache(flags); | 
| if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 
| @@ -968,12 +1003,12 @@ MaybeObject* StubCache::ComputeCallDebugBreak(int argc, Code::Kind kind) { | 
|  | 
| MaybeObject* StubCache::ComputeCallDebugPrepareStepIn(int argc, | 
| Code::Kind kind) { | 
| -  Code::Flags flags = | 
| -      Code::ComputeFlags(kind, | 
| -                         NOT_IN_LOOP, | 
| -                         DEBUG_PREPARE_STEP_IN, | 
| -                         NORMAL, | 
| -                         argc); | 
| +  Code::Flags flags = Code::ComputeFlags(kind, | 
| +                                         NOT_IN_LOOP, | 
| +                                         DEBUG_PREPARE_STEP_IN, | 
| +                                         Code::kNoExtraICState, | 
| +                                         NORMAL, | 
| +                                         argc); | 
| Object* probe; | 
| { MaybeObject* maybe_probe = ProbeCache(flags); | 
| if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 
| @@ -1493,11 +1528,13 @@ MaybeObject* KeyedStoreStubCompiler::GetCode(PropertyType type, String* name) { | 
| CallStubCompiler::CallStubCompiler(int argc, | 
| InLoopFlag in_loop, | 
| Code::Kind kind, | 
| +                                   Code::ExtraICState extra_ic_state, | 
| InlineCacheHolderFlag cache_holder) | 
| -    : arguments_(argc) | 
| -    , in_loop_(in_loop) | 
| -    , kind_(kind) | 
| -    , cache_holder_(cache_holder) { | 
| +    : arguments_(argc), | 
| +      in_loop_(in_loop), | 
| +      kind_(kind), | 
| +      extra_ic_state_(extra_ic_state), | 
| +      cache_holder_(cache_holder) { | 
| } | 
|  | 
|  | 
| @@ -1534,6 +1571,7 @@ MaybeObject* CallStubCompiler::GetCode(PropertyType type, String* name) { | 
| int argc = arguments_.immediate(); | 
| Code::Flags flags = Code::ComputeMonomorphicFlags(kind_, | 
| type, | 
| +                                                    extra_ic_state_, | 
| cache_holder_, | 
| in_loop_, | 
| argc); | 
|  |