soot
Class Body

java.lang.Object
  extended by soot.tagkit.AbstractHost
      extended by soot.Body
All Implemented Interfaces:
Serializable, Host
Direct Known Subclasses:
BafBody, DavaBody, StmtBody

public abstract class Body
extends AbstractHost
implements Serializable

Abstract base class that models the body (code attribute) of a Java method. Classes that implement an Intermediate Representation for a method body should subclass it. In particular the classes GrimpBody, JimpleBody and BafBody all extend this class. This class provides methods that are common to any IR, such as methods to get the body's units (statements), traps, and locals.

See Also:
GrimpBody, JimpleBody, BafBody, Serialized Form

Field Summary
protected  Chain<Local> localChain
          The chain of locals for this Body.
protected  SootMethod method
          The method associated with this Body.
protected  Chain<Trap> trapChain
          The chain of traps for this Body.
protected  PatchingChain<Unit> unitChain
          The chain of units for this Body.
 
Constructor Summary
protected Body()
          Creates an extremely empty Body.
protected Body(SootMethod m)
          Creates a Body associated to the given method.
 
Method Summary
 void checkInit()
           
abstract  Object clone()
          Creates a deep copy of this Body.
 List<UnitBox> getAllUnitBoxes()
          Returns the result of iterating through all Units in this body and querying them for their UnitBoxes.
 List<ValueBox> getDefBoxes()
          Returns the result of iterating through all Units in this body and querying them for ValueBoxes defined.
 int getLocalCount()
          Returns the number of locals declared in this body.
 Chain<Local> getLocals()
          Returns a backed chain of the locals declared in this Body.
 SootMethod getMethod()
          Returns the method associated with this Body.
 Local getParameterLocal(int i)
          Return LHS of the first identity stmt assigning from \@parameter i.
 Local getThisLocal()
          Return LHS of the first identity stmt assigning from \@this.
 Chain<Trap> getTraps()
          Returns a backed view of the traps found in this Body.
 List<UnitBox> getUnitBoxes(boolean branchTarget)
          If branchTarget is true, returns the result of iterating through all branching Units in this body and querying them for their UnitBoxes.
 PatchingChain<Unit> getUnits()
          Returns the Chain of Units that make up this body.
 List<ValueBox> getUseAndDefBoxes()
          Returns a list of boxes corresponding to Values either used or defined in any unit of this Body.
 List<ValueBox> getUseBoxes()
          Returns the result of iterating through all Units in this body and querying them for ValueBoxes used.
 Map<Object,Object> importBodyContentsFrom(Body b)
          Copies the contents of the given Body into this one.
 void setMethod(SootMethod method)
          Sets the method associated with this Body.
 String toString()
          
 void validate()
          Verifies a few sanity conditions on the contents on this body.
 void validateLocals()
          Verifies that each Local of getUseAndDefBoxes() is in this body's locals Chain.
 void validateTraps()
          Verifies that the begin, end and handler units of each trap are in this body.
 void validateUnitBoxes()
          Verifies that the UnitBoxes of this Body all point to a Unit contained within this body.
 void validateUses()
          Verifies that each use in this Body has a def.
 void validateValueBoxes()
          Verifies that a ValueBox is not used in more than one place.
 
Methods inherited from class soot.tagkit.AbstractHost
addAllTagsOf, addTag, getTag, getTags, hasTag, removeAllTags, removeTag
 
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

method

protected transient SootMethod method
The method associated with this Body.


localChain

protected Chain<Local> localChain
The chain of locals for this Body.


trapChain

protected Chain<Trap> trapChain
The chain of traps for this Body.


unitChain

protected PatchingChain<Unit> unitChain
The chain of units for this Body.

Constructor Detail

Body

protected Body(SootMethod m)
Creates a Body associated to the given method. Used by subclasses during initialization. Creation of a Body is triggered by e.g. Jimple.v().newBody(options).


Body

protected Body()
Creates an extremely empty Body. The Body is not associated to any method.

Method Detail

clone

public abstract Object clone()
Creates a deep copy of this Body.

Overrides:
clone in class Object

getMethod

public SootMethod getMethod()
Returns the method associated with this Body.

Returns:
the method that owns this body.

setMethod

