Index: src/ic/ic.h |
diff --git a/src/ic/ic.h b/src/ic/ic.h |
index 743459c54d0d19aa6fd2885c87c1fc2387595f18..dec8318ae5c7cfd2b6c40fb253365cb055a630a6 100644 |
--- a/src/ic/ic.h |
+++ b/src/ic/ic.h |
@@ -354,14 +354,19 @@ class CallIC : public IC { |
class LoadIC : public IC { |
public: |
- static ExtraICState ComputeExtraICState(ContextualMode contextual_mode) { |
- return LoadICState(contextual_mode).GetExtraICState(); |
+ static ExtraICState ComputeExtraICState(ContextualMode contextual_mode, |
+ LanguageMode language_mode) { |
+ return LoadICState(contextual_mode, language_mode).GetExtraICState(); |
} |
ContextualMode contextual_mode() const { |
return LoadICState::GetContextualMode(extra_ic_state()); |
} |
+ LanguageMode language_mode() const { |
+ return LoadICState::GetLanguageMode(extra_ic_state()); |
+ } |
+ |
LoadIC(FrameDepth depth, Isolate* isolate, FeedbackNexus* nexus = NULL) |
: IC(depth, isolate, nexus) { |
DCHECK(nexus != NULL); |
@@ -391,8 +396,9 @@ class LoadIC : public IC { |
// Code generator routines. |
static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } |
static void GenerateMiss(MacroAssembler* masm); |
- static void GenerateNormal(MacroAssembler* masm); |
- static void GenerateRuntimeGetProperty(MacroAssembler* masm); |
+ static void GenerateRuntimeGetProperty(MacroAssembler* masm, |
+ LanguageMode language_mode); |
+ static void GenerateNormal(MacroAssembler* masm, LanguageMode language_mode); |
static Handle<Code> initialize_stub(Isolate* isolate, |
ExtraICState extra_state); |
@@ -409,10 +415,14 @@ class LoadIC : public IC { |
Handle<Code> slow_stub() const { |
if (kind() == Code::LOAD_IC) { |
- return isolate()->builtins()->LoadIC_Slow(); |
+ return is_strong(language_mode()) |
+ ? isolate()->builtins()->LoadIC_Slow_Strong() |
+ : isolate()->builtins()->LoadIC_Slow(); |
} else { |
DCHECK_EQ(Code::KEYED_LOAD_IC, kind()); |
- return isolate()->builtins()->KeyedLoadIC_Slow(); |
+ return is_strong(language_mode()) |
+ ? isolate()->builtins()->KeyedLoadIC_Slow_Strong() |
+ : isolate()->builtins()->KeyedLoadIC_Slow(); |
} |
} |
@@ -439,11 +449,13 @@ class LoadIC : public IC { |
class KeyedLoadIC : public LoadIC { |
public: |
// ExtraICState bits (building on IC) |
- class IcCheckTypeField : public BitField<IcCheckType, 1, 1> {}; |
+ class IcCheckTypeField |
+ : public BitField<IcCheckType, LoadICState::kNextBitFieldOffset, 1> {}; |
static ExtraICState ComputeExtraICState(ContextualMode contextual_mode, |
+ LanguageMode language_mode, |
IcCheckType key_type) { |
- return LoadICState(contextual_mode).GetExtraICState() | |
+ return LoadICState(contextual_mode, language_mode).GetExtraICState() | |
IcCheckTypeField::encode(key_type); |
} |
@@ -463,9 +475,11 @@ class KeyedLoadIC : public LoadIC { |
// Code generator routines. |
static void GenerateMiss(MacroAssembler* masm); |
- static void GenerateRuntimeGetProperty(MacroAssembler* masm); |
+ static void GenerateRuntimeGetProperty(MacroAssembler* masm, |
+ LanguageMode language_mode); |
static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } |
- static void GenerateMegamorphic(MacroAssembler* masm); |
+ static void GenerateMegamorphic(MacroAssembler* masm, |
+ LanguageMode language_mode); |
// Bit mask to be tested against bit field for the cases when |
// generic stub should go into slow case. |
@@ -474,10 +488,12 @@ class KeyedLoadIC : public LoadIC { |
static const int kSlowCaseBitFieldMask = |
(1 << Map::kIsAccessCheckNeeded) | (1 << Map::kHasIndexedInterceptor); |
- static Handle<Code> initialize_stub(Isolate* isolate); |
+ static Handle<Code> initialize_stub(Isolate* isolate, |
+ ExtraICState extra_state); |
static Handle<Code> initialize_stub_in_optimized_code( |
- Isolate* isolate, State initialization_state); |
- static Handle<Code> ChooseMegamorphicStub(Isolate* isolate); |
+ Isolate* isolate, State initialization_state, ExtraICState extra_state); |
+ static Handle<Code> ChooseMegamorphicStub(Isolate* isolate, |
+ ExtraICState extra_state); |
static void Clear(Isolate* isolate, Code* host, KeyedLoadICNexus* nexus); |