private AstVisitAction VisitSimpleLoopStatement(StatementBlockAst body, PipelineBaseAst condition,
bool preExecuteBody, bool invertCond)
{
// TODO: pass loop label
// preExecuteBody is for do while/until loops
if (preExecuteBody && !EvaluateLoopBodyAst(body, null))
{
return AstVisitAction.SkipChildren;
}
// the condition is XORed with invertCond and menas: (true && !invertCond) || (false && invertCond)
while (LanguagePrimitives.ConvertTo<bool>(EvaluateAst(condition)) ^ invertCond)
{
if (!EvaluateLoopBodyAst(body, null))
{
break;
}
}
return AstVisitAction.SkipChildren;
}