@@ -7925,10 +7925,15 @@ Js::ArgSlot EmitNewObjectOfConstants(
79257925 return actualArgCount;
79267926}
79277927
7928- void EmitMethodFld (bool isRoot, bool isScoped, Js::RegSlot location, Js::RegSlot callObjLocation, Js::PropertyId propertyId, ByteCodeGenerator *byteCodeGenerator, FuncInfo *funcInfo, bool registerCacheIdForCall = true )
7928+ void EmitMethodFld (bool isRoot, bool isScoped, bool isNullPropagating, Js::RegSlot location, Js::RegSlot callObjLocation, Js::PropertyId propertyId, ByteCodeGenerator *byteCodeGenerator, FuncInfo *funcInfo, bool registerCacheIdForCall = true )
79297929{
79307930 Js::OpCode opcode;
7931- if (!isRoot)
7931+ if (isNullPropagating)
7932+ {
7933+ Assert (!isRoot);
7934+ opcode = (isScoped || !isRoot) ? Js::OpCode::LdFld : Js::OpCode::LdRootFld;
7935+ }
7936+ else if (!isRoot)
79327937 {
79337938 if (callObjLocation == funcInfo->frameObjRegister )
79347939 {
@@ -7975,8 +7980,9 @@ void EmitMethodFld(ParseNode *pnode, Js::RegSlot callObjLocation, Js::PropertyId
79757980 bool isRoot = pnode->nop == knopName && (pnode->AsParseNodeName ()->sym == nullptr || pnode->AsParseNodeName ()->sym ->GetIsGlobal ());
79767981 bool isScoped = (byteCodeGenerator->GetFlags () & fscrEval) != 0 ||
79777982 (isRoot && callObjLocation != ByteCodeGenerator::RootObjectRegister);
7983+ bool isNullPropagating = (knopIndex == pnode->nop || knopDot == pnode->nop ) && pnode->AsParseNodeBin ()->isNullPropagating ;
79787984
7979- EmitMethodFld (isRoot, isScoped, pnode->location , callObjLocation, propertyId, byteCodeGenerator, funcInfo, registerCacheIdForCall);
7985+ EmitMethodFld (isRoot, isScoped, isNullPropagating, pnode->location , callObjLocation, propertyId, byteCodeGenerator, funcInfo, registerCacheIdForCall);
79807986}
79817987
79827988// lhs.apply(this, arguments);
@@ -8704,7 +8710,7 @@ void EmitInvoke(
87048710 ByteCodeGenerator* byteCodeGenerator,
87058711 FuncInfo* funcInfo)
87068712{
8707- EmitMethodFld (false , false , location, callObjLocation, propertyId, byteCodeGenerator, funcInfo);
8713+ EmitMethodFld (false , false , false , location, callObjLocation, propertyId, byteCodeGenerator, funcInfo);
87088714
87098715 funcInfo->StartRecordingOutArgs (1 );
87108716
@@ -8724,7 +8730,7 @@ void EmitInvoke(
87248730 FuncInfo* funcInfo,
87258731 Js::RegSlot arg1Location)
87268732{
8727- EmitMethodFld (false , false , location, callObjLocation, propertyId, byteCodeGenerator, funcInfo);
8733+ EmitMethodFld (false , false , false , location, callObjLocation, propertyId, byteCodeGenerator, funcInfo);
87288734
87298735 funcInfo->StartRecordingOutArgs (2 );
87308736
0 commit comments