Class Subroutines.SubroutineImpl
- java.lang.Object
-
- org.apache.bcel.verifier.structurals.Subroutines.SubroutineImpl
-
- All Implemented Interfaces:
Subroutine
- Enclosing class:
- Subroutines
private final class Subroutines.SubroutineImpl extends java.lang.Object implements Subroutine
This inner class implements the Subroutine interface.
-
-
Field Summary
Fields Modifier and Type Field Description private Subroutines.SubroutineImpl[]
EMPTY_ARRAY
private java.util.Set<InstructionHandle>
instructions
The instructions that belong to this subroutine.private int
localVariable
The Local Variable slot where the first instruction of this subroutine (an ASTORE) stores the JsrInstruction's ReturnAddress in and the RET of this subroutine operates on.private java.util.Set<InstructionHandle>
theJSRs
The JSR or JSR_W instructions that define this subroutine by targeting it.private InstructionHandle
theRET
The RET instruction that leaves this subroutine.private static int
UNSET
UNSET, a symbol for an uninitialized localVariable field.
-
Constructor Summary
Constructors Constructor Description SubroutineImpl()
The default constructor.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
addEnteringJsrInstruction(InstructionHandle jsrInst)
Adds a new JSR or JSR_W that has this subroutine as its target.(package private) void
addInstruction(InstructionHandle ih)
boolean
contains(InstructionHandle inst)
Returns if the given InstructionHandle refers to an instruction that is part of this subroutine.int[]
getAccessedLocalsIndices()
Returns an int[] containing the indices of the local variable slots accessed by this Subroutine (read-accessed, write-accessed or both); local variables referenced by subroutines of this subroutine are not included.InstructionHandle[]
getEnteringJsrInstructions()
Returns all the JsrInstructions that have the first instruction of this subroutine as their target.InstructionHandle[]
getInstructions()
Returns all instructions that together form this subroutine.InstructionHandle
getLeavingRET()
Returns the one and only RET that leaves the subroutine.int[]
getRecursivelyAccessedLocalsIndices()
Returns an int[] containing the indices of the local variable slots accessed by this Subroutine (read-accessed, write-accessed or both); local variables referenced by subroutines of this subroutine are included.private void
getRecursivelyAccessedLocalsIndicesHelper(java.util.Set<java.lang.Integer> set, Subroutine[] subs)
A recursive helper method for getRecursivelyAccessedLocalsIndices().(package private) void
setLeavingRET()
Sets the leaving RET instruction.(package private) void
setLocalVariable(int i)
Subroutine[]
subSubs()
Returns the subroutines that are directly called from this subroutine.java.lang.String
toString()
Returns a String representation of this object, merely for debugging purposes.
-
-
-
Field Detail
-
UNSET
private static final int UNSET
UNSET, a symbol for an uninitialized localVariable field. This is used for the "top-level" Subroutine; i.e. no subroutine.- See Also:
- Constant Field Values
-
EMPTY_ARRAY
private final Subroutines.SubroutineImpl[] EMPTY_ARRAY
-
localVariable
private int localVariable
The Local Variable slot where the first instruction of this subroutine (an ASTORE) stores the JsrInstruction's ReturnAddress in and the RET of this subroutine operates on.
-
instructions
private final java.util.Set<InstructionHandle> instructions
The instructions that belong to this subroutine.
-
theJSRs
private final java.util.Set<InstructionHandle> theJSRs
The JSR or JSR_W instructions that define this subroutine by targeting it.
-
theRET
private InstructionHandle theRET
The RET instruction that leaves this subroutine.
-
-
Method Detail
-
addEnteringJsrInstruction
public void addEnteringJsrInstruction(InstructionHandle jsrInst)
Adds a new JSR or JSR_W that has this subroutine as its target.
-
addInstruction
void addInstruction(InstructionHandle ih)
-
contains
public boolean contains(InstructionHandle inst)
Description copied from interface:Subroutine
Returns if the given InstructionHandle refers to an instruction that is part of this subroutine. This is a convenience method that saves iteration over the InstructionHandle objects returned by getInstructions().- Specified by:
contains
in interfaceSubroutine
- Parameters:
inst
- The InstructionHandle to test.- Returns:
- Whether the given InstructionHandle refers to an instruction that is part of this subroutine.
- See Also:
Subroutine.getInstructions()
-
getAccessedLocalsIndices
public int[] getAccessedLocalsIndices()
Description copied from interface:Subroutine
Returns an int[] containing the indices of the local variable slots accessed by this Subroutine (read-accessed, write-accessed or both); local variables referenced by subroutines of this subroutine are not included.- Specified by:
getAccessedLocalsIndices
in interfaceSubroutine
- Returns:
- An int[] containing the indices of the local variable slots.
- See Also:
Subroutine.getRecursivelyAccessedLocalsIndices()
-
getEnteringJsrInstructions
public InstructionHandle[] getEnteringJsrInstructions()
Description copied from interface:Subroutine
Returns all the JsrInstructions that have the first instruction of this subroutine as their target. Must not be invoked on the 'top-level subroutine'.- Specified by:
getEnteringJsrInstructions
in interfaceSubroutine
- Returns:
- The JsrInstructions that have the first instruction of this subroutine as their target.
-
getInstructions
public InstructionHandle[] getInstructions()
Description copied from interface:Subroutine
Returns all instructions that together form this subroutine. Note that an instruction is part of exactly one subroutine (the top-level code is considered to be a special subroutine) - else it is not reachable at all (dead code).- Specified by:
getInstructions
in interfaceSubroutine
- Returns:
- All instructions that together form this subroutine.
-
getLeavingRET
public InstructionHandle getLeavingRET()
Description copied from interface:Subroutine
Returns the one and only RET that leaves the subroutine. Note that JustIce has a pretty rigid notion of a subroutine. Must not be invoked on the 'top-level subroutine'.- Specified by:
getLeavingRET
in interfaceSubroutine
- Returns:
- The one and only RET that leaves the subroutine.
- See Also:
Subroutines
-
getRecursivelyAccessedLocalsIndices
public int[] getRecursivelyAccessedLocalsIndices()
Description copied from interface:Subroutine
Returns an int[] containing the indices of the local variable slots accessed by this Subroutine (read-accessed, write-accessed or both); local variables referenced by subroutines of this subroutine are included.- Specified by:
getRecursivelyAccessedLocalsIndices
in interfaceSubroutine
- Returns:
- An int[] containing the indices of the local variable slots.
- See Also:
Subroutine.getAccessedLocalsIndices()
-
getRecursivelyAccessedLocalsIndicesHelper
private void getRecursivelyAccessedLocalsIndicesHelper(java.util.Set<java.lang.Integer> set, Subroutine[] subs)
A recursive helper method for getRecursivelyAccessedLocalsIndices().- See Also:
getRecursivelyAccessedLocalsIndices()
-
setLeavingRET
void setLeavingRET()
Sets the leaving RET instruction. Must be invoked after all instructions are added. Must not be invoked for top-level 'subroutine'.
-
setLocalVariable
void setLocalVariable(int i)
-
subSubs
public Subroutine[] subSubs()
Description copied from interface:Subroutine
Returns the subroutines that are directly called from this subroutine.- Specified by:
subSubs
in interfaceSubroutine
- Returns:
- The subroutines that are directly called from this subroutine.
-
toString
public java.lang.String toString()
Returns a String representation of this object, merely for debugging purposes. (Internal) Warning: Verbosity on a problematic subroutine may cause stack overflow errors due to recursive subSubs() calls. Don't use this, then.- Overrides:
toString
in classjava.lang.Object
-
-