WHILE Statement
This procedure processes While
statement. If condition expression is constant at compile time and evaluates to False
, no code is generated. All jumps out of the loop (Break
, Continue
) are also taken into account.
Procedure TStatement.Process_WHILE_Statement;
Var WhileCondition: TExpression;
Statement: TStatement;
SavedLastJumpOutOfBlock, SavedLastJumpToNextBlockIteration: Word;
begin
SavedLastJumpOutOfBlock := LastJumpOutOfBlock;
SavedLastJumpToNextBlockIteration := LastJumpToNextBlockIteration;
LastJumpOutOfBlock := 0;
LastJumpToNextBlockIteration := 0;
GetNextToken;
WhileCondition.ExpectBooleanExpression;
ExpectTokenAndGetNext (Token_DO);
Statement.ProcessStatement;
If WhileCondition.Location = elConstant then
begin
If WhileCondition.Value.Byte = 0 then
begin
StatementCode := 0;
LastJumpOutOfBlock := SavedLastJumpOutOfBlock;
LastJumpToNextBlockIteration := SavedLastJumpToNextBlockIteration;
Exit;
end;
WhileCondition.Value.LastJumpToFalse := 0;
end;
StoreCode_icGoSub (Statement.StatementCode);
GenerateCodeForNearJump (LastJumpToNextBlockIteration, JMP_ShortDirect);
StatementCode := EndSubroutine;
GenerateLabelAndSetJumpsToIt (LastJumpToNextBlockIteration);
StoreCode_icGoSub (WhileCondition.IntermediateCodeOffset);
StoreCode_icGoSub (StatementCode);
JoinJumpsOfBothExpressions (LastJumpOutOfBlock, WhileCondition.Value.LastJumpToFalse);
GenerateLabelAndSetJumpsToIt (LastJumpOutOfBlock);
StatementCode := EndSubroutine;
LastJumpOutOfBlock := SavedLastJumpOutOfBlock;
LastJumpToNextBlockIteration := SavedLastJumpToNextBlockIteration;
end;