public void setMethod(SootMethod method)
Sets the method associated with this Body.

Parameters:
method - the method that owns this body.

getLocalCount

public int getLocalCount()
Returns the number of locals declared in this body.


importBodyContentsFrom

public Map<Object,Object> importBodyContentsFrom(Body b)
Copies the contents of the given Body into this one.


validate

public void validate()
Verifies a few sanity conditions on the contents on this body.


validateValueBoxes

public void validateValueBoxes()
Verifies that a ValueBox is not used in more than one place.


validateLocals

public void validateLocals()
Verifies that each Local of getUseAndDefBoxes() is in this body's locals Chain.


validateTraps

public void validateTraps()
Verifies that the begin, end and handler units of each trap are in this body.


validateUnitBoxes

public void validateUnitBoxes()
Verifies that the UnitBoxes of this Body all point to a Unit contained within this body.


validateUses

public void validateUses()
Verifies that each use in this Body has a def.


getLocals

public Chain<Local> getLocals()
Returns a backed chain of the locals declared in this Body.


getTraps

public Chain<Trap> getTraps()
Returns a backed view of the traps found in this Body.


getThisLocal

public Local getThisLocal()
Return LHS of the first identity stmt assigning from \@this.


getParameterLocal

public Local getParameterLocal(int i)
Return LHS of the first identity stmt assigning from \@parameter i.


getUnits

public PatchingChain<Unit> getUnits()
Returns the Chain of Units that make up this body. The units are returned as a PatchingChain. The client can then manipulate the chain, adding and removing units, and the changes will be reflected in the body. Since a PatchingChain is returned the client need not worry about removing exception boundary units or otherwise corrupting the chain.

Returns:
the units in this Body
See Also:
PatchingChain, Unit

getAllUnitBoxes

public List<UnitBox> getAllUnitBoxes()
Returns the result of iterating through all Units in this body and querying them for their UnitBoxes. All UnitBoxes thus found are returned. Branching Units and statements which use PhiExpr will have UnitBoxes; a UnitBox contains a Unit that is either a target of a branch or is being used as a pointer to the end of a CFG block.

This method is typically used for pointer patching, eg when the unit chain is cloned.

Returns:
A list of all the UnitBoxes held by this body's units.
See Also:
UnitBox, getUnitBoxes(boolean), Unit.getUnitBoxes(), UnitBoxOwner.getUnitBoxes()

getUnitBoxes

public List<UnitBox> getUnitBoxes(boolean branchTarget)
If branchTarget is true, returns the result of iterating through all branching Units in this body and querying them for their UnitBoxes. These UnitBoxes contain Units that are the target of a branch. This is useful for, say, labeling blocks or updating the targets of branching statements.

If branchTarget is false, returns the result of iterating through the non-branching Units in this body and querying them for their UnitBoxes. Any such UnitBoxes (typically from PhiExpr) contain a Unit that indicates the end of a CFG block.

Returns:
a list of all the UnitBoxes held by this body's branching units.
See Also:
UnitBox, getAllUnitBoxes(), Unit.getUnitBoxes(), UnitBoxOwner.getUnitBoxes()

getUseBoxes

public List<ValueBox> getUseBoxes()
Returns the result of iterating through all Units in this body and querying them for ValueBoxes used. All of the ValueBoxes found are then returned as a List.

Returns:
a list of all the ValueBoxes for the Values used this body's units.
See Also:
Value, Unit.getUseBoxes(), ValueBox, Value

getDefBoxes

public List<ValueBox> getDefBoxes()
Returns the result of iterating through all Units in this body and querying them for ValueBoxes defined. All of the ValueBoxes found are then returned as a List.

Returns:
a list of all the ValueBoxes for Values defined by this body's units.
See Also:
Value, Unit.getDefBoxes(), ValueBox, Value

getUseAndDefBoxes

public List<ValueBox> getUseAndDefBoxes()
Returns a list of boxes corresponding to Values either used or defined in any unit of this Body.

Returns:
a list of ValueBoxes for held by the body's Units.
See Also:
Value, Unit.getUseAndDefBoxes(), ValueBox, Value

checkInit

public void checkInit()

toString

public String toString()

Overrides:
toString in class Object