Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /* Soot - a J*va Optimization Framework
   * Copyright (C) 1999-2010 Hossein Sadat-Mohtasham
   *
   * This library is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
   * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
 package soot.toolkits.graph.pdg;
 
 
 import java.util.List;
 
 import soot.G;
 import soot.SootClass;
 import soot.Unit;
This represents a region of control dependence obtained by constructing a program dependence graph. A PDGRegion is slightly different than a weak or strong region; the loops and conditional relations between regions are explicitly represented in the PDGRegion.

Author(s):
Hossein Sadat-Mohtasham Sep 2009
 
 
 public class PDGRegion implements IRegionIterable<PDGNode>{
 	
 	private SootClass m_class = null;;
 	private SootMethod m_method = null;
 	private List<PDGNodem_nodes = null;
 	private List<Unitm_units = null;
 	private LinkedHashMap<UnitPDGNodem_unit2pdgnode = null;
 	private int m_id = -1;
 	private UnitGraph m_unitGraph = null;
 	private PDGNode m_corrspondingPDGNode = null;
 	//The following are needed to create a tree of regions based on the containment (dependency)
 	//relation between regions.
 	private IRegion m_parent = null;
 	//The following keeps the child regions
 	private List<IRegionm_children = new ArrayList<IRegion>();
 	
 	
 	public PDGRegion(int idSootMethod mSootClass cUnitGraph ugPDGNode node)
 	{
 		this(idnew ArrayList<PDGNode>(), mcugnode);
 		
 	}
 	
 	public PDGRegion(int idList<PDGNodenodesSootMethod mSootClass cUnitGraph ugPDGNode node)
 	{
 		
 		this. = nodes;
 		this. = id;
 		this. = m;
 		this. = c;
 		this. = ug;
 		this. = null;
 		this. = node;	
 		
 		if(Options.v().verbose())
 			G.v()..println("New pdg region create: " + id);
 		
 	}
 	
 	public PDGRegion(PDGNode node)
 	{
 		this(((IRegion)node.getNode()).getID(), 
 				((IRegion)node.getNode()).getSootMethod(), 
 				((IRegion)node.getNode()).getSootClass(), 
 				((IRegion)node.getNode()).getUnitGraph(), 
 				node);
 		
 	}
 	
 	{
 		return this.;
	}
	@SuppressWarnings("unchecked")
	public Object clone()
	{
		PDGRegion r = new PDGRegion(this.this.this.this.);
		r.m_nodes = (List<PDGNode>)((ArrayList<PDGNode>)this.).clone();
		return r;
	}
	{
		return this.;
	}
	{
		return this.;
	}
	public List<PDGNodegetNodes()
	{
		return this.;
	}
	{
		return this.;
	}

This is an iterator that knows how to follow the control flow in a region. It only iterates through the dependent nodes that contribute to the list of units in a region as defined by a weak region.
	{
		List<PDGNodem_list = null;
		PDGNode m_current = null;
		boolean beginning = true;
		 
		{
			 = list;
		}
		public boolean hasNext() {
				if(.size() > 0)
					return true;
			return ( != null && .getNext() != null);
		}
		public PDGNode next() {
			{
				 = false;
				//Find the first node in the control flow
				/*
				 * There cannot be more than one CFG node in a region
				 * unless there is a control flow edge between them. However,
				 * there could be a CFG node and other region nodes (back
				 * dependency, or other.) In such cases, the one CFG node 
				 * should be found and returned, and other region nodes should
				 * be ignored. Unless it's a LoopedPDGNode (in which case control 
				 * flow edge should still exist if there are other sibling Looped
				 * PDGNodes or CFG nodes.)
				 * 
				 */
				while(.getPrev() != null)
				{
					/*
					 * Look for useful dependence whose units are considered to be part of this region (loop header
					 * or CFG block nodes.)
					 * 
					 */
					for(Iterator<PDGNodedepItr = .iterator(); depItr.hasNext(); )
					{
						PDGNode dep = depItr.next();
						{
							 = dep;
							//go to the beginning of the flow
							while(.getPrev() != null)
							break;
						}
					}
				}
				return ;
			}
			if(!hasNext())
				throw new RuntimeException("No more nodes!");
			return ;
		}
		public void remove() {
		}
	}

