예제 #1
0
        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();
        }
예제 #6
0
 public BoundProgram(BoundBlockStatement statement, DiagnosticBag diagnostics, ImmutableDictionary <FunctionSymbol, BoundBlockStatement> functionBodies)
 {
     Statement      = statement;
     Diagnostics    = diagnostics;
     FunctionBodies = functionBodies;
 }