@@ -60,12 +60,13 @@ static void EmitOptionalChainWrapper(ParseNodeUni *pnodeOptChain, ByteCodeGenera
60
60
// Copy values from wrapper to inner expression
61
61
ParseNodePtr innerNode = pnodeOptChain->pnode1 ;
62
62
innerNode->isUsed = pnodeOptChain->isUsed ;
63
- innerNode->location = funcInfo-> AcquireLoc (pnodeOptChain) ;
63
+ innerNode->location = pnodeOptChain-> location ;
64
64
65
65
// emit chain expression
66
66
// Every `?.` node will call `EmitNullPropagation`
67
67
// `EmitNullPropagation` short-circuits to `skipLabel` in case of a nullish value
68
68
emitChainContent (innerNode);
69
+ pnodeOptChain->location = innerNode->location ;
69
70
70
71
Js::ByteCodeLabel doneLabel = Js::Constants::NoRegister;
71
72
if (pnodeOptChain->isUsed )
@@ -89,6 +90,7 @@ static void EmitOptionalChainWrapper(ParseNodeUni *pnodeOptChain, ByteCodeGenera
89
90
byteCodeGenerator->Writer ()->Reg2 (Js::OpCode::Ld_A_ReuseLoc, pnodeOptChain->location , funcInfo->undefinedConstantRegister );
90
91
byteCodeGenerator->Writer ()->MarkLabel (doneLabel);
91
92
}
93
+
92
94
funcInfo->currentOptionalChainSkipLabel = previousSkipLabel;
93
95
}
94
96
@@ -11209,6 +11211,81 @@ void TrackGlobalIntAssignments(ParseNodePtr pnode, ByteCodeGenerator * byteCodeG
11209
11211
}
11210
11212
}
11211
11213
11214
+ static void EmitDelete (ParseNode *pnode, ParseNode *pexpr, ByteCodeGenerator *byteCodeGenerator, FuncInfo *funcInfo) {
11215
+ switch (pexpr->nop )
11216
+ {
11217
+ case knopOptChain:
11218
+ EmitOptionalChainWrapper (pexpr->AsParseNodeUni (), byteCodeGenerator, funcInfo, [&](ParseNode *innerNode) {
11219
+ EmitDelete (innerNode, innerNode, byteCodeGenerator, funcInfo);
11220
+ });
11221
+ pnode->location = pexpr->location ;
11222
+ break ;
11223
+ case knopName:
11224
+ {
11225
+ ParseNodeName *pnodeName = pexpr->AsParseNodeName ();
11226
+ if (pnodeName->IsSpecialName ())
11227
+ {
11228
+ funcInfo->AcquireLoc (pnode);
11229
+ byteCodeGenerator->Writer ()->Reg1 (Js::OpCode::LdTrue, pnode->location );
11230
+ }
11231
+ else
11232
+ {
11233
+ funcInfo->AcquireLoc (pnode);
11234
+ byteCodeGenerator->EmitPropDelete (pnode->location , pnodeName->sym , pnodeName->pid , funcInfo);
11235
+ }
11236
+ break ;
11237
+ }
11238
+ case knopDot:
11239
+ {
11240
+ ParseNodeBin *pnodeDot = pexpr->AsParseNodeBin ();
11241
+ ParseNode *pnode1 = pnodeDot->pnode1 ;
11242
+ ParseNode *pnode2 = pnodeDot->pnode2 ;
11243
+
11244
+ if (ByteCodeGenerator::IsSuper (pnode1))
11245
+ {
11246
+ byteCodeGenerator->Writer ()->W1 (Js::OpCode::RuntimeReferenceError, SCODE_CODE (JSERR_DeletePropertyWithSuper));
11247
+
11248
+ funcInfo->AcquireLoc (pnode);
11249
+ byteCodeGenerator->Writer ()->Reg1 (Js::OpCode::LdUndef, pnode->location );
11250
+ }
11251
+ else
11252
+ {
11253
+ Emit (pnode1, byteCodeGenerator, funcInfo, false );
11254
+ EmitNullPropagation (pnode1->location , byteCodeGenerator, funcInfo, pnodeDot->isNullPropagating );
11255
+
11256
+ funcInfo->ReleaseLoc (pnode1);
11257
+ Js::PropertyId propertyId = pnode2->AsParseNodeName ()->PropertyIdFromNameNode ();
11258
+ funcInfo->AcquireLoc (pnode);
11259
+ byteCodeGenerator->Writer ()->Property (Js::OpCode::DeleteFld, pnode->location , pnode1->location ,
11260
+ funcInfo->FindOrAddReferencedPropertyId (propertyId), byteCodeGenerator->forceStrictModeForClassComputedPropertyName );
11261
+ }
11262
+
11263
+ break ;
11264
+ }
11265
+ case knopIndex:
11266
+ {
11267
+ ParseNodeBin *pnodeIndex = pexpr->AsParseNodeBin ();
11268
+ ParseNode *pnode1 = pnodeIndex->pnode1 ;
11269
+ ParseNode *pnode2 = pnodeIndex->pnode2 ;
11270
+
11271
+ EmitBinaryOpnds (pnode1, pnode2, byteCodeGenerator, funcInfo, Js::Constants::NoRegister, pnodeIndex->isNullPropagating );
11272
+ funcInfo->ReleaseLoc (pnode2);
11273
+ funcInfo->ReleaseLoc (pnode1);
11274
+ funcInfo->AcquireLoc (pnode);
11275
+ byteCodeGenerator->Writer ()->Element (Js::OpCode::DeleteElemI_A, pnode->location , pnode1->location , pnode2->location );
11276
+ break ;
11277
+ }
11278
+ default :
11279
+ {
11280
+ Emit (pexpr, byteCodeGenerator, funcInfo, false );
11281
+ funcInfo->ReleaseLoc (pexpr);
11282
+ byteCodeGenerator->Writer ()->Reg2 (
11283
+ Js::OpCode::Delete_A, funcInfo->AcquireLoc (pnode), pexpr->location );
11284
+ break ;
11285
+ }
11286
+ }
11287
+ }
11288
+
11212
11289
void Emit (ParseNode* pnode, ByteCodeGenerator* byteCodeGenerator, FuncInfo* funcInfo, BOOL fReturnValue , bool isConstructorCall, bool isTopLevel)
11213
11290
{
11214
11291
if (pnode == nullptr )
@@ -11570,63 +11647,7 @@ void Emit(ParseNode* pnode, ByteCodeGenerator* byteCodeGenerator, FuncInfo* func
11570
11647
{
11571
11648
ParseNode *pexpr = pnode->AsParseNodeUni ()->pnode1 ;
11572
11649
byteCodeGenerator->StartStatement (pnode);
11573
- switch (pexpr->nop )
11574
- {
11575
- case knopName:
11576
- {
11577
- ParseNodeName * pnodeName = pexpr->AsParseNodeName ();
11578
- if (pnodeName->IsSpecialName ())
11579
- {
11580
- funcInfo->AcquireLoc (pnode);
11581
- byteCodeGenerator->Writer ()->Reg1 (Js::OpCode::LdTrue, pnode->location );
11582
- }
11583
- else
11584
- {
11585
- funcInfo->AcquireLoc (pnode);
11586
- byteCodeGenerator->EmitPropDelete (pnode->location , pnodeName->sym , pnodeName->pid , funcInfo);
11587
- }
11588
- break ;
11589
- }
11590
- case knopDot:
11591
- {
11592
- if (ByteCodeGenerator::IsSuper (pexpr->AsParseNodeBin ()->pnode1 ))
11593
- {
11594
- byteCodeGenerator->Writer ()->W1 (Js::OpCode::RuntimeReferenceError, SCODE_CODE (JSERR_DeletePropertyWithSuper));
11595
-
11596
- funcInfo->AcquireLoc (pnode);
11597
- byteCodeGenerator->Writer ()->Reg1 (Js::OpCode::LdUndef, pnode->location );
11598
- }
11599
- else
11600
- {
11601
- Emit (pexpr->AsParseNodeBin ()->pnode1 , byteCodeGenerator, funcInfo, false );
11602
-
11603
- funcInfo->ReleaseLoc (pexpr->AsParseNodeBin ()->pnode1 );
11604
- Js::PropertyId propertyId = pexpr->AsParseNodeBin ()->pnode2 ->AsParseNodeName ()->PropertyIdFromNameNode ();
11605
- funcInfo->AcquireLoc (pnode);
11606
- byteCodeGenerator->Writer ()->Property (Js::OpCode::DeleteFld, pnode->location , pexpr->AsParseNodeBin ()->pnode1 ->location ,
11607
- funcInfo->FindOrAddReferencedPropertyId (propertyId), byteCodeGenerator->forceStrictModeForClassComputedPropertyName );
11608
- }
11609
-
11610
- break ;
11611
- }
11612
- case knopIndex:
11613
- {
11614
- EmitBinaryOpnds (pexpr->AsParseNodeBin ()->pnode1 , pexpr->AsParseNodeBin ()->pnode2 , byteCodeGenerator, funcInfo);
11615
- funcInfo->ReleaseLoc (pexpr->AsParseNodeBin ()->pnode2 );
11616
- funcInfo->ReleaseLoc (pexpr->AsParseNodeBin ()->pnode1 );
11617
- funcInfo->AcquireLoc (pnode);
11618
- byteCodeGenerator->Writer ()->Element (Js::OpCode::DeleteElemI_A, pnode->location , pexpr->AsParseNodeBin ()->pnode1 ->location , pexpr->AsParseNodeBin ()->pnode2 ->location );
11619
- break ;
11620
- }
11621
- default :
11622
- {
11623
- Emit (pexpr, byteCodeGenerator, funcInfo, false );
11624
- funcInfo->ReleaseLoc (pexpr);
11625
- byteCodeGenerator->Writer ()->Reg2 (
11626
- Js::OpCode::Delete_A, funcInfo->AcquireLoc (pnode), pexpr->location );
11627
- break ;
11628
- }
11629
- }
11650
+ EmitDelete (pnode, pexpr, byteCodeGenerator, funcInfo);
11630
11651
byteCodeGenerator->EndStatement (pnode);
11631
11652
break ;
11632
11653
}
0 commit comments