@@ -67,20 +67,29 @@ static void EmitOptionalChainWrapper(ParseNodeUni *pnodeOptChain, ByteCodeGenera
6767 emitChainContent (innerNode);
6868 funcInfo->ReleaseLoc (innerNode);
6969
70- // Acquire slot for the result value
71- Js::RegSlot resultSlot = funcInfo->AcquireLoc (pnodeOptChain);
72- // Copy chain result
73- byteCodeGenerator->Writer ()->Reg2 (Js::OpCode::Ld_A, resultSlot, innerNode->location );
70+ if (innerNode->isUsed )
71+ {
72+ Assert (Js::Constants::NoRegister != innerNode->location );
7473
75- // Skip short-circuiting logic
76- Js::ByteCodeLabel doneLabel = byteCodeGenerator->Writer ()->DefineLabel ();
77- byteCodeGenerator->Writer ()->Br (doneLabel);
74+ // Acquire slot for the result value
75+ Js::RegSlot resultSlot = funcInfo->AcquireLoc (pnodeOptChain);
76+ // Copy chain result
77+ byteCodeGenerator->Writer ()->Reg2 (Js::OpCode::Ld_A, resultSlot, innerNode->location );
7878
79- // Set `undefined` on short-circuiting
80- byteCodeGenerator->Writer ()->MarkLabel (skipLabel );
81- byteCodeGenerator->Writer ()->Reg2 (Js::OpCode::Ld_A_ReuseLoc, resultSlot, funcInfo-> undefinedConstantRegister );
79+ // Skip short-circuiting logic
80+ Js::ByteCodeLabel doneLabel = byteCodeGenerator->Writer ()->DefineLabel ( );
81+ byteCodeGenerator->Writer ()->Br (doneLabel );
8282
83- byteCodeGenerator->Writer ()->MarkLabel (doneLabel);
83+ // Set `undefined` on short-circuiting
84+ byteCodeGenerator->Writer ()->MarkLabel (skipLabel);
85+ byteCodeGenerator->Writer ()->Reg2 (Js::OpCode::Ld_A_ReuseLoc, resultSlot, funcInfo->undefinedConstantRegister );
86+
87+ byteCodeGenerator->Writer ()->MarkLabel (doneLabel);
88+ }
89+ else
90+ {
91+ byteCodeGenerator->Writer ()->MarkLabel (skipLabel);
92+ }
8493 funcInfo->currentOptionalChainSkipLabel = previousSkipLabel;
8594}
8695
0 commit comments