public static FlowGraph HeapSimpleConstructorGraph(FlowGraphId id)
        {
            var builder = new FlowGraphBuilder(id);

            var enterNode = builder.AddEnterNode();

            var n = builder.AddLocalVariable(References.Sort, "n");

            var newNode = builder.AddCallNode(
                new TestRoutineLocation(typeof(SampleFlowGraphGenerator).GetMethod(nameof(NodeConstructorGraph)), true),
                new Expression[] { References.Null, ExpressionFactory.IntInterpretation(0), References.Null },
                n.ToSingular(),
                CallKind.ObjectCreation);

            var n_value = builder.AddLocalVariable(Sort.Int, "n_value");
            var assert1 = builder.AddLocalVariable(Sort.Bool, "assert1");
            var assert2 = builder.AddLocalVariable(Sort.Bool, "assert2");

            var assertNode = builder.AddInnerNode(new Operation[]
            {
                new Assignment(assert1, builder.AddReferenceComparison(false, n, References.Null)),
                new FieldRead(n_value, n, SampleLinkedListDefinitions.Value),
                new Assignment(assert2, (IntHandle)n_value == 0)
            });

            var returnNode = builder.AddReturnNode();

            builder.AddEdge(enterNode, newNode);
            builder.AddEdge(newNode, assertNode);
            builder.AddEdge(assertNode, returnNode);

            return(builder.FreezeAndReleaseGraph());
        }
        public void EmptyReturnNodeCreatedProperly()
        {
            var graphId = new FlowGraphId(1);
            var builder = new FlowGraphBuilder(graphId);

            var node = builder.AddReturnNode();

            FlowGraphTestHelper.CheckReturnNode(node, builder.Graph, 0, 0, 0);
        }
        public static FlowGraph TrivialGraph(FlowGraphId id)
        {
            var builder = new FlowGraphBuilder(id);

            var enterNode = builder.AddEnterNode();
            var retNode   = builder.AddReturnNode();

            builder.AddEdge(enterNode, retNode);

            return(builder.FreezeAndReleaseGraph());
        }
        public void LocalVariableCreatedProperly()
        {
            var graphId = new FlowGraphId(1);
            var builder = new FlowGraphBuilder(graphId);

            string name     = "testBoolVar";
            var    variable = builder.AddLocalVariable(Sort.Bool, name);

            ExpressionTestHelper.CheckExpression(variable, ExpressionKind.Variable, Sort.Bool, name, 0);
            Assert.AreEqual(builder.Graph, variable.Graph);
        }
        public void EmptyThrowExceptionNodeCreatedProperly()
        {
            var graphId = new FlowGraphId(1);
            var builder = new FlowGraphBuilder(graphId);

            var location = new TestRoutineLocation("ExceptionConstructor");

            var node = builder.AddThrowExceptionNode(location);

            FlowGraphTestHelper.CheckThrowExceptionNode(node, builder.Graph, 0, 0, location, 0);
        }
        public void EmptyCallNodeCreatedProperly()
        {
            var graphId = new FlowGraphId(1);
            var builder = new FlowGraphBuilder(graphId);

            var location = new TestRoutineLocation("CalledRoutine");

            var node = builder.AddCallNode(location);

            FlowGraphTestHelper.CheckCallNode(node, builder.Graph, 0, 0, location, 0, 0);
        }
        public void GlobalVariableCreatedProperly()
        {
            var graphId = new FlowGraphId(1);
            var builder = new FlowGraphBuilder(graphId);

            string name       = "testBoolVar";
            var    variableId = new GlobalFlowVariableId(1);
            var    variable   = new GlobalFlowVariable(variableId, Sort.Bool, name);

            ExpressionTestHelper.CheckExpression(variable, ExpressionKind.Variable, Sort.Bool, name, 0);
        }
        public void EdgeCreatedProperly()
        {
            var graphId = new FlowGraphId(1);
            var builder = new FlowGraphBuilder(graphId);

            var nodeA = builder.AddInnerNode();
            var nodeB = builder.AddInnerNode();
            var edge  = builder.AddEdge(nodeA, nodeB, true);

            Assert.AreEqual(builder.Graph, edge.Graph);
            Assert.AreEqual(nodeA, edge.From);
            Assert.AreEqual(nodeB, edge.To);
            Assert.AreEqual(ExpressionFactory.True, edge.Condition.Expression);
        }
        public static FlowGraph IntAddGraph(FlowGraphId id)
        {
            var builder = new FlowGraphBuilder(id);

            var aParam    = builder.AddLocalVariable(Sort.Int, "a");
            var bParam    = builder.AddLocalVariable(Sort.Int, "b");
            var enterNode = builder.AddEnterNode(new[] { aParam, bParam });

            var retValueHandle = (IntHandle)aParam + (IntHandle)bParam;
            var retNode        = builder.AddReturnNode(new[] { retValueHandle.Expression });

            builder.AddEdge(enterNode, retNode);

            return(builder.FreezeAndReleaseGraph());
        }
        public static FlowGraph HeapSimpleComparisonGraph(FlowGraphId id)
        {
            var builder = new FlowGraphBuilder(id);

            var a = builder.AddLocalVariable(References.Sort, "a");
            var b = builder.AddLocalVariable(References.Sort, "b");

            var enterNode = builder.AddEnterNode(new[] { a, b });

            var a_eq_b  = builder.AddReferenceComparison(true, a, b);
            var a_neq_b = builder.AddReferenceComparison(false, a, b);

            var a_next           = builder.AddLocalVariable(References.Sort, "a_next");
            var b_next           = builder.AddLocalVariable(References.Sort, "b_next");
            var a_next_eq_b_next = builder.AddReferenceComparison(true, a_next, b_next);
            var eqAssert         = builder.AddLocalVariable(Sort.Bool, "assert1");

            var eqNode = builder.AddInnerNode(new Operation[]
            {
                new FieldRead(a_next, a, SampleLinkedListDefinitions.Next),
                new FieldRead(b_next, b, SampleLinkedListDefinitions.Next),
                new Assignment(eqAssert, a_next_eq_b_next)
            });

            var a_value   = builder.AddLocalVariable(Sort.Int, "a_value");
            var b_value   = builder.AddLocalVariable(Sort.Int, "b_value");
            var neqAssert = builder.AddLocalVariable(Sort.Bool, "assert2");

            var neqNode = builder.AddInnerNode(new Operation[]
            {
                new FieldWrite(a, SampleLinkedListDefinitions.Value, new IntHandle(5)),
                new FieldWrite(b, SampleLinkedListDefinitions.Value, new IntHandle(10)),

                new FieldRead(a_value, a, SampleLinkedListDefinitions.Value),
                new FieldRead(b_value, b, SampleLinkedListDefinitions.Value),
                new Assignment(neqAssert, (IntHandle)a_value != (IntHandle)b_value)
            });

            var returnNode = builder.AddReturnNode();

            builder.AddEdge(enterNode, eqNode, a_eq_b);
            builder.AddEdge(eqNode, returnNode);
            builder.AddEdge(enterNode, neqNode, a_neq_b);
            builder.AddEdge(neqNode, returnNode);

            return(builder.FreezeAndReleaseGraph());
        }
        public static FlowGraph HeapSimpleBranchingGraph(FlowGraphId id)
        {
            var builder = new FlowGraphBuilder(id);

            var n = builder.AddLocalVariable(References.Sort, "n");

            var enterNode = builder.AddEnterNode(n.ToSingular());

            var n_eq_null  = builder.AddReferenceComparison(true, n, References.Null);
            var n_neq_null = builder.AddReferenceComparison(false, n, References.Null);

            var eqNewNode = builder.AddCallNode(
                new TestRoutineLocation(typeof(SampleFlowGraphGenerator).GetMethod(nameof(NodeConstructorGraph)), true),
                new Expression[] { References.Null, ExpressionFactory.IntInterpretation(0), n },
                n.ToSingular(),
                CallKind.ObjectCreation);

            var n_next         = builder.AddLocalVariable(References.Sort, "n_next");
            var eqAssertResult = builder.AddLocalVariable(Sort.Bool, "assert1");

            var eqAssertNode = builder.AddInnerNode(new Operation[]
            {
                new FieldRead(n_next, n, SampleLinkedListDefinitions.Next),
                new Assignment(eqAssertResult, builder.AddReferenceComparison(true, n_next, References.Null))
            });

            var val             = builder.AddLocalVariable(Sort.Int, "val");
            var neqAssertResult = builder.AddLocalVariable(Sort.Bool, "assert2");

            var neqNode = builder.AddInnerNode(new Operation[]
            {
                new FieldRead(val, n, SampleLinkedListDefinitions.Value),
                new Assignment(neqAssertResult, builder.AddReferenceComparison(false, n, References.Null))
            });

            var returnNode = builder.AddReturnNode();

            builder.AddEdge(enterNode, eqNewNode, n_eq_null);
            builder.AddEdge(eqNewNode, eqAssertNode);
            builder.AddEdge(eqAssertNode, returnNode);
            builder.AddEdge(enterNode, neqNode, n_neq_null);
            builder.AddEdge(neqNode, returnNode);

            return(builder.FreezeAndReleaseGraph());
        }
        public void EmptyGraphCreatedProperly()
        {
            var graphId = new FlowGraphId(1);
            var builder = new FlowGraphBuilder(graphId);

            Assert.AreNotEqual(null, builder.Graph);
            Assert.AreEqual(true, builder.Graph.CanFreeze);

            var graphHandler = builder.FreezeAndReleaseGraph();

            Assert.AreEqual(null, builder.Graph);
            Assert.AreNotEqual(null, graphHandler.Value);

            FlowGraph graph = graphHandler;

            Assert.AreEqual(graphHandler.Value, graph);
            Assert.AreEqual(true, graph.IsFrozen);
            Assert.AreEqual(graphId, graph.Id);

            Assert.AreEqual(0, graph.Nodes.Count);
            Assert.AreEqual(0, graph.Edges.Count);
            Assert.AreEqual(0, graph.LocalVariables.Count);
        }
        public static FlowGraph NodeConstructorGraph(FlowGraphId id)
        {
            var builder = new FlowGraphBuilder(id);

            var @this = builder.AddLocalVariable(References.Sort, "this");
            var value = builder.AddLocalVariable(Sort.Int, "value");
            var next  = builder.AddLocalVariable(References.Sort, "next");

            var enterNode = builder.AddEnterNode(new[] { @this, value, next });

            var initNode = builder.AddInnerNode(new[]
            {
                new FieldWrite(@this, SampleLinkedListDefinitions.Value, value),
                new FieldWrite(@this, SampleLinkedListDefinitions.Next, next)
            });

            var returnNode = builder.AddReturnNode(@this.ToSingular());

            builder.AddEdge(enterNode, initNode);
            builder.AddEdge(initNode, returnNode);

            return(builder.FreezeAndReleaseGraph());
        }
        public static FlowGraph IntMaxGraph(FlowGraphId id)
        {
            var builder = new FlowGraphBuilder(id);

            var aParam    = builder.AddLocalVariable(Sort.Int, "a");
            var a         = (IntHandle)aParam;
            var bParam    = builder.AddLocalVariable(Sort.Int, "b");
            var b         = (IntHandle)bParam;
            var enterNode = builder.AddEnterNode(new[] { aParam, bParam });

            var ifResult       = builder.AddLocalVariable(Sort.Bool, "ifResult");
            var ifResultHandle = (BoolHandle)ifResult;
            var checkNode      = builder.AddInnerNode(new Assignment(ifResult, a > b));

            var retANode = builder.AddReturnNode(new[] { aParam });
            var retBNode = builder.AddReturnNode(new[] { bParam });

            builder.AddEdge(enterNode, checkNode);
            builder.AddEdge(checkNode, retANode, ifResultHandle);
            builder.AddEdge(checkNode, retBNode, !ifResultHandle);

            return(builder.FreezeAndReleaseGraph());
        }
