public virtual int GetPointerByAbsOffset(int offset)
        {
            int absoffset = offset;

            if (collinstr.ContainsKey(absoffset))
            {
                return(collinstr.GetIndexByKey(absoffset));
            }
            else
            {
                return(-1);
            }
        }
        private static IGraphNode GetCommonIDom(IGraphNode node1, IGraphNode node2, VBStyleCollection
                                                <IGraphNode, IGraphNode> orderedIDoms)
        {
            IGraphNode nodeOld;

            if (node1 == null)
            {
                return(node2);
            }
            else if (node2 == null)
            {
                return(node1);
            }
            int index1 = orderedIDoms.GetIndexByKey(node1);
            int index2 = orderedIDoms.GetIndexByKey(node2);

            while (index1 != index2)
            {
                if (index1 > index2)
                {
                    nodeOld = node1;
                    node1   = orderedIDoms.GetWithKey(node1);
                    if (nodeOld == node1)
                    {
                        // no idom - root or merging point
                        return(null);
                    }
                    index1 = orderedIDoms.GetIndexByKey(node1);
                }
                else
                {
                    nodeOld = node2;
                    node2   = orderedIDoms.GetWithKey(node2);
                    if (nodeOld == node2)
                    {
                        // no idom - root or merging point
                        return(null);
                    }
                    index2 = orderedIDoms.GetIndexByKey(node2);
                }
            }
            return(node1);
        }
Beispiel #3
0
        public virtual void ReplaceStatement(Statement oldstat, Statement newstat)
        {
            foreach (StatEdge edge in oldstat.GetAllPredecessorEdges())
            {
                oldstat.RemovePredecessor(edge);
                edge.GetSource().ChangeEdgeNode(Direction_Forward, edge, newstat);
                newstat.AddPredecessor(edge);
            }
            foreach (StatEdge edge in oldstat.GetAllSuccessorEdges())
            {
                oldstat.RemoveSuccessor(edge);
                edge.SetSource(newstat);
                newstat.AddSuccessor(edge);
            }
            int statindex = stats.GetIndexByKey(oldstat.id);

            stats.RemoveWithKey(oldstat.id);
            stats.AddWithKeyAndIndex(statindex, newstat, newstat.id);
            newstat.SetParent(this);
            newstat.post = oldstat.post;
            if (first == oldstat)
            {
                first = newstat;
            }
            List <StatEdge> lst = new List <StatEdge>(oldstat.GetLabelEdges());

            for (int i = lst.Count - 1; i >= 0; i--)
            {
                StatEdge edge = lst[i];
                if (edge.GetSource() != newstat)
                {
                    newstat.AddLabeledEdge(edge);
                }
                else if (this == edge.GetDestination() || this.ContainsStatementStrict(edge.GetDestination
                                                                                           ()))
                {
                    edge.closure = null;
                }
                else
                {
                    this.AddLabeledEdge(edge);
                }
            }
            oldstat.GetLabelEdges().Clear();
        }