Example #1
0
        /// <summary>
        /// Visits foreach statement and creates the foreach contruct in cfg.
        /// </summary>
        /// <param name="x">ForeachStmt</param>
        public override void VisitForeachStmt(ForeachStmt x)
        {
            BasicBlock foreachHead = new BasicBlock();
            BasicBlock foreachBody = new BasicBlock();
            BasicBlock foreachSink = new BasicBlock();

            foreachHead.CreateWorklistSegment(foreachSink);

            //Input edge to the foreach statement
            BasicBlockEdge.ConnectDirectEdge(currentBasicBlock, foreachHead);
            foreachHead.AddElement(x);

            //Conditional edge to the foreach body
            BasicBlockEdge.ConnectForeachEdge(foreachHead, foreachBody);

            //Visits foreach body
            loopData.Push(new LoopData(foreachHead, foreachSink));
            currentBasicBlock = foreachBody;
            x.Body.VisitMe(this);
            loopData.Pop();

            //Connect end of foreach with foreach head
            BasicBlockEdge.ConnectDirectEdge(currentBasicBlock, foreachHead);

            //Output edge to the sink
            BasicBlockEdge.ConnectDirectEdge(foreachHead, foreachSink);
            currentBasicBlock = foreachSink;
        }