Skip to content

Commit d8841a9

Browse files
Use LdFld instead of LdMethodFld
1 parent a11038a commit d8841a9

File tree

1 file changed

+18
-13
lines changed

1 file changed

+18
-13
lines changed

lib/Runtime/ByteCode/ByteCodeEmitter.cpp

+18-13
Original file line numberDiff line numberDiff line change
@@ -7926,10 +7926,14 @@ Js::ArgSlot EmitNewObjectOfConstants(
79267926
return actualArgCount;
79277927
}
79287928

7929-
void EmitMethodFld(bool isRoot, bool isScoped, Js::RegSlot location, Js::RegSlot callObjLocation, Js::PropertyId propertyId, ByteCodeGenerator *byteCodeGenerator, FuncInfo *funcInfo, bool registerCacheIdForCall = true)
7929+
void EmitMethodFld(bool isRoot, bool isScoped, bool isNullPropagating, Js::RegSlot location, Js::RegSlot callObjLocation, Js::PropertyId propertyId, ByteCodeGenerator *byteCodeGenerator, FuncInfo *funcInfo, bool registerCacheIdForCall = true)
79307930
{
79317931
Js::OpCode opcode;
7932-
if (!isRoot)
7932+
if (isNullPropagating)
7933+
{
7934+
opcode = Js::OpCode::LdFld;
7935+
}
7936+
else if (!isRoot)
79337937
{
79347938
if (callObjLocation == funcInfo->frameObjRegister)
79357939
{
@@ -7969,15 +7973,15 @@ void EmitMethodFld(bool isRoot, bool isScoped, Js::RegSlot location, Js::RegSlot
79697973
}
79707974
}
79717975

7972-
void EmitMethodFld(ParseNode *pnode, Js::RegSlot callObjLocation, Js::PropertyId propertyId, ByteCodeGenerator *byteCodeGenerator, FuncInfo *funcInfo, bool registerCacheIdForCall = true)
7976+
void EmitMethodFld(ParseNodeCall *pnodeCall, ParseNode *pnode, Js::RegSlot callObjLocation, Js::PropertyId propertyId, ByteCodeGenerator *byteCodeGenerator, FuncInfo *funcInfo, bool registerCacheIdForCall = true)
79737977
{
79747978
// Load a call target of the form x.y(). (Call target may be a plain knopName if we're getting it from
79757979
// the global object, etc.)
79767980
bool isRoot = pnode->nop == knopName && (pnode->AsParseNodeName()->sym == nullptr || pnode->AsParseNodeName()->sym->GetIsGlobal());
79777981
bool isScoped = (byteCodeGenerator->GetFlags() & fscrEval) != 0 ||
79787982
(isRoot && callObjLocation != ByteCodeGenerator::RootObjectRegister);
79797983

7980-
EmitMethodFld(isRoot, isScoped, pnode->location, callObjLocation, propertyId, byteCodeGenerator, funcInfo, registerCacheIdForCall);
7984+
EmitMethodFld(isRoot, isScoped, pnodeCall->isNullPropagating, pnode->location, callObjLocation, propertyId, byteCodeGenerator, funcInfo, registerCacheIdForCall);
79817985
}
79827986

79837987
// lhs.apply(this, arguments);
@@ -8004,7 +8008,7 @@ void EmitApplyCall(ParseNodeCall* pnodeCall, ByteCodeGenerator* byteCodeGenerato
80048008
// call for apply, we won't remove the entry for "apply" cacheId from
80058009
// ByteCodeWriter::callRegToLdFldCacheIndexMap, which is contrary to our assumption that we would
80068010
// have removed an entry from a map upon seeing its corresponding call.
8007-
EmitMethodFld(applyNode, funcNode->location, propertyId, byteCodeGenerator, funcInfo, false /*registerCacheIdForCall*/);
8011+
EmitMethodFld(pnodeCall, applyNode, funcNode->location, propertyId, byteCodeGenerator, funcInfo, false /*registerCacheIdForCall*/);
80088012

80098013
Symbol *argSym = funcInfo->GetArgumentsSymbol();
80108014
Assert(argSym && argSym->IsArguments());
@@ -8107,6 +8111,7 @@ void EmitCallTargetNoEvalComponents(
81078111
}
81088112

81098113
void EmitCallTarget(
8114+
ParseNodeCall *pnodeCall,
81108115
ParseNode *pnodeTarget,
81118116
BOOL fSideEffectArgs,
81128117
Js::RegSlot *thisLocation,
@@ -8131,7 +8136,7 @@ void EmitCallTarget(
81318136
{
81328137
case knopOptChain: {
81338138
EmitOptionalChainWrapper(pnodeTarget->AsParseNodeUni(), byteCodeGenerator, funcInfo, [&](ParseNodePtr innerNode) {
8134-
EmitCallTarget(innerNode, fSideEffectArgs, thisLocation, releaseThisLocation, callObjLocation, byteCodeGenerator, funcInfo, callApplyCallSiteId);
8139+
EmitCallTarget(pnodeCall, innerNode, fSideEffectArgs, thisLocation, releaseThisLocation, callObjLocation, byteCodeGenerator, funcInfo, callApplyCallSiteId);
81358140
});
81368141
break;
81378142
}
@@ -8180,7 +8185,7 @@ void EmitCallTarget(
81808185
{
81818186
*thisLocation = pnodeBinTarget->pnode1->location;
81828187
EmitNullPropagation(pnodeBinTarget->pnode1->location, byteCodeGenerator, funcInfo, pnodeBinTarget->isNullPropagating);
8183-
EmitMethodFld(pnodeBinTarget, protoLocation, propertyId, byteCodeGenerator, funcInfo);
8188+
EmitMethodFld(pnodeCall, pnodeBinTarget, protoLocation, propertyId, byteCodeGenerator, funcInfo);
81848189
}
81858190

81868191
break;
@@ -8248,7 +8253,7 @@ void EmitCallTarget(
82488253
{
82498254
// Load the call target as a property of the instance.
82508255
Js::PropertyId propertyId = pnodeNameTarget->PropertyIdFromNameNode();
8251-
EmitMethodFld(pnodeNameTarget, *callObjLocation, propertyId, byteCodeGenerator, funcInfo);
8256+
EmitMethodFld(pnodeCall, pnodeNameTarget, *callObjLocation, propertyId, byteCodeGenerator, funcInfo);
82528257
break;
82538258
}
82548259
}
@@ -8404,7 +8409,7 @@ void EmitCallInstrNoEvalComponents(
84048409
Assert(pnodeTarget->AsParseNodeBin()->pnode2->nop == knopName);
84058410
Js::PropertyId propertyId = pnodeTarget->AsParseNodeBin()->pnode2->AsParseNodeName()->PropertyIdFromNameNode();
84068411

8407-
EmitMethodFld(pnodeTarget, callObjLocation, propertyId, byteCodeGenerator, funcInfo);
8412+
EmitMethodFld(pnodeCall, pnodeTarget, callObjLocation, propertyId, byteCodeGenerator, funcInfo);
84088413
EmitCallI(pnodeCall, /*fEvaluateComponents*/ FALSE, fIsEval, fHasNewTarget, actualArgCount, byteCodeGenerator, funcInfo, callSiteId, spreadIndices);
84098414
}
84108415
break;
@@ -8428,7 +8433,7 @@ void EmitCallInstrNoEvalComponents(
84288433
funcInfo->ReleaseTmpRegister(callObjLocation);
84298434

84308435
Js::PropertyId propertyId = pnodeTarget->AsParseNodeName()->PropertyIdFromNameNode();
8431-
EmitMethodFld(pnodeTarget, callObjLocation, propertyId, byteCodeGenerator, funcInfo);
8436+
EmitMethodFld(pnodeCall, pnodeTarget, callObjLocation, propertyId, byteCodeGenerator, funcInfo);
84328437
EmitCallI(pnodeCall, /*fEvaluateComponents*/ FALSE, fIsEval, fHasNewTarget, actualArgCount, byteCodeGenerator, funcInfo, callSiteId, spreadIndices);
84338438
break;
84348439
}
@@ -8653,7 +8658,7 @@ void EmitCall(
86538658
}
86548659
else
86558660
{
8656-
EmitCallTarget(pnodeTarget, fSideEffectArgs, &thisLocation, &releaseThisLocation, &callObjLocation, byteCodeGenerator, funcInfo, &callApplyCallSiteId);
8661+
EmitCallTarget(pnodeCall, pnodeTarget, fSideEffectArgs, &thisLocation, &releaseThisLocation, &callObjLocation, byteCodeGenerator, funcInfo, &callApplyCallSiteId);
86578662
}
86588663
}
86598664

@@ -8705,7 +8710,7 @@ void EmitInvoke(
87058710
ByteCodeGenerator* byteCodeGenerator,
87068711
FuncInfo* funcInfo)
87078712
{
8708-
EmitMethodFld(false, false, location, callObjLocation, propertyId, byteCodeGenerator, funcInfo);
8713+
EmitMethodFld(false, false, false, location, callObjLocation, propertyId, byteCodeGenerator, funcInfo);
87098714

87108715
funcInfo->StartRecordingOutArgs(1);
87118716

@@ -8725,7 +8730,7 @@ void EmitInvoke(
87258730
FuncInfo* funcInfo,
87268731
Js::RegSlot arg1Location)
87278732
{
8728-
EmitMethodFld(false, false, location, callObjLocation, propertyId, byteCodeGenerator, funcInfo);
8733+
EmitMethodFld(false, false, false, location, callObjLocation, propertyId, byteCodeGenerator, funcInfo);
87298734

87308735
funcInfo->StartRecordingOutArgs(2);
87318736

0 commit comments

Comments
 (0)