| 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);
|
|
|
|
|