protected virtual BoundStatement RewriteBlockStatement(BoundBlockStatement node) { ImmutableArray <BoundStatement> .Builder builder = null; for (var i = 0; i < node.Statements.Length; ++i) { var statement = RewriteStatement(node.Statements[i]); if (statement != node.Statements[i]) { if (builder == null) { builder = ImmutableArray.CreateBuilder <BoundStatement>(node.Statements.Length); for (var j = 0; j < i; ++j) { builder.Add(node.Statements[j]); } } } if (builder != null) { builder.Add(statement); } } if (builder == null) { return(node); } return(new BoundBlockStatement(builder.MoveToImmutable())); }
public List <BasicBlock> Build(BoundBlockStatement blockStatement) { foreach (var statement in blockStatement.Statements) { switch (statement.Kind) { case BoundNodeKind.ExpressionStatement: case BoundNodeKind.VariableDeclarationStatement: //add to current block _statements.Add(statement); break; case BoundNodeKind.GotoStatement: case BoundNodeKind.ConditionalGotoStatement: case BoundNodeKind.ReturnStatement: //end block _statements.Add(statement); StartBlock(); break; case BoundNodeKind.LabelStatement: //start block StartBlock(); _statements.Add(statement); break; default: throw new Exception($"Unexpected statement: {statement.Kind}"); } } EndBlock(); return(_blocks.ToList()); }
public static ControlFlowGraph Create(BoundBlockStatement body) { var basicBlockBuiler = new BasicBlockBuilder(); var blocks = basicBlockBuiler.Build(body); var graphBuilder = new GraphBuilder(); return(graphBuilder.Build(blocks)); }
public static bool AllPathsReturn(BoundBlockStatement body) { var graph = Create(body); foreach (var branch in graph.End.Incoming) { var s = branch.From.Statements.Last(); if (s.Kind != BoundNodeKind.ReturnStatement) { return(false); } } return(true); }
private static void WriteBlockStatement(BoundBlockStatement node, IndentedTextWriter writer) { writer.WritePunctuation(SyntaxKind.OpenBraceToken); writer.WriteLine(); writer.Indent++; foreach (var s in node.Statements) { s.WriteTo(writer); } writer.Indent--; writer.WritePunctuation(SyntaxKind.CloseBraceToken); writer.WriteLine(); }
public BoundProgram(BoundBlockStatement statement, DiagnosticBag diagnostics, ImmutableDictionary <FunctionSymbol, BoundBlockStatement> functionBodies) { Statement = statement; Diagnostics = diagnostics; FunctionBodies = functionBodies; }