Skip to content

Commit 6e7d935

Browse files
Fix optChain right before function call
1 parent 63093df commit 6e7d935

File tree

1 file changed

+15
-12
lines changed

1 file changed

+15
-12
lines changed

lib/Runtime/ByteCode/ByteCodeEmitter.cpp

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8122,6 +8122,7 @@ void EmitCallTarget(
81228122
else
81238123
{
81248124
*thisLocation = pnodeBinTarget->pnode1->location;
8125+
EmitNullPropagation(pnodeBinTarget->pnode1->location, byteCodeGenerator, funcInfo, pnodeBinTarget->isNullPropagating);
81258126
EmitMethodFld(pnodeBinTarget, protoLocation, propertyId, byteCodeGenerator, funcInfo);
81268127
}
81278128

@@ -8130,22 +8131,24 @@ void EmitCallTarget(
81308131

81318132
case knopIndex:
81328133
{
8133-
funcInfo->AcquireLoc(pnodeTarget);
8134+
ParseNodeBin *pnodeBinTarget = pnodeTarget->AsParseNodeBin();
8135+
funcInfo->AcquireLoc(pnodeBinTarget);
81348136
// Assign the call target operand(s), putting them into expression temps if necessary to protect
81358137
// them from side-effects.
8136-
if (fSideEffectArgs || !(ParseNode::Grfnop(pnodeTarget->AsParseNodeBin()->pnode2->nop) & fnopLeaf))
8138+
if (fSideEffectArgs || !(ParseNode::Grfnop(pnodeBinTarget->pnode2->nop) & fnopLeaf))
81378139
{
81388140
// Though we're done with target evaluation after this point, still protect opnd1 from
81398141
// arg or opnd2 side-effects as it's the "this" pointer.
8140-
SaveOpndValue(pnodeTarget->AsParseNodeBin()->pnode1, funcInfo);
8142+
SaveOpndValue(pnodeBinTarget->pnode1, funcInfo);
81418143
}
8142-
Emit(pnodeTarget->AsParseNodeBin()->pnode1, byteCodeGenerator, funcInfo, false);
8143-
Emit(pnodeTarget->AsParseNodeBin()->pnode2, byteCodeGenerator, funcInfo, false);
8144+
Emit(pnodeBinTarget->pnode1, byteCodeGenerator, funcInfo, false);
8145+
EmitNullPropagation(pnodeBinTarget->pnode1->location, byteCodeGenerator, funcInfo, pnodeBinTarget->isNullPropagating);
8146+
Emit(pnodeBinTarget->pnode2, byteCodeGenerator, funcInfo, false);
81448147

8145-
Js::RegSlot indexLocation = pnodeTarget->AsParseNodeBin()->pnode2->location;
8146-
Js::RegSlot protoLocation = pnodeTarget->AsParseNodeBin()->pnode1->location;
8148+
Js::RegSlot indexLocation = pnodeBinTarget->pnode2->location;
8149+
Js::RegSlot protoLocation = pnodeBinTarget->pnode1->location;
81478150

8148-
if (ByteCodeGenerator::IsSuper(pnodeTarget->AsParseNodeBin()->pnode1))
8151+
if (ByteCodeGenerator::IsSuper(pnodeBinTarget->pnode1))
81498152
{
81508153
Emit(pnodeTarget->AsParseNodeSuperReference()->pnodeThis, byteCodeGenerator, funcInfo, false);
81518154
protoLocation = byteCodeGenerator->EmitLdObjProto(Js::OpCode::LdHomeObjProto, protoLocation, funcInfo);
@@ -8157,16 +8160,16 @@ void EmitCallTarget(
81578160
}
81588161
else
81598162
{
8160-
*thisLocation = pnodeTarget->AsParseNodeBin()->pnode1->location;
8163+
*thisLocation = pnodeBinTarget->pnode1->location;
81618164
}
81628165

81638166
EmitMethodElem(pnodeTarget, protoLocation, indexLocation, byteCodeGenerator);
81648167

8165-
funcInfo->ReleaseLoc(pnodeTarget->AsParseNodeBin()->pnode2); // don't release indexLocation until after we use it.
8168+
funcInfo->ReleaseLoc(pnodeBinTarget->pnode2); // don't release indexLocation until after we use it.
81668169

8167-
if (ByteCodeGenerator::IsSuper(pnodeTarget->AsParseNodeBin()->pnode1))
8170+
if (ByteCodeGenerator::IsSuper(pnodeBinTarget->pnode1))
81688171
{
8169-
funcInfo->ReleaseLoc(pnodeTarget->AsParseNodeBin()->pnode1);
8172+
funcInfo->ReleaseLoc(pnodeBinTarget->pnode1);
81708173
}
81718174
break;
81728175
}

0 commit comments

Comments
 (0)