return an iterator that know how to follow the control flow in a region. This actually returns a ChildPDGFlowIterator that only iterates through the dependent nodes that contribute to the units that belong to a region as defined by a weak region.
	{
		return new ChildPDGFlowIterator(this.);
	}
	public List<UnitgetUnits()
	{
		if(this. == null)
		{
			this. = new LinkedList<Unit>();
			for(Iterator<PDGNodeitr = this.iterator(); itr.hasNext();)
			{
				PDGNode node = itr.next();
				 
				if(node.getType() == ..)
				{
					//Actually, we should only get here if a loop header region is in this region's children list.
					//Or if the PDG is based on an ExceptionalUnitGraph, then this could be the region corresponding
					//to a handler, in which case it's ignored.
					//if(node.getAttrib() == PDGNode.Attribute.LOOPHEADER)
					if(node instanceof LoopedPDGNode)
					{						
						PDGNode header = n.getHeader();
						Block headerBlock = (Blockheader.getNode();
						for(Iterator<Unititr1 = headerBlock.iterator(); itr1.hasNext();)
						{
							Unit u = itr1.next();
							this..put(uheader);
						}
					}
				}
				else if(node.getType() == ..)
				{
					Block b = (Blocknode.getNode();
					for(Iterator<Unititr1 = b.iterator(); itr1.hasNext();)
					{
						Unit u = itr1.next();
						this..put(unode);
					}
				}
				else
					throw new RuntimeException("Exception in PDGRegion.getUnits: PDGNode's type is undefined!");
			}
		}
		return this.;
	}

Parameters:
a Statement within the region
Returns:
The PDGNode that contains that unit, if this unit is in this region.
	{
			return this..get(u);
		else
			return null;
	}
	public List<UnitgetUnits(Unit fromUnit to)
	{
	}
	public Unit getLast()
	{
		if(this. != null)
			if(this..size() > 0)
				return ((LinkedList<Unit>)this.).getLast();
		return null;
	}
	public Unit getFirst()
	{
		if(this. != null)
			if(this..size() > 0)
				return ((LinkedList<Unit>)this.).getFirst();
		return null;
	}
	//FIXME: return the real list of blocks
	public List<BlockgetBlocks()
	{
		return new ArrayList<Block>();
	}
	public void addPDGNode(PDGNode node)
	{
		this..add(node);
	}
	public int getID()
	{
		return this.;
	}
	public boolean occursBefore(Unit u1Unit u2)
	{
		int i = this..lastIndexOf(u1);
		int j = this..lastIndexOf(u2);
		if(i == -1 || j == -1)
			throw new RuntimeException("These units don't exist in the region!");
		return i < j;
	}
	public void setParent(IRegion pr)
	{
		this. = pr;
	}
	public IRegion getParent()
	{
		return this.;
	}
	public void addChildRegion(IRegion chr)
	{
		if(!this..contains(chr))
			this..add(chr);
	}
	{
		return this.;
	}
	public String toString()
	{
		String str = new String();
		str += "Begin-----------PDGRegion:  " + this. + "-------------\n";
		if(this. != null)
			str += "Parent is: " + this..getID() + "----\n";
		str += "Children Regions are: ";
		for(Iterator<IRegionritr = this..iterator(); ritr.hasNext();)
			str += ((IRegion)ritr.next()).getID() + ", ";
		str += "\nUnits are: \n";
		List<UnitregionUnits = this.getUnits();		
		for (Iterator<Unititr = regionUnits.iterator(); itr.hasNext();) 
		{
			Unit u = itr.next();
			str += u + "\n";
		}
		str += "End of PDG Region " + this. + " -----------------------------\n";
		return str;
	}
New to GrepCode? Check out our FAQ X