@@ -67,20 +67,29 @@ static void EmitOptionalChainWrapper(ParseNodeUni *pnodeOptChain, ByteCodeGenera
67
67
emitChainContent (innerNode);
68
68
funcInfo->ReleaseLoc (innerNode);
69
69
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 );
74
73
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 );
78
78
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 );
82
82
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
+ }
84
93
funcInfo->currentOptionalChainSkipLabel = previousSkipLabel;
85
94
}
86
95
0 commit comments