@@ -57,22 +57,28 @@ static void EmitOptionalChainWrapper(ParseNodeUni *pnodeOptChain, ByteCodeGenera
5757 Js::ByteCodeLabel skipLabel = byteCodeGenerator->Writer ()->DefineLabel ();
5858 funcInfo->currentOptionalChainSkipLabel = skipLabel;
5959
60- // Acquire slot for the result value
61- // Prefill it with `undefined` (Fallback for short-circuiting)
62- Js::RegSlot resultSlot = funcInfo->AcquireLoc (pnodeOptChain);
63- byteCodeGenerator->Writer ()->Reg1 (Js::OpCode::LdUndef, resultSlot);
64-
6560 // Copy values from wrapper to inner expression
6661 ParseNodePtr innerNode = pnodeOptChain->pnode1 ;
6762 innerNode->isUsed = pnodeOptChain->isUsed ;
68- innerNode->location = pnodeOptChain->location ;
6963
7064 // emit chain expression
7165 // Every `?.` node will call `EmitNullPropagation`
7266 // `EmitNullPropagation` short-circuits to `skipLabel` in case of a nullish value
7367 emitChainContent (innerNode);
68+ funcInfo->ReleaseLoc (innerNode);
69+
70+ Js::ByteCodeLabel doneLabel = byteCodeGenerator->Writer ()->DefineLabel ();
71+
72+ // Acquire slot for the result value
73+ Js::RegSlot resultSlot = funcInfo->AcquireLoc (pnodeOptChain);
74+ byteCodeGenerator->Writer ()->Reg2 (Js::OpCode::Ld_A_ReuseLoc, resultSlot, innerNode->location );
75+ byteCodeGenerator->Writer ()->Br (Js::OpCode::Br, doneLabel);
7476
7577 byteCodeGenerator->Writer ()->MarkLabel (skipLabel);
78+ // Fill with `undefined` (short-circuiting)
79+ byteCodeGenerator->Writer ()->Reg1 (Js::OpCode::LdUndef, resultSlot);
80+
81+ byteCodeGenerator->Writer ()->MarkLabel (doneLabel);
7682 funcInfo->currentOptionalChainSkipLabel = previousSkipLabel;
7783}
7884
0 commit comments