Class Call
- java.lang.Object
-
- proguard.analysis.datastructure.callgraph.Call
-
- Direct Known Subclasses:
ConcreteCall
,SymbolicCall
public abstract class Call extends java.lang.Object
Represents a method call. If the call target is aMethod
that is present in the class pool, aConcreteCall
is instantiated. If the call target is not a known method, aSymbolicCall
is the appropriate subclass.
-
-
Field Summary
Fields Modifier and Type Field Description CodeLocation
caller
The location where the call was invoked.boolean
controlFlowDependent
If false, control flow in the calling method will always reach this call.Instruction
instruction
The instruction performing this call.boolean
runtimeTypeDependent
If true, this call might only be one of several alternative targets, depending on the actual type of the called object during runtime.int
throwsNullptr
Describes whether this call will throw aNullPointerException
at runtime.
-
Constructor Summary
Constructors Modifier Constructor Description protected
Call(CodeLocation caller, Value instance, java.util.List<Value> arguments, Value returnValue, int throwsNullptr, Instruction instruction, boolean controlFlowDependent, boolean runtimeTypeDependent)
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description void
clearValues()
Clear allValue
object references from this call.boolean
equals(java.lang.Object o)
Value
getArgument(int index)
Get the value for a specific argument index.int
getArgumentCount()
Returns the number of arguments.Value
getInstance()
If this is a virtual call, this describes thethis
pointer of the object whose method is called, usually anIdentifiedReferenceValue
.int
getJvmArgumentSize()
Returns the number of elements that need to be popped from the JVM stack for this call.Value
getReturnValue()
Get the return value of this call.abstract MethodSignature
getTarget()
TheMethodSignature
of the method that is being called.int
hashCode()
abstract boolean
hasIncompleteTarget()
Check if this call's target is fully known or only parts of it (e.g.boolean
isCertainlyCalled()
Returns true if this call is always executed, no matter which branch in the methods are taken and which type the called object has during runtime.boolean
isStatic()
Check if this call is static (no implicitinstance
set) or not.void
setArguments(java.util.List<Value> arguments)
void
setInstance(Value instance)
void
setReturnValue(Value returnValue)
void
targetMethodAccept(MemberVisitor memberVisitor)
java.lang.String
toSimpleString()
Prints a shorter version of the regular `toString()` without the caller or null pointer information.java.lang.String
toString()
-
-
-
Field Detail
-
caller
public final CodeLocation caller
The location where the call was invoked.
-
throwsNullptr
public final int throwsNullptr
Describes whether this call will throw aNullPointerException
at runtime. EitherValue.NEVER
,Value.MAYBE
orValue.ALWAYS
.
-
instruction
public final Instruction instruction
The instruction performing this call. There are several different ways of invoking a method call in the JVM:Instruction.OP_INVOKESTATIC
Instruction.OP_INVOKEVIRTUAL
Instruction.OP_INVOKEINTERFACE
Instruction.OP_INVOKESPECIAL
Instruction.OP_INVOKEDYNAMIC
CallResolver
for more details.
-
controlFlowDependent
public final boolean controlFlowDependent
If false, control flow in the calling method will always reach this call. Otherwise, whether the call will be invoked at runtime might depend on e.g. specific branches being taken.
-
runtimeTypeDependent
public final boolean runtimeTypeDependent
If true, this call might only be one of several alternative targets, depending on the actual type of the called object during runtime. Otherwise, this call is the only possible target.
-
-
Constructor Detail
-
Call
protected Call(CodeLocation caller, Value instance, java.util.List<Value> arguments, Value returnValue, int throwsNullptr, Instruction instruction, boolean controlFlowDependent, boolean runtimeTypeDependent)
-
-
Method Detail
-
isStatic
public boolean isStatic()
Check if this call is static (no implicitinstance
set) or not.
-
getTarget
public abstract MethodSignature getTarget()
TheMethodSignature
of the method that is being called.
-
hasIncompleteTarget
public abstract boolean hasIncompleteTarget()
Check if this call's target is fully known or only parts of it (e.g. only the descriptor).
-
getArgumentCount
public int getArgumentCount()
Returns the number of arguments.
-
getJvmArgumentSize
public int getJvmArgumentSize()
Returns the number of elements that need to be popped from the JVM stack for this call.
-
getArgument
public Value getArgument(int index)
Get the value for a specific argument index.Note: This is only to be used in implementations of
CallHandler.handleCall(Call, TracedStack, TracedVariables)
. Afterwards, the values will have been cleared to reduce unnecessary memory usage, as argument values are not needed for the full call graph reconstruction.
-
setArguments
public void setArguments(java.util.List<Value> arguments)
-
getInstance
public Value getInstance()
If this is a virtual call, this describes thethis
pointer of the object whose method is called, usually anIdentifiedReferenceValue
. For static calls this is null.Note: This is only to be used in implementations of
CallHandler.handleCall(Call, TracedStack, TracedVariables)
. Afterwards, the value will have been cleared to reduce unnecessary memory usage, as the instance value is not needed for the full call graph reconstruction.
-
setInstance
public void setInstance(Value instance)
-
getReturnValue
public Value getReturnValue()
Get the return value of this call.Note: This is only to be used in implementations of
CallHandler.handleCall(Call, TracedStack, TracedVariables)
. Afterwards, the value will have been cleared to reduce unnecessary memory usage, as the return value is not needed for the full call graph reconstruction.
-
setReturnValue
public void setReturnValue(Value returnValue)
-
clearValues
public void clearValues()
Clear allValue
object references from this call.
-
isCertainlyCalled
public boolean isCertainlyCalled()
Returns true if this call is always executed, no matter which branch in the methods are taken and which type the called object has during runtime.
-
toString
public java.lang.String toString()
- Overrides:
toString
in classjava.lang.Object
-
toSimpleString
public java.lang.String toSimpleString()
Prints a shorter version of the regular `toString()` without the caller or null pointer information.
-
targetMethodAccept
public void targetMethodAccept(MemberVisitor memberVisitor)
-
equals
public boolean equals(java.lang.Object o)
- Overrides:
equals
in classjava.lang.Object
-
hashCode
public int hashCode()
- Overrides:
hashCode
in classjava.lang.Object
-
-