示例#1
0
 private void CollectLoopBody(GraphNode gn)
 {
     if (gn == Cutpoint)
     {
         return;
     }
     if (!LoopNodes.Contains(gn))
     {
         if (gn.IsCutpoint) // nested loop found
         {
             Loop lo = new Loop(gn);
             foreach (GraphNode lgn in lo.LoopNodes)
             {
                 if (!LoopNodes.Contains(lgn))
                 {
                     LoopNodes.Add(lgn);
                 }
             }
             NestedLoops.Add(lo);
         }
         else
         {
             LoopNodes.Add(gn);
         }
         foreach (GraphNode pre in gn.Pre)
         {
             if (!gn.LoopingPred.Contains(pre))
             {
                 CollectLoopBody(pre);
             }
         }
     }
 }
示例#2
0
 private void CollectLoopExitNodes()
 {
     foreach (GraphNode gn in LoopNodes)
     {
         foreach (GraphNode gn_ in gn.Suc)
         {
             if (!LoopNodes.Contains(gn_) && !LoopExitNodes.Contains(gn_))
             {
                 LoopExitNodes.Add(gn_);
             }
         }
     }
 }
示例#3
0
 public Loop(GraphNode cutpoint)
 {
     if (!cutpoint.IsCutpoint)
     {
         Debugger.Break();
     }
     Cutpoint = cutpoint;
     LoopNodes.Add(Cutpoint);
     foreach (GraphNode gn in Cutpoint.LoopingPred)
     {
         CollectLoopBody(gn);
     }
     CollectLoopExitNodes();
 }
示例#4
0
        // Copy Constructor
        public Loop(Loop l, GraphAnalyzer ga, string prefix)
        {
            Dictionary <GraphNode, GraphNode> clonemap = new Dictionary <GraphNode, GraphNode>();
            GraphNode clonecutpoint = null;

            foreach (GraphNode gn in l.LoopNodes)
            {
                clonemap[gn] = ga.CloneGraphNode(gn, prefix);
                if (gn == l.Cutpoint)
                {
                    clonecutpoint = clonemap[gn];
                }
            }

            if (clonecutpoint == null)
            {
                Debugger.Break();
                return;
            }
            // Replace the pre and post nodes by the corresponding clone
            foreach (GraphNode gn in l.LoopNodes)
            {
                List <GraphNode> newl = new List <GraphNode>();
                foreach (GraphNode g in clonemap[gn].Pre)
                {
                    if (clonemap.ContainsKey(g))
                    {
                        newl.Add(clonemap[g]);
                    }
                    else
                    {
                        newl.Add(g);
                    }
                }
                clonemap[gn].Pre = newl;
                newl             = new List <GraphNode>();
                foreach (GraphNode g in clonemap[gn].Suc)
                {
                    if (clonemap.ContainsKey(g))
                    {
                        newl.Add(clonemap[g]);
                    }
                    else
                    {
                        newl.Add(g);
                    }
                }
                clonemap[gn].Suc = newl;
                newl             = new List <GraphNode>();
                foreach (GraphNode g in clonemap[gn].LoopingPred)
                {
                    if (clonemap.ContainsKey(g))
                    {
                        newl.Add(clonemap[g]);
                    }
                    else
                    {
                        newl.Add(g);
                    }
                }
                clonemap[gn].LoopingPred = newl;
            }

            foreach (GraphNode gn in l.Cutpoint.LoopingPred)
            {
                clonecutpoint.LoopingPred.Remove(gn);
                clonecutpoint.LoopingPred.Add(clonemap[gn]);
            }



            SucLoops.AddRange(l.SucLoops);
            PreLoops.AddRange(l.PreLoops);
            Cutpoint = clonecutpoint;
            LoopNodes.Add(Cutpoint);
            foreach (GraphNode gn in Cutpoint.LoopingPred)
            {
                CollectLoopBody(gn);
            }
            CollectLoopExitNodes();
        }