soot
Class Body

java.lang.Object
  |
  +--soot.tagkit.AbstractHost
        |
        +--soot.Body
Direct Known Subclasses:
BafBody, DavaBody, StmtBody

public abstract class Body
extends AbstractHost
implements java.io.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 localChain
          The chain of locals for this Body.
protected  SootMethod method
          The method associated with this Body.
protected  Chain trapChain
          The chain of traps for this Body.
protected  PatchingChain 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
abstract  java.lang.Object clone()
          Creates a deep copy of this Body.
 java.util.List getAllUnitBoxes()
          Returns the result of iterating through all Units in this body and querying them for their UnitBoxes.
 java.util.List 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 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 getTraps()
          Returns a backed view of the traps found in this Body.
 java.util.List 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 getUnits()
          Returns the Chain of Units that make up this body.
 java.util.List getUseAndDefBoxes()
          Returns a list of boxes corresponding to Values either used or defined in any unit of this Body.
 java.util.List getUseBoxes()
          Returns the result of iterating through all Units in this body and querying them for ValueBoxes used.
 void importBodyContentsFrom(Body b)
          Copies the contents of the given Body into this one.
 void setMethod(SootMethod method)
          Sets the method associated with this Body.
 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.
 
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, toString, wait, wait, wait
 

Field Detail

method

protected transient SootMethod method
The method associated with this Body.

localChain

protected Chain localChain
The chain of locals for this Body.

trapChain

protected Chain trapChain
The chain of traps for this Body.

unitChain

protected PatchingChain 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 java.lang.Object clone()
Creates a deep copy of this Body.
Overrides:
clone in class java.lang.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 void 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.

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 getLocals()
Returns a backed chain of the locals declared in this Body.

getTraps

public Chain 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 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 java.util.List 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 java.util.List 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 java.util.List 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 java.util.List 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 java.util.List 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