Esempio n. 1
0
 public override BoundNode VisitDoStatement(BoundDoStatement node)
 {
     var newLocals = RewriteLocals(node.Locals);
     BoundExpression condition = (BoundExpression)this.Visit(node.Condition);
     BoundStatement body = (BoundStatement)this.Visit(node.Body);
     return node.Update(newLocals, condition, body, node.BreakLabel, node.ContinueLabel);
 }
 private void VisitDoStatement(BoundDoStatement node)
 {
     VisitStatement(node.Body);
     VisitExpression(node.Condition);
 }
Esempio n. 3
0
 public override BoundExpression InstrumentDoStatementCondition(BoundDoStatement original, BoundExpression rewrittenCondition, SyntheticBoundNodeFactory factory)
 {
     return(Previous.InstrumentDoStatementCondition(original, rewrittenCondition, factory));
 }
Esempio n. 4
0
 public override BoundStatement InstrumentDoStatementConditionalGotoStart(BoundDoStatement original, BoundStatement ifConditionGotoStart)
 {
     return(Previous.InstrumentDoStatementConditionalGotoStart(original, ifConditionGotoStart));
 }
Esempio n. 5
0
        public override BoundNode VisitDoStatement(BoundDoStatement node)
        {
            Debug.Assert(node != null);

            var rewrittenCondition = (BoundExpression)Visit(node.Condition);
            var rewrittenBody = (BoundStatement)Visit(node.Body);
            var startLabel = new GeneratedLabelSymbol("start");
            
            var syntax = node.Syntax;

            BoundStatement ifConditionGotoStart = new BoundConditionalGoto(syntax, rewrittenCondition, true, startLabel);

            if (this.generateDebugInfo)
            {
                var doSyntax = (DoStatementSyntax)syntax;
                var span = TextSpan.FromBounds(
                    doSyntax.WhileKeyword.Span.Start,
                    doSyntax.SemicolonToken.Span.End);

                ifConditionGotoStart = new BoundSequencePointWithSpan(doSyntax, ifConditionGotoStart, span);
            }

            // do
            //   body
            // while (condition);
            //
            // becomes
            //
            // start: 
            // body
            // continue:
            // sequence point
            // GotoIfTrue condition start;
            // break:

            return BoundStatementList.Synthesized(syntax, node.HasErrors,
                new BoundLabelStatement(syntax, startLabel),
                rewrittenBody,
                new BoundLabelStatement(syntax, node.ContinueLabel),
                ifConditionGotoStart,
                new BoundLabelStatement(syntax, node.BreakLabel));
        }