private void VisitWhileStatement(ASTWhileStatementNode whileNode) { if (whileNode.Body != null) { VisitBodyStatement(whileNode.Body); } }
/// <summary> /// Builds while loop statement /// </summary> /// <param name="whileNode">While statement node</param> private void BuildWhileStatement(ASTWhileStatementNode whileNode) { var condition = _emitter.DefineLabel(); var body = _emitter.DefineLabel(); var exitWhile = _emitter.DefineLabel(); //calc condition _emitter.MarkLabel(condition); BuildExpression(whileNode.Condition); _emitter.Box(); if (_emitter.StackPeek() != typeof(bool)) { _emitter.ToBool(); } //check condition _emitter.JumpFalse(exitWhile); //body _loopsEnds.Push(exitWhile); if (whileNode.Body != null) { BuildStatement(whileNode.Body); //jump back _emitter.Jump(condition); } _loopsEnds.Pop(); //while exit _emitter.MarkLabel(exitWhile); }
private void CheckWhileStatement(ASTWhileStatementNode whileNode) { //check condition type CheckImplicitCast(whileNode.Condition, typeof(bool)); CheckExpression(whileNode.Condition); //CheckImplicitCast(whileNode.Condition, typeof(bool)); if (whileNode.Body != null) { //check infinity loop or dead code if (ASTExprHelper.IsValuable(whileNode.Condition)) { //infinity loop if (Convert.ToBoolean(ASTExprHelper.GetValue(whileNode.Condition))) { _messages.Add(new MessageRecord( MsgCode.InfinityLoop, whileNode.Body.SourcePath, whileNode.Body.StartLine, whileNode.Body.StartPos )); } else //unreachable code { _messages.Add(new MessageRecord( MsgCode.UnreachableCode, whileNode.Body.SourcePath, whileNode.Body.StartLine, whileNode.Body.StartPos )); } } //body check _inLoop = true; CheckBody(whileNode.Body); _inLoop = false; } else { _messages.Add(new MessageRecord( MsgCode.EmptyBody, whileNode.SourcePath, whileNode.StartLine, whileNode.StartPos )); } }