@@ -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