@@ -268,7 +268,7 @@ bool IsArguments(ParseNode *pnode)
268
268
269
269
bool ApplyEnclosesArgs(ParseNode* fncDecl, ByteCodeGenerator* byteCodeGenerator);
270
270
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 );
272
272
bool IsExpressionStatement(ParseNode* stmt, const Js::ScriptContext *const scriptContext);
273
273
void EmitInvoke(Js::RegSlot location, Js::RegSlot callObjLocation, Js::PropertyId propertyId, ByteCodeGenerator* byteCodeGenerator, FuncInfo* funcInfo);
274
274
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)
10097
10097
}
10098
10098
}
10099
10099
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 )
10101
10101
{
10102
10102
// If opnd2 can overwrite opnd1, make sure the value of opnd1 is stashed away.
10103
10103
if (MayHaveSideEffectOnNode(pnode1, pnode2, byteCodeGenerator))
@@ -10112,6 +10112,7 @@ void EmitBinaryOpnds(ParseNode* pnode1, ParseNode* pnode2, ByteCodeGenerator* by
10112
10112
byteCodeGenerator->Writer()->Reg2(Js::OpCode::Conv_Prop, computedPropertyLocation, pnode1->location);
10113
10113
}
10114
10114
10115
+ EmitNullPropagation(pnode1->location, byteCodeGenerator, funcInfo, isNullPropagating);
10115
10116
Emit(pnode2, byteCodeGenerator, funcInfo, false, false, computedPropertyLocation);
10116
10117
}
10117
10118
@@ -11596,7 +11597,10 @@ void Emit(ParseNode* pnode, ByteCodeGenerator* byteCodeGenerator, FuncInfo* func
11596
11597
case knopIndex:
11597
11598
{
11598
11599
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);
11600
11604
11601
11605
Js::RegSlot callObjLocation = pnode->AsParseNodeBin()->pnode1->location;
11602
11606
Js::RegSlot protoLocation = callObjLocation;
@@ -11612,8 +11616,6 @@ void Emit(ParseNode* pnode, ByteCodeGenerator* byteCodeGenerator, FuncInfo* func
11612
11616
funcInfo->ReleaseLoc(pnode->AsParseNodeBin()->pnode1);
11613
11617
funcInfo->AcquireLoc(pnode);
11614
11618
11615
- EmitNullPropagation(callObjLocation, byteCodeGenerator, funcInfo, pnode->AsParseNodeBin()->isNullPropagating);
11616
-
11617
11619
byteCodeGenerator->Writer()->Element(
11618
11620
Js::OpCode::LdElemI_A, pnode->location, protoLocation, pnode->AsParseNodeBin()->pnode2->location);
11619
11621
0 commit comments