Пример #1
0
 private void VisitWhileStatement(ASTWhileStatementNode whileNode)
 {
     if (whileNode.Body != null)
     {
         VisitBodyStatement(whileNode.Body);
     }
 }
Пример #2
0
        /// <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);
        }
Пример #3
0
 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
                           ));
     }
 }