diff --git a/deps/chakrashim/core/lib/Backend/IRBuilder.cpp b/deps/chakrashim/core/lib/Backend/IRBuilder.cpp index 520282147c9..59bd71a9e94 100644 --- a/deps/chakrashim/core/lib/Backend/IRBuilder.cpp +++ b/deps/chakrashim/core/lib/Backend/IRBuilder.cpp @@ -4316,6 +4316,7 @@ IRBuilder::BuildElementP(Js::OpCode newOpcode, uint32 offset, Js::RegSlot regSlo case Js::OpCode::ScopedStFld: case Js::OpCode::ConsoleScopedStFld: case Js::OpCode::ScopedStFldStrict: + case Js::OpCode::ConsoleScopedStFldStrict: { Assert(!isProfiled); diff --git a/deps/chakrashim/core/lib/Backend/Lower.cpp b/deps/chakrashim/core/lib/Backend/Lower.cpp index 82a9d434da2..45011b9a8dc 100644 --- a/deps/chakrashim/core/lib/Backend/Lower.cpp +++ b/deps/chakrashim/core/lib/Backend/Lower.cpp @@ -548,12 +548,13 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa break; case Js::OpCode::ConsoleScopedStFld: + case Js::OpCode::ConsoleScopedStFldStrict: { if (!noFieldFastPath) { m_lowererMD.GenerateFastScopedStFld(instr); } - Js::PropertyOperationFlags flags = static_cast(Js::PropertyOperation_None | Js::PropertyOperation_AllowUndeclInConsoleScope); + Js::PropertyOperationFlags flags = static_cast((instr->m_opcode == Js::OpCode::ConsoleScopedStFld ? Js::PropertyOperation_None : Js::PropertyOperation_StrictMode) | Js::PropertyOperation_AllowUndeclInConsoleScope); instrPrev = this->LowerScopedStFld(instr, IR::HelperOp_ConsolePatchSetPropertyScoped, true, true, flags); break; } diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeDumper.cpp b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeDumper.cpp index 5a7ac855837..42a82f23cde 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeDumper.cpp +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeDumper.cpp @@ -936,6 +936,7 @@ namespace Js case OpCode::ScopedStFld: case OpCode::ConsoleScopedStFld: case OpCode::ScopedStFldStrict: + case OpCode::ConsoleScopedStFldStrict: Output::Print(_u(" %s = R%d, R%d #%d"), pPropertyName->GetBuffer(), data->Value, Js::FunctionBody::RootObjectRegSlot, data->inlineCacheIndex); break; diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeEmitter.cpp b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeEmitter.cpp index 63117ded6ea..e0a85e01fc2 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeEmitter.cpp +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeEmitter.cpp @@ -5108,17 +5108,17 @@ void ByteCodeGenerator::EmitPropStore(Js::RegSlot rhsLocation, Symbol *sym, Iden if (sym == nullptr || sym->GetIsGlobal()) { Js::PropertyId propertyId = sym ? sym->EnsurePosition(this) : pid->GetPropertyId(); + bool isConsoleScopeLetConst = this->IsConsoleScopeEval() && (isLetDecl || isConstDecl); if (this->flags & fscrEval) { if (funcInfo->byteCodeFunction->GetIsStrictMode() && funcInfo->IsGlobalFunction()) { uint cacheId = funcInfo->FindOrAddInlineCacheId(funcInfo->frameDisplayRegister, propertyId, false, true); - this->m_writer.ElementP(GetScopedStFldOpCode(funcInfo), rhsLocation, cacheId); + this->m_writer.ElementP(GetScopedStFldOpCode(funcInfo, isConsoleScopeLetConst), rhsLocation, cacheId); } else { uint cacheId = funcInfo->FindOrAddInlineCacheId(funcInfo->GetEnvRegister(), propertyId, false, true); - bool isConsoleScopeLetConst = this->IsConsoleScopeEval() && (isLetDecl || isConstDecl); // In "eval", store to a symbol with unknown scope goes through the closure environment. this->m_writer.ElementP(GetScopedStFldOpCode(funcInfo, isConsoleScopeLetConst), rhsLocation, cacheId); } @@ -5128,7 +5128,7 @@ void ByteCodeGenerator::EmitPropStore(Js::RegSlot rhsLocation, Symbol *sym, Iden uint cacheId = funcInfo->FindOrAddInlineCacheId(funcInfo->GetEnvRegister(), propertyId, false, true); // In "eval", store to a symbol with unknown scope goes through the closure environment. - this->m_writer.ElementP(GetScopedStFldOpCode(funcInfo), rhsLocation, cacheId); + this->m_writer.ElementP(GetScopedStFldOpCode(funcInfo, isConsoleScopeLetConst), rhsLocation, cacheId); } else { diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeGenerator.cpp b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeGenerator.cpp index 2e83ef5415a..4f3e0ed74fd 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeGenerator.cpp +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeGenerator.cpp @@ -1915,11 +1915,7 @@ Js::OpCode ByteCodeGenerator::GetStFldOpCode(FuncInfo* funcInfo, bool isRoot, bo /* static */ Js::OpCode ByteCodeGenerator::GetScopedStFldOpCode(FuncInfo* funcInfo, bool isConsoleScopeLetConst) { - if (isConsoleScopeLetConst) - { - return Js::OpCode::ConsoleScopedStFld; - } - return GetScopedStFldOpCode(funcInfo->GetIsStrictMode()); + return GetScopedStFldOpCode(funcInfo->GetIsStrictMode(), isConsoleScopeLetConst); } /* static */ diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeGenerator.h b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeGenerator.h index 2d840c58f31..95a3a5dff95 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeGenerator.h +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeGenerator.h @@ -338,9 +338,11 @@ class ByteCodeGenerator isRoot ? Js::OpCode::StRootFld : Js::OpCode::StFld; } static Js::OpCode GetStFldOpCode(FuncInfo* funcInfo, bool isRoot, bool isLetDecl, bool isConstDecl, bool isClassMemberInit); - static Js::OpCode GetScopedStFldOpCode(bool isStrictMode) + static Js::OpCode GetScopedStFldOpCode(bool isStrictMode, bool isConsoleScope = false) { - return isStrictMode ? Js::OpCode::ScopedStFldStrict : Js::OpCode::ScopedStFld; + return isStrictMode ? + (isConsoleScope ? Js::OpCode::ConsoleScopedStFldStrict : Js::OpCode::ScopedStFldStrict) : + (isConsoleScope ? Js::OpCode::ConsoleScopedStFld : Js::OpCode::ScopedStFld); } static Js::OpCode GetScopedStFldOpCode(FuncInfo* funcInfo, bool isConsoleScopeLetConst = false); static Js::OpCode GetStElemIOpCode(bool isStrictMode) diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeWriter.cpp b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeWriter.cpp index f6a0df56c3b..d4a7d5432ec 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeWriter.cpp +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeWriter.cpp @@ -1944,6 +1944,7 @@ namespace Js case OpCode::ScopedStFld: case OpCode::ConsoleScopedStFld: case OpCode::ScopedStFldStrict: + case OpCode::ConsoleScopedStFldStrict: break; case OpCode::LdLocalFld: diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodes.h b/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodes.h index 3b96fb97f85..a10079d6f70 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodes.h +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodes.h @@ -379,6 +379,7 @@ MACRO_WMS( ScopedInitFunc, ElementScopedC, OpSideEffect MACRO_WMS( ScopedStFld, ElementP, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // Store to function's scope stack MACRO_EXTEND_WMS( ConsoleScopedStFld, ElementP, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // Store to function's scope stack MACRO_WMS( ScopedStFldStrict, ElementP, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // Store to function's scope stack +MACRO_EXTEND_WMS( ConsoleScopedStFldStrict, ElementP, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // Store to function's scope stack in strict mode for console scope MACRO_WMS( ScopedDeleteFld, ElementScopedC, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // Remove a property through a stack of scopes MACRO_WMS( ScopedDeleteFldStrict, ElementScopedC, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // Remove a property through a stack of scopes in strict mode MACRO_WMS_PROFILED( LdSlot, ElementSlot, OpTempNumberSources) diff --git a/deps/chakrashim/core/lib/Runtime/Language/InterpreterHandler.inl b/deps/chakrashim/core/lib/Runtime/Language/InterpreterHandler.inl index 4dad21b1310..35d5e448c3e 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/InterpreterHandler.inl +++ b/deps/chakrashim/core/lib/Runtime/Language/InterpreterHandler.inl @@ -348,6 +348,7 @@ EXDEF3_WMS(CUSTOM_L_Value, ScopedLdFldForTypeOf, OP_GetPropertyFo DEF3_WMS(CUSTOM, ScopedStFld, OP_SetPropertyScoped, ElementP) EXDEF3_WMS(CUSTOM, ConsoleScopedStFld, OP_ConsoleSetPropertyScoped, ElementP) DEF3_WMS(CUSTOM, ScopedStFldStrict, OP_SetPropertyScopedStrict, ElementP) +EXDEF3_WMS(CUSTOM, ConsoleScopedStFldStrict, OP_ConsoleSetPropertyScopedStrict, ElementP) DEF2_WMS(GET_ELEM_IMem, DeleteElemI_A, JavascriptOperators::OP_DeleteElementI) DEF2_WMS(GET_ELEM_IMem_Strict, DeleteElemIStrict_A, JavascriptOperators::OP_DeleteElementI) DEF3_WMS(CUSTOM_L_Value, ScopedLdInst, OP_ScopedLdInst, ElementScopedC2) diff --git a/deps/chakrashim/core/lib/Runtime/Language/InterpreterStackFrame.cpp b/deps/chakrashim/core/lib/Runtime/Language/InterpreterStackFrame.cpp index 3070a7fa159..49eef85732f 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/InterpreterStackFrame.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/InterpreterStackFrame.cpp @@ -4471,6 +4471,12 @@ namespace Js OP_SetPropertyScoped(playout, PropertyOperation_AllowUndeclInConsoleScope); } + template + void InterpreterStackFrame::OP_ConsoleSetPropertyScopedStrict(unaligned T* playout) + { + OP_SetPropertyScoped(playout, (PropertyOperationFlags)(PropertyOperation_StrictMode | PropertyOperation_AllowUndeclInConsoleScope)); + } + template inline bool InterpreterStackFrame::TrySetPropertyLocalFastPath(unaligned T* playout, PropertyId pid, Var instance, InlineCache*& inlineCache, PropertyOperationFlags flags) { diff --git a/deps/chakrashim/core/lib/Runtime/Language/InterpreterStackFrame.h b/deps/chakrashim/core/lib/Runtime/Language/InterpreterStackFrame.h index ea94d1e7d9e..d7dfbfc2205 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/InterpreterStackFrame.h +++ b/deps/chakrashim/core/lib/Runtime/Language/InterpreterStackFrame.h @@ -541,6 +541,7 @@ namespace Js template void OP_SetPropertyScoped_NoFastPath(unaligned T* playout, PropertyOperationFlags flags); template void OP_SetPropertyScopedStrict(unaligned T* playout); template void OP_ConsoleSetPropertyScoped(unaligned T* playout); + template void OP_ConsoleSetPropertyScopedStrict(unaligned T* playout); template void DoSetProperty(unaligned T* playout, Var instance, PropertyOperationFlags flags); template void DoSetSuperProperty(unaligned T* playout, Var instance, PropertyOperationFlags flags);