@@ -4733,7 +4733,7 @@ void ByteCodeGenerator::EmitPropStore(Js::RegSlot rhsLocation, Symbol *sym, Iden
4733
4733
}
4734
4734
else
4735
4735
{
4736
- this ->EmitPatchableRootProperty (GetStFldOpCode (funcInfo, true , isLetDecl, isConstDecl, false ), rhsLocation, propertyId, false , true , funcInfo);
4736
+ this ->EmitPatchableRootProperty (GetStFldOpCode (funcInfo, true , isLetDecl, isConstDecl, false , forceStrictModeForClassComputedPropertyName ), rhsLocation, propertyId, false , true , funcInfo);
4737
4737
}
4738
4738
}
4739
4739
else if (sym->GetIsFuncExpr ())
@@ -5320,7 +5320,7 @@ void ByteCodeGenerator::EmitPropDelete(Js::RegSlot lhsLocation, Symbol *sym, Ide
5320
5320
if (this ->flags & (fscrEval | fscrImplicitThis))
5321
5321
{
5322
5322
this ->m_writer .ScopedProperty (Js::OpCode::ScopedDeleteFld, lhsLocation,
5323
- funcInfo->FindOrAddReferencedPropertyId (propertyId));
5323
+ funcInfo->FindOrAddReferencedPropertyId (propertyId), forceStrictModeForClassComputedPropertyName );
5324
5324
}
5325
5325
else
5326
5326
{
@@ -6931,7 +6931,7 @@ void EmitAssignment(
6931
6931
{
6932
6932
uint cacheId = funcInfo->FindOrAddInlineCacheId (lhs->AsParseNodeBin ()->pnode1 ->location , propertyId, false , true );
6933
6933
byteCodeGenerator->Writer ()->PatchableProperty (
6934
- ByteCodeGenerator::GetStFldOpCode (funcInfo, false , false , false , false ), rhsLocation, lhs->AsParseNodeBin ()->pnode1 ->location , cacheId);
6934
+ ByteCodeGenerator::GetStFldOpCode (funcInfo, false , false , false , false , byteCodeGenerator-> forceStrictModeForClassComputedPropertyName ), rhsLocation, lhs->AsParseNodeBin ()->pnode1 ->location , cacheId);
6935
6935
}
6936
6936
6937
6937
break ;
@@ -8347,7 +8347,19 @@ void EmitMemberNode(ParseNode *memberNode, Js::RegSlot objectLocation, ByteCodeG
8347
8347
// Transparently pass the name expr
8348
8348
// The Emit will replace this with a temp register if necessary to preserve the value.
8349
8349
nameNode->location = nameNode->AsParseNodeUni ()->pnode1 ->location ;
8350
+
8351
+ // Save the previous value of the flag to be restored later.
8352
+ bool prevFlag = byteCodeGenerator->forceStrictModeForClassComputedPropertyName ;
8353
+
8354
+ // Strict mode must be enforced on the evaluation of computed property names inside
8355
+ // classes, thus enable the flag if the computed property name is a class member.
8356
+ byteCodeGenerator->forceStrictModeForClassComputedPropertyName = isClassMember || prevFlag;
8357
+
8350
8358
EmitBinaryOpnds (nameNode, exprNode, byteCodeGenerator, funcInfo);
8359
+
8360
+ // Restore the flag's previous value.
8361
+ byteCodeGenerator->forceStrictModeForClassComputedPropertyName = prevFlag;
8362
+
8351
8363
if (isFncDecl && !exprNode->AsParseNodeFnc ()->IsClassConstructor ())
8352
8364
{
8353
8365
EmitComputedFunctionNameVar (nameNode, exprNode->AsParseNodeFnc (), byteCodeGenerator);
@@ -8374,7 +8386,18 @@ void EmitMemberNode(ParseNode *memberNode, Js::RegSlot objectLocation, ByteCodeG
8374
8386
(isClassMember ? Js::OpCode::InitClassMemberSetComputedName : Js::OpCode::InitSetElemI) :
8375
8387
(isClassMember ? Js::OpCode::InitClassMemberComputedName : Js::OpCode::InitComputedProperty);
8376
8388
8377
- byteCodeGenerator->Writer ()->Element (setOp, exprNode->location , objectLocation, nameNode->location , true );
8389
+ // Save the previous value of the flag to be restored later.
8390
+ bool prevFlag = byteCodeGenerator->forceStrictModeForClassComputedPropertyName ;
8391
+ byteCodeGenerator->forceStrictModeForClassComputedPropertyName = isClassMember || prevFlag;
8392
+
8393
+ // Strict mode must be enforced on the evaluation of computed property names inside
8394
+ // classes, thus enable the flag if the computed property name is a class member.
8395
+ byteCodeGenerator->Writer ()->Element (setOp, exprNode->location , objectLocation, nameNode->location , true ,
8396
+ byteCodeGenerator->forceStrictModeForClassComputedPropertyName );
8397
+
8398
+ // Restore the flag's previous value.
8399
+ byteCodeGenerator->forceStrictModeForClassComputedPropertyName = prevFlag;
8400
+
8378
8401
8379
8402
funcInfo->ReleaseLoc (exprNode);
8380
8403
funcInfo->ReleaseLoc (nameNode);
@@ -10634,7 +10657,7 @@ void Emit(ParseNode *pnode, ByteCodeGenerator *byteCodeGenerator, FuncInfo *func
10634
10657
Js::PropertyId propertyId = pexpr->AsParseNodeBin ()->pnode2 ->AsParseNodeName ()->PropertyIdFromNameNode ();
10635
10658
funcInfo->AcquireLoc (pnode);
10636
10659
byteCodeGenerator->Writer ()->Property (Js::OpCode::DeleteFld, pnode->location , pexpr->AsParseNodeBin ()->pnode1 ->location ,
10637
- funcInfo->FindOrAddReferencedPropertyId (propertyId));
10660
+ funcInfo->FindOrAddReferencedPropertyId (propertyId), byteCodeGenerator-> forceStrictModeForClassComputedPropertyName );
10638
10661
}
10639
10662
10640
10663
break ;
0 commit comments