Skip to content

Commit a71b67d

Browse files
Don't use LdMethodFld
1 parent c8297ec commit a71b67d

File tree

1 file changed

+11
-5
lines changed

1 file changed

+11
-5
lines changed

lib/Runtime/ByteCode/ByteCodeEmitter.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)