protected override BoundStatement RewriteWhileStatement(BoundWhileStatement node) { // while <condition> // body // // --> becomes // // goto check // continue: // <body> // check: // gotoTrue <condition> continue // end: var continueLabel = GenerateLabel(); var checkLabel = GenerateLabel(); var endLabel = GenerateLabel(); var gotoLabel = GenerateLabel(); var gotoCheck = new BoundGoToStatement(checkLabel); var continueLabelStatement = new BoundLabelStatement(continueLabel); var checkLabelStatement = new BoundLabelStatement(checkLabel); var ebdLabelStatement = new BoundLabelStatement(endLabel); var gotoTrue = new BoundConditionalGotoStatement(continueLabel, node.Condition); var endLabelStatement = new BoundLabelStatement(endLabel); var result = new BoundBlockStatement(ImmutableArray.Create <BoundStatement>( gotoCheck, continueLabelStatement, node.Body, checkLabelStatement, gotoTrue, endLabelStatement )); return(RewriteStatement(result)); }
protected override BoundStatement RewriteIfStatement(BoundIfStatement node) { if (node.ElseStatement == null) { // if <condition> // <then> // // --> becomes // // gotoIfFalse <condition> end // <then> // end: var endLabel = GenerateLabel(); var gotoFalse = new BoundConditionalGotoStatement(endLabel, node.Condition, false); var endLabelStatement = new BoundLabelStatement(endLabel); var result = new BoundBlockStatement(ImmutableArray.Create <BoundStatement>(gotoFalse, node.ThenStatement, endLabelStatement)); return(RewriteStatement(result)); } else { // if <condition> // <then> // else // <else> // // --> becomes // // gotoIfFalse <condition> else // <then> // goto end // else: // <else> // end: var elseLabel = GenerateLabel(); var endLabel = GenerateLabel(); var gotoFalse = new BoundConditionalGotoStatement(elseLabel, node.Condition, false); var gotoEndStatement = new BoundGoToStatement(endLabel); var elseLabelStatement = new BoundLabelStatement(elseLabel); var endLabelStatement = new BoundLabelStatement(endLabel); var result = new BoundBlockStatement(ImmutableArray.Create <BoundStatement>( gotoFalse, node.ThenStatement, gotoEndStatement, elseLabelStatement, node.ElseStatement, endLabelStatement )); return(RewriteStatement(result)); } }
private void EmitGoToStatement(BoundGoToStatement statement) { this.instructions.Add(new TransientUnconditionalGoToInstruction(statement.Label, statement.Syntax.GoToToken.Range)); }