Exemple #15
0
        // TODO: Implement proper exception handling
        private async Task <GeneratedGraphs> GenerateGraphsImpl(MethodLocation location, FlowGraphId graphId)
        {
            var declarationLocation = location.Method.Locations.FirstOrDefault();

            Contract.Assert(declarationLocation != null);
            Contract.Assert(declarationLocation.IsInSource);

            var root         = declarationLocation.SourceTree.GetRoot();
            var methodSyntax = root.FindNode(declarationLocation.SourceSpan) as BaseMethodDeclarationSyntax;

            Contract.Assert(methodSyntax != null);

            // TODO: Handle the continuation in a logic way
            var document      = this.Solution.GetDocument(root.SyntaxTree);
            var semanticModel = document.GetSemanticModelAsync().Result;

            var builder = new CSharpGraphBuilder(
                this.ModelManager,
                document.Id,
                semanticModel,
                methodSyntax);

            var buildGraph = await builder.BuildAsync();

            var flowGraphTranslator = new FlowGraphTranslator(buildGraph, builder.DisplayGraph, graphId);
            var result = flowGraphTranslator.Translate();

            result.Location = location;

            return(result);
        }
Exemple #16
0
 public FlowGraph this[FlowGraphId graphId] => this.graphs[graphId.Value];
