Index: src/ic/ic.h |
diff --git a/src/ic/ic.h b/src/ic/ic.h |
index 06ac716fd1b1936d7f6bca4f282ed34d62fc9b9c..a6289487d089b290bc29a5e58570559aedc86472 100644 |
--- a/src/ic/ic.h |
+++ b/src/ic/ic.h |
@@ -352,14 +352,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); |
@@ -389,8 +394,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); |
@@ -407,10 +413,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(); |
} |
} |
@@ -437,11 +447,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); |
} |
@@ -461,9 +473,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. |
@@ -472,10 +486,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); |