Skip to content

Commit 2751a86

Browse files
committed
[MERGE #6135 @boingoing] SetProperty doesn't handle the case where the receiver object has a non-writable property
Merge pull request #6135 from boingoing:nonwritablepropertyreceiver SetProperty doesn't handle the case where the receiver object has a non-writable property When checking for non-writable properties while trying to set a property, we only check the object. If the receiver has a non-writable property we should throw in strict mode. Also adds StSuperFldStrict and a profiled version because strictness is not preserved in some backend calls to StSuperFld. Fixes: #5948
2 parents 2f98542 + 1ade385 commit 2751a86

29 files changed

+1130
-940
lines changed

lib/Backend/BackwardPass.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3442,6 +3442,7 @@ BackwardPass::ProcessBlock(BasicBlock * block)
34423442
case Js::OpCode::StSlotBoxTemp:
34433443
case Js::OpCode::StSlotChkUndecl:
34443444
case Js::OpCode::StSuperFld:
3445+
case Js::OpCode::StSuperFldStrict:
34453446
case Js::OpCode::ProfiledStElemI_A:
34463447
case Js::OpCode::ProfiledStElemI_A_Strict:
34473448
case Js::OpCode::ProfiledStFld:
@@ -3450,6 +3451,7 @@ BackwardPass::ProcessBlock(BasicBlock * block)
34503451
case Js::OpCode::ProfiledStRootFld:
34513452
case Js::OpCode::ProfiledStRootFldStrict:
34523453
case Js::OpCode::ProfiledStSuperFld:
3454+
case Js::OpCode::ProfiledStSuperFldStrict:
34533455
// Unfortunately, being fed into a store means that we could have aliasing, and the
34543456
// consequence is that it may be re-read and then dereferenced. Note that we can do
34553457
// this case if we poison any array symbol that we store to on the way out, but the

lib/Backend/GlobOpt.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13636,6 +13636,7 @@ GlobOpt::CheckJsArrayKills(IR::Instr *const instr)
1363613636
case Js::OpCode::StFld:
1363713637
case Js::OpCode::StFldStrict:
1363813638
case Js::OpCode::StSuperFld:
13639+
case Js::OpCode::StSuperFldStrict:
1363913640
{
1364013641
Assert(instr->GetDst());
1364113642

lib/Backend/GlobOptExpr.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -828,6 +828,7 @@ GlobOpt::ProcessArrayValueKills(IR::Instr *instr)
828828
case Js::OpCode::StFldStrict:
829829
case Js::OpCode::StRootFldStrict:
830830
case Js::OpCode::StSuperFld:
831+
case Js::OpCode::StSuperFldStrict:
831832
case Js::OpCode::StSlot:
832833
case Js::OpCode::StSlotChkUndecl:
833834
case Js::OpCode::DeleteFld:

lib/Backend/GlobOptFields.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@ GlobOpt::ProcessFieldKills(IR::Instr *instr, BVSparse<JitArenaAllocator> *bv, bo
429429
case Js::OpCode::StSlot:
430430
case Js::OpCode::StSlotChkUndecl:
431431
case Js::OpCode::StSuperFld:
432+
case Js::OpCode::StSuperFldStrict:
432433
Assert(dstOpnd != nullptr);
433434
sym = dstOpnd->AsSymOpnd()->m_sym;
434435
if (inGlobOpt)

lib/Backend/IR.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1036,7 +1036,8 @@ bool IR::Instr::IsStFldVariant() const
10361036
this->m_opcode == Js::OpCode::StLocalFld ||
10371037
this->m_opcode == Js::OpCode::StRootFld ||
10381038
this->m_opcode == Js::OpCode::StRootFldStrict ||
1039-
this->m_opcode == Js::OpCode::StSuperFld;
1039+
this->m_opcode == Js::OpCode::StSuperFld ||
1040+
this->m_opcode == Js::OpCode::StSuperFldStrict;
10401041
}
10411042

10421043
bool IR::Instr::IsStElemVariant() const

lib/Backend/IRBuilder.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4763,10 +4763,12 @@ IRBuilder::BuildElementC2(Js::OpCode newOpcode, uint32 offset, Js::RegSlot insta
47634763
break;
47644764

47654765
case Js::OpCode::ProfiledStSuperFld:
4766+
case Js::OpCode::ProfiledStSuperFldStrict:
47664767
Js::OpCodeUtil::ConvertNonCallOpToNonProfiled(newOpcode);
47674768
// fall-through
47684769

47694770
case Js::OpCode::StSuperFld:
4771+
case Js::OpCode::StSuperFldStrict:
47704772
{
47714773
propertyId = m_func->GetJITFunctionBody()->GetPropertyIdFromCacheId(propertyIdIndex);
47724774
fieldSymOpnd = this->BuildFieldOpnd(newOpcode, instanceSlot, propertyId, (Js::PropertyIdIndexType) - 1, PropertyKindData, propertyIdIndex);

lib/Backend/JnHelperMethodList.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,7 @@ HELPERCALLCHK(ProfiledLdRootFld, Js::ProfilingHelpers::ProfiledLdRootFld_Jit, 0)
413413
HELPERCALLCHK(ProfiledLdRootMethodFld, Js::ProfilingHelpers::ProfiledLdRootMethodFld_Jit, 0)
414414
HELPERCALLCHK(ProfiledStFld, Js::ProfilingHelpers::ProfiledStFld_Jit, 0)
415415
HELPERCALLCHK(ProfiledStSuperFld, Js::ProfilingHelpers::ProfiledStSuperFld_Jit, 0)
416+
HELPERCALLCHK(ProfiledStSuperFld_Strict, Js::ProfilingHelpers::ProfiledStSuperFld_Strict_Jit, 0)
416417
HELPERCALLCHK(ProfiledStFld_Strict, Js::ProfilingHelpers::ProfiledStFld_Strict_Jit, 0)
417418
HELPERCALLCHK(ProfiledStRootFld, Js::ProfilingHelpers::ProfiledStRootFld_Jit, 0)
418419
HELPERCALLCHK(ProfiledStRootFld_Strict, Js::ProfilingHelpers::ProfiledStRootFld_Strict_Jit, 0)

lib/Backend/Lower.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,6 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa
159159
{
160160
bool noMathFastPath;
161161
bool noFieldFastPath;
162-
bool isStrictMode = this->m_func->GetJITFunctionBody()->IsStrictMode();
163162
noFieldFastPath = !defaultDoFastPath;
164163
noMathFastPath = !defaultDoFastPath;
165164

@@ -538,7 +537,12 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa
538537

539538
case Js::OpCode::StSuperFld:
540539
instrPrev = GenerateCompleteStFld(instr, !noFieldFastPath, IR::HelperOp_PatchPutValueWithThisPtrNoLocalFastPath, IR::HelperOp_PatchPutValueWithThisPtrNoLocalFastPathPolymorphic,
541-
IR::HelperOp_PatchPutValueWithThisPtr, IR::HelperOp_PatchPutValueWithThisPtrPolymorphic, true, isStrictMode ? Js::PropertyOperation_StrictMode : Js::PropertyOperation_None);
540+
IR::HelperOp_PatchPutValueWithThisPtr, IR::HelperOp_PatchPutValueWithThisPtrPolymorphic, true, Js::PropertyOperation_None);
541+
break;
542+
543+
case Js::OpCode::StSuperFldStrict:
544+
instrPrev = GenerateCompleteStFld(instr, !noFieldFastPath, IR::HelperOp_PatchPutValueWithThisPtrNoLocalFastPath, IR::HelperOp_PatchPutValueWithThisPtrNoLocalFastPathPolymorphic,
545+
IR::HelperOp_PatchPutValueWithThisPtr, IR::HelperOp_PatchPutValueWithThisPtrPolymorphic, true, Js::PropertyOperation_StrictMode);
542546
break;
543547

544548
case Js::OpCode::StRootFld:
@@ -7132,7 +7136,7 @@ Lowerer::LowerProfiledStFld(IR::JitProfilingInstr *stFldInstr, Js::PropertyOpera
71327136

71337137
m_lowererMD.LoadHelperArgument(stFldInstr, IR::Opnd::CreateFramePointerOpnd(m_func));
71347138

7135-
if (stFldInstr->m_opcode == Js::OpCode::StSuperFld)
7139+
if (stFldInstr->m_opcode == Js::OpCode::StSuperFld || stFldInstr->m_opcode == Js::OpCode::StSuperFldStrict)
71367140
{
71377141
m_lowererMD.LoadHelperArgument(stFldInstr, stFldInstr->UnlinkSrc2());
71387142
}
@@ -7159,6 +7163,10 @@ Lowerer::LowerProfiledStFld(IR::JitProfilingInstr *stFldInstr, Js::PropertyOpera
71597163
helper = IR::HelperProfiledStSuperFld;
71607164
break;
71617165

7166+
case Js::OpCode::StSuperFldStrict:
7167+
helper = IR::HelperProfiledStSuperFld_Strict;
7168+
break;
7169+
71627170
default:
71637171
helper =
71647172
flags & Js::PropertyOperation_Root
@@ -7224,7 +7232,7 @@ Lowerer::LowerStFld(
72247232
}
72257233

72267234
IR::Opnd *src = stFldInstr->UnlinkSrc1();
7227-
if (stFldInstr->m_opcode == Js::OpCode::StSuperFld)
7235+
if (stFldInstr->m_opcode == Js::OpCode::StSuperFld || stFldInstr->m_opcode == Js::OpCode::StSuperFldStrict)
72287236
{
72297237
m_lowererMD.LoadHelperArgument(stFldInstr, stFldInstr->UnlinkSrc2());
72307238
}

lib/Runtime/ByteCode/ByteCodeCacheReleaseFileVersion.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44
//-------------------------------------------------------------------------------------------------------
55
// NOTE: If there is a merge conflict the correct fix is to make a new GUID.
66

7-
// {2734B2C7-9500-45AF-AAA6-FABB7B9C3F81}
7+
// {5EEF3B18-B808-42EF-BA86-A68AA3DBEEBA}
88
const GUID byteCodeCacheReleaseFileVersion =
9-
{ 0x2734b2c7, 0x9500, 0x45af, { 0xaa, 0xa6, 0xfa, 0xbb, 0x7b, 0x9c, 0x3f, 0x81 } };
9+
{ 0x5eef3b18, 0xb808, 0x42ef, { 0xba, 0x86, 0xa6, 0x8a, 0xa3, 0xdb, 0xee, 0xba } };

lib/Runtime/ByteCode/ByteCodeDumper.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,12 +767,14 @@ namespace Js
767767
break;
768768
}
769769
case OpCode::StSuperFld:
770+
case OpCode::StSuperFldStrict:
770771
{
771772
Output::Print(_u(" R%d.%s(this=R%d) = R%d #%d"), data->Instance, pPropertyName->GetBuffer(),
772773
data->Value2, data->Value, data->PropertyIdIndex);
773774
break;
774775
}
775776
case OpCode::ProfiledStSuperFld:
777+
case OpCode::ProfiledStSuperFldStrict:
776778
{
777779
Output::Print(_u(" R%d.%s(this=R%d) = R%d #%d"), data->Instance, pPropertyName->GetBuffer(),
778780
data->Value2, data->Value, data->PropertyIdIndex);

lib/Runtime/ByteCode/ByteCodeEmitter.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7006,7 +7006,8 @@ void EmitAssignment(
70067006
Js::RegSlot tmpReg = byteCodeGenerator->EmitLdObjProto(Js::OpCode::LdHomeObjProto, lhs->AsParseNodeBin()->pnode1->location, funcInfo);
70077007
funcInfo->ReleaseLoc(lhs->AsParseNodeSuperReference()->pnodeThis);
70087008
uint cacheId = funcInfo->FindOrAddInlineCacheId(tmpReg, propertyId, false, true);
7009-
byteCodeGenerator->Writer()->PatchablePropertyWithThisPtr(Js::OpCode::StSuperFld, rhsLocation, tmpReg, lhs->AsParseNodeSuperReference()->pnodeThis->location, cacheId);
7009+
Js::OpCode stFldOpCode = funcInfo->GetIsStrictMode() ? Js::OpCode::StSuperFldStrict : Js::OpCode::StSuperFld;
7010+
byteCodeGenerator->Writer()->PatchablePropertyWithThisPtr(stFldOpCode, rhsLocation, tmpReg, lhs->AsParseNodeSuperReference()->pnodeThis->location, cacheId);
70107011
}
70117012
else
70127013
{

lib/Runtime/ByteCode/ByteCodeWriter.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2155,6 +2155,7 @@ namespace Js
21552155
}
21562156
break;
21572157
case OpCode::StSuperFld:
2158+
case OpCode::StSuperFldStrict:
21582159
if (DoDynamicProfileOpcode(ProfileBasedFldFastPathPhase) ||
21592160
DoDynamicProfileOpcode(InlinePhase) ||
21602161
DoDynamicProfileOpcode(ObjTypeSpecPhase))

lib/Runtime/ByteCode/OpCodes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,7 @@ MACRO_BACKEND_ONLY( LdMethodFldPolyInlineMiss, ElementCP, OpSideEffect|OpOpn
424424
MACRO_WMS_PROFILED_OP_ROOT(LdRootMethodFld, ElementRootCP, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut) // Load call target from ScriptObject instance's direct field (access to let/const on root object)
425425
MACRO_WMS_PROFILED_OP( StFld, ElementCP, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut) // Store into ScriptObject instance's direct field
426426
MACRO_EXTEND_WMS_AND_PROFILED_OP(StSuperFld, ElementC2, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut) // Store into ScriptObject super instance's direct field
427+
MACRO_EXTEND_WMS_AND_PROFILED_OP(StSuperFldStrict, ElementC2, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut) // Store into ScriptObject super instance's direct field (strict mode, super.x = ...)
427428
MACRO_WMS_PROFILED_OP_ROOT(StRootFld, ElementRootCP, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut) // Store into ScriptObject instance's direct field (access to let/const on root object)
428429
MACRO_WMS_PROFILED_OP( StLocalFld, ElementP, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut) // Store into local activation object
429430
MACRO_WMS_PROFILED_OP( StFldStrict, ElementCP, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut) // Store into ScriptObject instance's direct field (strict mode, a.x = ...)

lib/Runtime/Language/InterpreterHandler.inl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,11 @@ EXDEF3_WMS(CUSTOM_L_Value, DeleteLocalFld, OP_DeleteLocalFl
184184
DEF3_WMS(CUSTOM, StFld, OP_SetProperty, ElementCP)
185185
DEF3_WMS(CUSTOM, StLocalFld, OP_SetLocalProperty, ElementP)
186186
EXDEF3_WMS(CUSTOM_L_Value, StSuperFld, OP_SetSuperProperty, ElementC2)
187+
EXDEF3_WMS(CUSTOM_L_Value, StSuperFldStrict, OP_SetSuperPropertyStrict, ElementC2)
187188
DEF3_WMS(CUSTOM, ProfiledStFld, PROFILEDOP(OP_ProfiledSetProperty, OP_SetProperty), ElementCP)
188189
DEF3_WMS(CUSTOM, ProfiledStLocalFld, PROFILEDOP(OP_ProfiledSetLocalProperty, OP_SetLocalProperty), ElementP)
189190
EXDEF3_WMS(CUSTOM_L_Value, ProfiledStSuperFld, PROFILEDOP(OP_ProfiledSetSuperProperty, OP_SetSuperProperty), ElementC2)
191+
EXDEF3_WMS(CUSTOM_L_Value, ProfiledStSuperFldStrict, PROFILEDOP(OP_ProfiledSetSuperPropertyStrict, OP_SetSuperPropertyStrict), ElementC2)
190192
DEF3_WMS(CUSTOM, StRootFld, OP_SetRootProperty, ElementRootCP)
191193
DEF3_WMS(CUSTOM, ProfiledStRootFld, PROFILEDOP(OP_ProfiledSetRootProperty, OP_SetRootProperty), ElementRootCP)
192194
DEF3_WMS(CUSTOM, StFldStrict, OP_SetPropertyStrict, ElementCP)

lib/Runtime/Language/InterpreterStackFrame.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4636,8 +4636,7 @@ namespace Js
46364636
GetInlineCache(playout->PropertyIdIndex),
46374637
playout->PropertyIdIndex,
46384638
GetReg(playout->Value),
4639-
m_functionBody->GetIsStrictMode() ?
4640-
(PropertyOperationFlags)(flags | PropertyOperation_StrictMode) : flags,
4639+
flags,
46414640
GetJavascriptFunction(),
46424641
thisInstance);
46434642
}
@@ -4661,6 +4660,12 @@ namespace Js
46614660
DoSetSuperProperty(playout, GetReg(playout->Instance), PropertyOperation_None);
46624661
}
46634662

4663+
template <class T>
4664+
void InterpreterStackFrame::OP_SetSuperPropertyStrict(unaligned T* playout)
4665+
{
4666+
DoSetSuperProperty(playout, GetReg(playout->Instance), PropertyOperation_StrictMode);
4667+
}
4668+
46644669
template <class T>
46654670
void InterpreterStackFrame::OP_ProfiledSetProperty(unaligned T* playout)
46664671
{
@@ -4679,6 +4684,12 @@ namespace Js
46794684
ProfiledSetSuperProperty<T, false>(playout, GetReg(playout->Instance), GetReg(playout->Value2), PropertyOperation_None);
46804685
}
46814686

4687+
template <class T>
4688+
void InterpreterStackFrame::OP_ProfiledSetSuperPropertyStrict(unaligned T* playout)
4689+
{
4690+
ProfiledSetSuperProperty<T, false>(playout, GetReg(playout->Instance), GetReg(playout->Value2), PropertyOperation_StrictMode);
4691+
}
4692+
46824693
template <class T>
46834694
void InterpreterStackFrame::OP_SetRootProperty(unaligned T* playout)
46844695
{

lib/Runtime/Language/InterpreterStackFrame.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,9 +563,11 @@ namespace Js
563563
template <class T> void OP_SetProperty(unaligned T* playout);
564564
template <class T> void OP_SetLocalProperty(unaligned T* playout);
565565
template <class T> void OP_SetSuperProperty(unaligned T* playout);
566+
template <class T> void OP_SetSuperPropertyStrict(unaligned T* playout);
566567
template <class T> void OP_ProfiledSetProperty(unaligned T* playout);
567568
template <class T> void OP_ProfiledSetLocalProperty(unaligned T* playout);
568569
template <class T> void OP_ProfiledSetSuperProperty(unaligned T* playout);
570+
template <class T> void OP_ProfiledSetSuperPropertyStrict(unaligned T* playout);
569571
template <class T> void OP_SetRootProperty(unaligned T* playout);
570572
template <class T> void OP_ProfiledSetRootProperty(unaligned T* playout);
571573
template <class T> void OP_SetPropertyStrict(unaligned T* playout);

lib/Runtime/Language/JavascriptOperators.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2697,8 +2697,19 @@ using namespace Js;
26972697
*result = FALSE;
26982698
Var setterValueOrProxy = nullptr;
26992699
DescriptorFlags flags = None;
2700+
bool receiverNonWritable = false;
2701+
2702+
if (receiver != object && !isRoot)
2703+
{
2704+
Var receiverSetter = nullptr;
2705+
PropertyValueInfo receiverInfo;
2706+
DescriptorFlags receiverFlags = VarTo<RecyclableObject>(receiver)->GetSetter(propertyId, &receiverSetter, &receiverInfo, requestContext);
2707+
receiverNonWritable = ((receiverFlags & Data) == Data && (receiverFlags & Writable) == None);
2708+
}
2709+
27002710
if ((isRoot && JavascriptOperators::CheckPrototypesForAccessorOrNonWritableRootProperty(object, propertyId, &setterValueOrProxy, &flags, info, requestContext)) ||
2701-
(!isRoot && JavascriptOperators::CheckPrototypesForAccessorOrNonWritableProperty(object, propertyId, &setterValueOrProxy, &flags, info, requestContext)))
2711+
(!isRoot && (JavascriptOperators::CheckPrototypesForAccessorOrNonWritableProperty(object, propertyId, &setterValueOrProxy, &flags, info, requestContext) ||
2712+
receiverNonWritable)))
27022713
{
27032714
if ((flags & Accessor) == Accessor)
27042715
{
@@ -2746,7 +2757,7 @@ using namespace Js;
27462757
}
27472758
else
27482759
{
2749-
Assert((flags & Data) == Data && (flags & Writable) == None);
2760+
Assert(((flags & Data) == Data && (flags & Writable) == None) || receiverNonWritable);
27502761
if (!allowUndecInConsoleScope)
27512762
{
27522763
if (flags & Const)

lib/Runtime/Language/ProfilingHelpers.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1122,6 +1122,29 @@ using namespace Js;
11221122
JIT_HELPER_END(ProfiledStSuperFld);
11231123
}
11241124

1125+
void ProfilingHelpers::ProfiledStSuperFld_Strict_Jit(
1126+
const Var instance,
1127+
const PropertyId propertyId,
1128+
const InlineCacheIndex inlineCacheIndex,
1129+
const Var value,
1130+
void* const framePointer,
1131+
const Var thisInstance)
1132+
{
1133+
JIT_HELPER_REENTRANT_HEADER(ProfiledStSuperFld_Strict);
1134+
ScriptFunction* const scriptFunction =
1135+
UnsafeVarTo<ScriptFunction>(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject);
1136+
ProfiledStFld<false>(
1137+
instance,
1138+
propertyId,
1139+
GetInlineCache(scriptFunction, inlineCacheIndex),
1140+
inlineCacheIndex,
1141+
value,
1142+
PropertyOperation_StrictMode,
1143+
scriptFunction,
1144+
thisInstance);
1145+
JIT_HELPER_END(ProfiledStSuperFld_Strict);
1146+
}
1147+
11251148
void ProfilingHelpers::ProfiledStFld_Strict_Jit(
11261149
const Var instance,
11271150
const PropertyId propertyId,

lib/Runtime/Language/ProfilingHelpers.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ namespace Js
4848
public:
4949
static void ProfiledStFld_Jit(const Var instance, const PropertyId propertyId, const InlineCacheIndex inlineCacheIndex, const Var value, void *const framePointer);
5050
static void ProfiledStSuperFld_Jit(const Var instance, const PropertyId propertyId, const InlineCacheIndex inlineCacheIndex, const Var value, void *const framePointer, const Var thisInstance);
51+
static void ProfiledStSuperFld_Strict_Jit(const Var instance, const PropertyId propertyId, const InlineCacheIndex inlineCacheIndex, const Var value, void* const framePointer, const Var thisInstance);
5152
static void ProfiledStFld_Strict_Jit(const Var instance, const PropertyId propertyId, const InlineCacheIndex inlineCacheIndex, const Var value, void *const framePointer);
5253
static void ProfiledStRootFld_Jit(const Var instance, const PropertyId propertyId, const InlineCacheIndex inlineCacheIndex, const Var value, void *const framePointer);
5354
static void ProfiledStRootFld_Strict_Jit(const Var instance, const PropertyId propertyId, const InlineCacheIndex inlineCacheIndex, const Var value, void *const framePointer);

0 commit comments

Comments
 (0)