Exemple #17
0
 IRoutineLocation IFlowGraphProvider.GetLocation(FlowGraphId graphId) => this.GetLocation(graphId);
Exemple #18
0
 public MethodLocation GetLocation(FlowGraphId graphId)
 {
     return(this.generatedGraphs[graphId].Location);
 }
Exemple #19
0
 public DisplayGraph GetDisplayGraph(FlowGraphId graphId)
 {
     return(this.generatedGraphs[graphId].DisplayGraph);
 }
Exemple #20
0
 public IRoutineLocation GetLocation(FlowGraphId graphId) => this.locations[graphId.Value];
Exemple #21
0
 public LocalFlowVariableOverlay <T> this[FlowGraphId graphId]
 {
     get { return(this.localVariableOverlay[graphId]); }
     set { this.localVariableOverlay[graphId] = value; }
 }
Exemple #22
0
 public FlowGraphTranslator(BuildGraph buildGraph, DisplayGraph displayGraph, FlowGraphId flowGraphId)
 {
     this.BuildGraph   = buildGraph;
     this.DisplayGraph = displayGraph;
     this.flowGraphId  = flowGraphId;
 }
        public static FlowGraph ComplexExampleGraph(FlowGraphId id)
        {
            var builder = new FlowGraphBuilder(id);

            var aVar      = builder.AddLocalVariable(Sort.Int, "a");
            var a         = (IntHandle)aVar;
            var bVar      = builder.AddLocalVariable(Sort.Int, "b");
            var b         = (IntHandle)bVar;
            var cVar      = builder.AddLocalVariable(Sort.Bool, "c");
            var c         = (BoolHandle)cVar;
            var enterNode = builder.AddEnterNode(new[] { aVar, bVar, cVar });

            var if1Var  = builder.AddLocalVariable(Sort.Bool, "if!1");
            var if1     = (BoolHandle)if1Var;
            var if1Node = builder.AddInnerNode(new Assignment(if1Var, a == 0));

            var ret1Node = builder.AddReturnNode(new[] { ExpressionFactory.IntInterpretation(-1) });

            var isNiceNumberLocation = new TestRoutineLocation("IsNiceNumber");
            var if21Var  = builder.AddLocalVariable(Sort.Bool, "if!2!1");
            var if21     = (BoolHandle)if21Var;
            var if21Node = builder.AddCallNode(isNiceNumberLocation, new[] { aVar }, new[] { if21Var });

            var if22CheckVar  = builder.AddLocalVariable(Sort.Bool, "if!2!2!check");
            var if22Check     = (BoolHandle)if22CheckVar;
            var if22CheckNode = builder.AddInnerNode(new Assignment(if22CheckVar, b != 0));

            var exceptionLocation = new TestRoutineLocation("DivisionByZeroException");
            var if22ThrowNode     = builder.AddThrowExceptionNode(exceptionLocation);

            var if22Var  = builder.AddLocalVariable(Sort.Bool, "if!2!2");
            var if22     = (BoolHandle)if22Var;
            var if22Node = builder.AddInnerNode(new Assignment(if22Var, a / b > 2 && b != -1));

            var dVar         = builder.AddLocalVariable(Sort.Int, "d");
            var d            = (IntHandle)dVar;
            var dEqualsBNode = builder.AddInnerNode(new Assignment(dVar, bVar));

            var while1Var  = builder.AddLocalVariable(Sort.Bool, "while!1");
            var while1     = (BoolHandle)while1Var;
            var while1Node = builder.AddInnerNode(new[] { new Assignment(while1Var, a < b) }, FlowNodeFlags.LoopCondition);

            var assert1Var    = builder.AddLocalVariable(Sort.Bool, "assert!1");
            var assert1       = (BoolHandle)assert1Var;
            var whileBodyNode = builder.AddInnerNode(
                new[]
            {
                new Assignment(aVar, a + a),
                new Assignment(assert1Var, a != 0)
            },
                FlowNodeFlags.LoopBody);

            var elseBodyNode = builder.AddInnerNode(new Assignment(aVar, a + b));

            var ret2Node = builder.AddReturnNode(new[] { aVar });

            builder.AddEdge(enterNode, if1Node);
            builder.AddEdge(if1Node, ret1Node, if1);
            builder.AddEdge(if1Node, if21Node, !if1);
            builder.AddEdge(if21Node, if22CheckNode, if21);
            builder.AddEdge(if22CheckNode, if22ThrowNode, !if22Check);
            builder.AddEdge(if22CheckNode, if22Node, if22Check);
            builder.AddEdge(if22Node, dEqualsBNode, if22);
            builder.AddEdge(dEqualsBNode, while1Node);
            builder.AddEdge(while1Node, whileBodyNode, while1);
            builder.AddEdge(whileBodyNode, while1Node);
            builder.AddEdge(while1Node, ret2Node, !while1);
            builder.AddEdge(if21Node, elseBodyNode, !if21);
            builder.AddEdge(if22Node, elseBodyNode, !if22);
            builder.AddEdge(elseBodyNode, ret2Node);

            return(builder.FreezeAndReleaseGraph());
        }
Exemple #24
0
 public FlowGraph this[FlowGraphId graphId]
 {
     get { return(this.generatedGraphs[graphId].FlowGraph); }
 }