Skip to content

Commit f4d884a

Browse files
short-circuit indexer expressions
1 parent 000a720 commit f4d884a

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

lib/Runtime/ByteCode/ByteCodeEmitter.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ bool IsArguments(ParseNode *pnode)
268268

269269
bool ApplyEnclosesArgs(ParseNode* fncDecl, ByteCodeGenerator* byteCodeGenerator);
270270
void Emit(ParseNode* pnode, ByteCodeGenerator* byteCodeGenerator, FuncInfo* funcInfo, BOOL fReturnValue, bool isConstructorCall = false, bool isTopLevel = false);
271-
void EmitBinaryOpnds(ParseNode* pnode1, ParseNode* pnode2, ByteCodeGenerator* byteCodeGenerator, FuncInfo* funcInfo, Js::RegSlot computedPropertyLocation = Js::Constants::NoRegister);
271+
void EmitBinaryOpnds(ParseNode* pnode1, ParseNode* pnode2, ByteCodeGenerator* byteCodeGenerator, FuncInfo* funcInfo, Js::RegSlot computedPropertyLocation = Js::Constants::NoRegister, bool isNullPropagating = false);
272272
bool IsExpressionStatement(ParseNode* stmt, const Js::ScriptContext *const scriptContext);
273273
void EmitInvoke(Js::RegSlot location, Js::RegSlot callObjLocation, Js::PropertyId propertyId, ByteCodeGenerator* byteCodeGenerator, FuncInfo* funcInfo);
274274
void EmitInvoke(Js::RegSlot location, Js::RegSlot callObjLocation, Js::PropertyId propertyId, ByteCodeGenerator* byteCodeGenerator, FuncInfo* funcInfo, Js::RegSlot arg1Location);
@@ -10097,7 +10097,7 @@ void ByteCodeGenerator::EmitJumpCleanup(ParseNode* target, FuncInfo* funcInfo)
1009710097
}
1009810098
}
1009910099

10100-
void EmitBinaryOpnds(ParseNode* pnode1, ParseNode* pnode2, ByteCodeGenerator* byteCodeGenerator, FuncInfo* funcInfo, Js::RegSlot computedPropertyLocation)
10100+
void EmitBinaryOpnds(ParseNode* pnode1, ParseNode* pnode2, ByteCodeGenerator* byteCodeGenerator, FuncInfo* funcInfo, Js::RegSlot computedPropertyLocation, bool isNullPropagating)
1010110101
{
1010210102
// If opnd2 can overwrite opnd1, make sure the value of opnd1 is stashed away.
1010310103
if (MayHaveSideEffectOnNode(pnode1, pnode2, byteCodeGenerator))
@@ -10112,6 +10112,7 @@ void EmitBinaryOpnds(ParseNode* pnode1, ParseNode* pnode2, ByteCodeGenerator* by
1011210112
byteCodeGenerator->Writer()->Reg2(Js::OpCode::Conv_Prop, computedPropertyLocation, pnode1->location);
1011310113
}
1011410114

10115+
EmitNullPropagation(pnode1->location, byteCodeGenerator, funcInfo, isNullPropagating);
1011510116
Emit(pnode2, byteCodeGenerator, funcInfo, false, false, computedPropertyLocation);
1011610117
}
1011710118

@@ -11596,7 +11597,10 @@ void Emit(ParseNode* pnode, ByteCodeGenerator* byteCodeGenerator, FuncInfo* func
1159611597
case knopIndex:
1159711598
{
1159811599
STARTSTATEMENET_IFTOPLEVEL(isTopLevel, pnode);
11599-
EmitBinaryOpnds(pnode->AsParseNodeBin()->pnode1, pnode->AsParseNodeBin()->pnode2, byteCodeGenerator, funcInfo);
11600+
EmitBinaryOpnds(pnode->AsParseNodeBin()->pnode1, pnode->AsParseNodeBin()->pnode2, byteCodeGenerator, funcInfo,
11601+
Js::Constants::NoRegister,
11602+
// EmitNullPropagation is called in EmitBinaryOpnds to short-circuit indexer content
11603+
pnode->AsParseNodeBin()->isNullPropagating);
1160011604

1160111605
Js::RegSlot callObjLocation = pnode->AsParseNodeBin()->pnode1->location;
1160211606
Js::RegSlot protoLocation = callObjLocation;
@@ -11612,8 +11616,6 @@ void Emit(ParseNode* pnode, ByteCodeGenerator* byteCodeGenerator, FuncInfo* func
1161211616
funcInfo->ReleaseLoc(pnode->AsParseNodeBin()->pnode1);
1161311617
funcInfo->AcquireLoc(pnode);
1161411618

11615-
EmitNullPropagation(callObjLocation, byteCodeGenerator, funcInfo, pnode->AsParseNodeBin()->isNullPropagating);
11616-
1161711619
byteCodeGenerator->Writer()->Element(
1161811620
Js::OpCode::LdElemI_A, pnode->location, protoLocation, pnode->AsParseNodeBin()->pnode2->location);
1161911621

0 commit comments

Comments
 (0)