@@ -268,7 +268,7 @@ bool IsArguments(ParseNode *pnode)
268268
269269bool ApplyEnclosesArgs (ParseNode* fncDecl, ByteCodeGenerator* byteCodeGenerator);
270270void 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 );
272272bool IsExpressionStatement (ParseNode* stmt, const Js::ScriptContext *const scriptContext);
273273void EmitInvoke (Js::RegSlot location, Js::RegSlot callObjLocation, Js::PropertyId propertyId, ByteCodeGenerator* byteCodeGenerator, FuncInfo* funcInfo);
274274void 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