public abstract class AbstractCFG<I,T extends IBasicBlock<I>> extends Object implements ControlFlowGraph<I,T>, Constants
ControlFlowGraph
implementations.ACC_ABSTRACT, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_TRANSIENT, ACC_VOLATILE, CONSTANT_Class, CONSTANT_Double, CONSTANT_FieldRef, CONSTANT_Float, CONSTANT_Integer, CONSTANT_InterfaceMethodRef, CONSTANT_InvokeDynamic, CONSTANT_Long, CONSTANT_MethodHandle, CONSTANT_MethodRef, CONSTANT_MethodType, CONSTANT_NameAndType, CONSTANT_String, CONSTANT_Utf8, indexedTypes, indexedTypes_T, MAYBE, NO, OP_aaload, OP_aastore, OP_aconst_null, OP_aload, OP_aload_0, OP_aload_1, OP_aload_2, OP_aload_3, OP_anewarray, OP_areturn, OP_arraylength, OP_astore, OP_astore_0, OP_astore_1, OP_astore_2, OP_astore_3, OP_athrow, OP_baload, OP_bastore, OP_bipush, OP_caload, OP_castore, OP_checkcast, OP_d2f, OP_d2i, OP_d2l, OP_dadd, OP_daload, OP_dastore, OP_dcmpg, OP_dcmpl, OP_dconst_0, OP_dconst_1, OP_ddiv, OP_dload, OP_dload_0, OP_dload_1, OP_dload_2, OP_dload_3, OP_dmul, OP_dneg, OP_drem, OP_dreturn, OP_dstore, OP_dstore_0, OP_dstore_1, OP_dstore_2, OP_dstore_3, OP_dsub, OP_dup, OP_dup_x1, OP_dup_x2, OP_dup2, OP_dup2_x1, OP_dup2_x2, OP_f2d, OP_f2i, OP_f2l, OP_fadd, OP_faload, OP_fastore, OP_fcmpg, OP_fcmpl, OP_fconst_0, OP_fconst_1, OP_fconst_2, OP_fdiv, OP_fload, OP_fload_0, OP_fload_1, OP_fload_2, OP_fload_3, OP_fmul, OP_fneg, OP_frem, OP_freturn, OP_fstore, OP_fstore_0, OP_fstore_1, OP_fstore_2, OP_fstore_3, OP_fsub, OP_getfield, OP_getstatic, OP_goto, OP_goto_w, OP_i2b, OP_i2c, OP_i2d, OP_i2f, OP_i2l, OP_i2s, OP_iadd, OP_iaload, OP_iand, OP_iastore, OP_iconst_0, OP_iconst_1, OP_iconst_2, OP_iconst_3, OP_iconst_4, OP_iconst_5, OP_iconst_m1, OP_idiv, OP_if_acmpeq, OP_if_acmpne, OP_if_icmpeq, OP_if_icmpge, OP_if_icmpgt, OP_if_icmple, OP_if_icmplt, OP_if_icmpne, OP_ifeq, OP_ifge, OP_ifgt, OP_ifle, OP_iflt, OP_ifne, OP_ifnonnull, OP_ifnull, OP_iinc, OP_iload, OP_iload_0, OP_iload_1, OP_iload_2, OP_iload_3, OP_imul, OP_ineg, OP_instanceof, OP_invokedynamic, OP_invokeinterface, OP_invokespecial, OP_invokestatic, OP_invokevirtual, OP_ior, OP_irem, OP_ireturn, OP_ishl, OP_ishr, OP_istore, OP_istore_0, OP_istore_1, OP_istore_2, OP_istore_3, OP_isub, OP_iushr, OP_ixor, OP_jsr, OP_jsr_w, OP_l2d, OP_l2f, OP_l2i, OP_ladd, OP_laload, OP_land, OP_lastore, OP_lcmp, OP_lconst_0, OP_lconst_1, OP_ldc, OP_ldc_w, OP_ldc2_w, OP_ldiv, OP_lload, OP_lload_0, OP_lload_1, OP_lload_2, OP_lload_3, OP_lmul, OP_lneg, OP_lookupswitch, OP_lor, OP_lrem, OP_lreturn, OP_lshl, OP_lshr, OP_lstore, OP_lstore_0, OP_lstore_1, OP_lstore_2, OP_lstore_3, OP_lsub, OP_lushr, OP_lxor, OP_monitorenter, OP_monitorexit, OP_multianewarray, OP_new, OP_newarray, OP_nop, OP_pop, OP_pop2, OP_putfield, OP_putstatic, OP_ret, OP_return, OP_saload, OP_sastore, OP_sipush, OP_swap, OP_tableswitch, OP_wide, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TYPE_boolean, TYPE_boolean_index, TYPE_byte, TYPE_byte_index, TYPE_char, TYPE_char_index, TYPE_Class, TYPE_double, TYPE_double_index, TYPE_Error, TYPE_Exception, TYPE_float, TYPE_float_index, TYPE_int, TYPE_int_index, TYPE_long, TYPE_long_index, TYPE_MethodHandle, TYPE_MethodType, TYPE_null, TYPE_Object, TYPE_Object_index, TYPE_RuntimeException, TYPE_short, TYPE_short_index, TYPE_String, TYPE_Throwable, TYPE_unknown, TYPE_void, YES
Modifier | Constructor and Description |
---|---|
protected |
AbstractCFG(IMethod method) |
Modifier and Type | Method and Description |
---|---|
void |
addEdge(T src,
T dst) |
void |
addExceptionalEdge(T src,
T dst) |
void |
addNode(T n)
add a node to this graph
|
void |
addNormalEdge(T src,
T dst) |
boolean |
containsNode(T N) |
T |
entry()
Return the entry basic block for the CFG.
|
abstract boolean |
equals(Object o) |
T |
exit()
Return the exit basic block for the CFG.
|
BitVector |
getCatchBlocks()
Returns the catchBlocks.
|
Collection<T> |
getExceptionalPredecessors(T b)
The order of blocks returned should be arbitrary but deterministic.
|
List<T> |
getExceptionalSuccessors(T b)
The order of blocks returned must indicate the exception-handling scope.
|
FixedSizeBitVector |
getExceptionalToExit() |
int |
getMaxNumber() |
IMethod |
getMethod() |
T |
getNode(int number) |
Collection<T> |
getNormalPredecessors(T b)
The order of blocks returned should be arbitrary but deterministic.
|
Collection<T> |
getNormalSuccessors(T b)
The order of blocks returned should be arbitrary but deterministic.
|
FixedSizeBitVector |
getNormalToExit() |
int |
getNumber(T N) |
int |
getNumberOfExceptionalIn(T N) |
int |
getNumberOfExceptionalOut(int number) |
int |
getNumberOfExceptionalOut(T N) |
int |
getNumberOfNodes() |
int |
getNumberOfNormalIn(T N) |
int |
getNumberOfNormalOut(T N) |
int |
getPredNodeCount(T N)
Return the number of
immediate predecessor nodes of n |
IntSet |
getPredNodeNumbers(T node) |
Iterator<T> |
getPredNodes(T N)
Return an
Iterator over the immediate predecessor nodes of n
This method never returns null . |
int |
getSuccNodeCount(T N)
Return the number of
immediate successor nodes of this Node in the Graph |
IntSet |
getSuccNodeNumbers(T node) |
Iterator<T> |
getSuccNodes(T N)
Return an Iterator over the immediate successor nodes of n
|
boolean |
hasEdge(T src,
T dst) |
boolean |
hasExceptionalEdge(T src,
T dst) |
abstract int |
hashCode() |
boolean |
hasNormalEdge(T src,
T dst) |
protected void |
init()
subclasses must call this before calling addEdge, but after creating the nodes
|
boolean |
isCatchBlock(int i) |
Iterator<T> |
iterateNodes(IntSet s) |
Iterator<T> |
iterator() |
void |
removeAllIncidentEdges(T node) |
void |
removeEdge(T src,
T dst) |
void |
removeIncomingEdges(T node) |
void |
removeNode(T n)
remove a node from this graph
|
void |
removeNodeAndEdges(T N)
remove a node and all its incident edges
|
void |
removeOutgoingEdges(T node) |
protected void |
setCatchBlock(int i)
record that basic block i is a catch block
|
String |
toString() |
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
getBlockForInstruction, getInstructions, getProgramCounter
forEach, spliterator
protected AbstractCFG(IMethod method)
protected void init()
public T entry()
entry
in interface ControlFlowGraph<I,T extends IBasicBlock<I>>
public T exit()
exit
in interface ControlFlowGraph<I,T extends IBasicBlock<I>>
public int getPredNodeCount(T N)
EdgeManager
immediate predecessor
nodes of ngetPredNodeCount
in interface EdgeManager<T extends IBasicBlock<I>>
public int getNumberOfNormalIn(T N)
public int getNumberOfExceptionalIn(T N)
public int getNumberOfExceptionalOut(int number)
number
- number of a basic block in this cfgpublic int getNumberOfNormalOut(T N)
public int getNumberOfExceptionalOut(T N)
public Iterator<T> getPredNodes(T N)
EdgeManager
Iterator
over the immediate predecessor nodes of n
This method never returns null
.getPredNodes
in interface EdgeManager<T extends IBasicBlock<I>>
Iterator
over the immediate predecessor nodes of this Node.public int getSuccNodeCount(T N)
EdgeManager
immediate successor
nodes of this Node in the GraphgetSuccNodeCount
in interface EdgeManager<T extends IBasicBlock<I>>
public Iterator<T> getSuccNodes(T N)
EdgeManager
This method never returns null
.
getSuccNodes
in interface EdgeManager<T extends IBasicBlock<I>>
public void addNode(T n)
NodeManager
addNode
in interface NodeManager<T extends IBasicBlock<I>>
n
- public int getMaxNumber()
getMaxNumber
in interface NumberedNodeManager<T extends IBasicBlock<I>>
public T getNode(int number)
getNode
in interface NumberedNodeManager<T extends IBasicBlock<I>>
public int getNumber(T N)
getNumber
in interface NumberedNodeManager<T extends IBasicBlock<I>>
public int getNumberOfNodes()
getNumberOfNodes
in interface NodeManager<T extends IBasicBlock<I>>
public Iterator<T> iterator()
iterator
in interface NodeManager<T extends IBasicBlock<I>>
iterator
in interface Iterable<T extends IBasicBlock<I>>
Iterator
of the nodes in this graphpublic void addEdge(T src, T dst) throws UnimplementedError
addEdge
in interface EdgeManager<T extends IBasicBlock<I>>
UnimplementedError
public void removeEdge(T src, T dst) throws UnsupportedOperationException
removeEdge
in interface EdgeManager<T extends IBasicBlock<I>>
UnsupportedOperationException
public boolean hasEdge(T src, T dst)
hasEdge
in interface EdgeManager<T extends IBasicBlock<I>>
public void addNormalEdge(T src, T dst)
IllegalArgumentException
- if src or dst is nullpublic void addExceptionalEdge(T src, T dst)
IllegalArgumentException
- if dst is nullpublic void removeNodeAndEdges(T N) throws UnimplementedError
Graph
removeNodeAndEdges
in interface Graph<T extends IBasicBlock<I>>
UnimplementedError
public void removeNode(T n) throws UnimplementedError
NodeManager
removeNode
in interface NodeManager<T extends IBasicBlock<I>>
UnimplementedError
public boolean containsNode(T N)
containsNode
in interface NodeManager<T extends IBasicBlock<I>>
protected void setCatchBlock(int i)
public boolean isCatchBlock(int i)
public BitVector getCatchBlocks()
getCatchBlocks
in interface ControlFlowGraph<I,T extends IBasicBlock<I>>
public IMethod getMethod()
getMethod
in interface ControlFlowGraph<I,T extends IBasicBlock<I>>
public void removeAllIncidentEdges(T node) throws UnimplementedError
removeAllIncidentEdges
in interface EdgeManager<T extends IBasicBlock<I>>
UnimplementedError
public List<T> getExceptionalSuccessors(T b)
ControlFlowGraph
getExceptionalSuccessors
in interface ControlFlowGraph<I,T extends IBasicBlock<I>>
public Collection<T> getNormalSuccessors(T b)
ControlFlowGraph
getNormalSuccessors
in interface ControlFlowGraph<I,T extends IBasicBlock<I>>
public Iterator<T> iterateNodes(IntSet s)
iterateNodes
in interface NumberedNodeManager<T extends IBasicBlock<I>>
public void removeIncomingEdges(T node) throws UnimplementedError
removeIncomingEdges
in interface EdgeManager<T extends IBasicBlock<I>>
UnimplementedError
public void removeOutgoingEdges(T node) throws UnimplementedError
removeOutgoingEdges
in interface EdgeManager<T extends IBasicBlock<I>>
UnimplementedError
public FixedSizeBitVector getExceptionalToExit()
public FixedSizeBitVector getNormalToExit()
public Collection<T> getExceptionalPredecessors(T b)
ControlFlowGraph
getExceptionalPredecessors
in interface ControlFlowGraph<I,T extends IBasicBlock<I>>
public Collection<T> getNormalPredecessors(T b)
ControlFlowGraph
getNormalPredecessors
in interface ControlFlowGraph<I,T extends IBasicBlock<I>>
public IntSet getPredNodeNumbers(T node) throws UnimplementedError
getPredNodeNumbers
in interface NumberedEdgeManager<T extends IBasicBlock<I>>
UnimplementedError
public IntSet getSuccNodeNumbers(T node)
getSuccNodeNumbers
in interface NumberedEdgeManager<T extends IBasicBlock<I>>