@@ -7925,10 +7925,15 @@ Js::ArgSlot EmitNewObjectOfConstants(
7925
7925
return actualArgCount;
7926
7926
}
7927
7927
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 )
7929
7929
{
7930
7930
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)
7932
7937
{
7933
7938
if (callObjLocation == funcInfo->frameObjRegister )
7934
7939
{
@@ -7975,8 +7980,9 @@ void EmitMethodFld(ParseNode *pnode, Js::RegSlot callObjLocation, Js::PropertyId
7975
7980
bool isRoot = pnode->nop == knopName && (pnode->AsParseNodeName ()->sym == nullptr || pnode->AsParseNodeName ()->sym ->GetIsGlobal ());
7976
7981
bool isScoped = (byteCodeGenerator->GetFlags () & fscrEval) != 0 ||
7977
7982
(isRoot && callObjLocation != ByteCodeGenerator::RootObjectRegister);
7983
+ bool isNullPropagating = (knopIndex == pnode->nop || knopDot == pnode->nop ) && pnode->AsParseNodeBin ()->isNullPropagating ;
7978
7984
7979
- EmitMethodFld (isRoot, isScoped, pnode->location , callObjLocation, propertyId, byteCodeGenerator, funcInfo, registerCacheIdForCall);
7985
+ EmitMethodFld (isRoot, isScoped, isNullPropagating, pnode->location , callObjLocation, propertyId, byteCodeGenerator, funcInfo, registerCacheIdForCall);
7980
7986
}
7981
7987
7982
7988
// lhs.apply(this, arguments);
@@ -8704,7 +8710,7 @@ void EmitInvoke(
8704
8710
ByteCodeGenerator* byteCodeGenerator,
8705
8711
FuncInfo* funcInfo)
8706
8712
{
8707
- EmitMethodFld (false , false , location, callObjLocation, propertyId, byteCodeGenerator, funcInfo);
8713
+ EmitMethodFld (false , false , false , location, callObjLocation, propertyId, byteCodeGenerator, funcInfo);
8708
8714
8709
8715
funcInfo->StartRecordingOutArgs (1 );
8710
8716
@@ -8724,7 +8730,7 @@ void EmitInvoke(
8724
8730
FuncInfo* funcInfo,
8725
8731
Js::RegSlot arg1Location)
8726
8732
{
8727
- EmitMethodFld (false , false , location, callObjLocation, propertyId, byteCodeGenerator, funcInfo);
8733
+ EmitMethodFld (false , false , false , location, callObjLocation, propertyId, byteCodeGenerator, funcInfo);
8728
8734
8729
8735
funcInfo->StartRecordingOutArgs (2 );
8730
8736
0 commit comments