Skip to content

Commit aae4d9f

Browse files
Mark as "reuse" to make jit happy
1 parent ba32362 commit aae4d9f

File tree

1 file changed

+12
-6
lines changed

1 file changed

+12
-6
lines changed

lib/Runtime/ByteCode/ByteCodeEmitter.cpp

+12-6
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)