com.pnfsoftware.jeb.core.units.code.android.ir.IDMethodContext |
dexdec
IR method context. A method context holds all intermediate (IR) information
relative to the decompilation of a dex method, including factory methods to create IR
instructions and IR expressions.
Public Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
abstract IDMethodContext |
copy()
Create a copy of this context.
| ||||||||||
abstract IDArrayElt |
createArrayElt(IDExpression array, IDExpression index, IJavaType type)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDInstanceField |
createArrayLength(IDExpression instance)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDInstruction |
createAssign(IDExpression dst, IDExpression src)
Create an
assignment instruction. | ||||||||||
abstract IDImm |
createBoolean(boolean value)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDImm |
createByte(byte value)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDNewArrayInfo |
createByteArray(byte[] bytes)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDCallInfo |
createCallInfo(DInvokeType invoketype, int methodindex, List<IDExpression> arguments)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDCallInfo |
createCallInfo(IDIndex methodindex, IDExpression[] arguments, IJavaType returntype, String methodsig, DInvokeType invoketype)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDCallInfo |
createCallInfo(IDIndex methodindex, List<IDExpression> arguments, IJavaType returntype, String methodsig, DInvokeType invoketype)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDOperation |
createCast(IJavaType casttype, IDExpression e)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDImm |
createChar(char value)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDStaticField |
createClassObject(String csig)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDOperation |
createConditional(IJavaType type, IDPredicate pred, IDExpression expTrue, IDExpression expFalse)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDInstruction |
createConstruct(IDNewInfo info)
Create a
new Object(...) instruction. | ||||||||||
abstract IDVar |
createCopyVar(IDVar srcVar)
Create a copy-variable.
| ||||||||||
abstract IDImm |
createDouble(double value)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDImm |
createFloat(float value)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDImm |
createImm(long rawvalue, IJavaType type)
This convenience IR factory method wraps around
createImm(long, IJavaType) . | ||||||||||
abstract IDIndex |
createIndex(int value)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDInstanceField |
createInstanceField(IDExpression instance, IDIndex index, IJavaType fieldtype, String fieldname)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDImm |
createInt(int value)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDInstruction |
createInvoke(IDCallInfo info)
Create an
invocation instruction. | ||||||||||
abstract IDInstruction |
createJcond(int irTargetOffset, IDPredicate cond)
Create a
jcond (conditional jump) instruction. | ||||||||||
abstract IDInstruction |
createJump(int irTargetOffset)
Create a
goto (unconditional jump) instruction. | ||||||||||
abstract IDImm |
createLong(long value)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDInstruction |
createMonitorEnter(IDExpression exp)
Create a
monitor-enter instruction. | ||||||||||
abstract IDInstruction |
createMonitorExit(IDExpression exp)
Create a
monitor-exit instruction. | ||||||||||
abstract IDInstruction |
createNewArray(IDNewArrayInfo info)
Create a
new array instruction. | ||||||||||
abstract IDNewArrayInfo |
createNewArrayInfo(IJavaType type, IDExpression size, List<IDExpression> initvals)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDNewInfo |
createNewInfo(IJavaType objecttype, IJavaType constclasstype, IDIndex constructorindex, List<IDExpression> arguments, String methodsig)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDNewInfo |
createNewInfo(String constructorSig, IDExpression... arguments)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDNewInfo |
createNewInfo(IJavaType objecttype, IJavaType constclasstype, IDIndex constructorindex, IDExpression[] arguments, String methodsig)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDInstruction |
createNop()
Create a
no-operation instruction. | ||||||||||
abstract IDImm |
createNull()
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDOperation |
createOperation(IJavaType type, JavaOperatorType optype, IDExpression opnd1, IDExpression opnd2)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDOperation |
createOperation(IJavaType type, IDExpression left, IJavaOperator operator, IDExpression right)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDPredicate |
createPredicate(JavaOperatorType optype, IDExpression opnd1, IDExpression opnd2)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDPredicate |
createPredicate(IDExpression left, IJavaOperator operator, IDExpression right)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDPredicate |
createPredicate(IDExpression e)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDReferenceType |
createReferenceType(String csig)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDReferenceType |
createReferenceType(IDIndex cindex, IJavaType ctype)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDVar |
createRegisterVar(int regnum, IJavaType type)
Create a variable mapping to a physical Dalvik register (or pair of registers).
| ||||||||||
abstract IDInstruction |
createReturn(IDExpression exp)
Create a
return instruction. | ||||||||||
abstract IDImm |
createShort(short value)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDStaticField |
createStaticField(IDIndex index, IJavaType fieldtype, String csig, String fieldname)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDInstruction |
createStoreException(IDVar ident)
Create an
exception-store instruction. | ||||||||||
abstract IDImm |
createString(IDIndex stringIndex)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDImm |
createString(String value)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDInstruction |
createSwitch(IDExpression swexp, IDSwitchData data)
Create a
switch instruction. | ||||||||||
abstract IDSwitchData | createSwitchData() | ||||||||||
abstract IDTarget |
createTarget(int offset)
Convenience IR factory method wrapping around
getGlobalContext() . | ||||||||||
abstract IDInstruction |
createThrow(IDExpression exp)
Create a
throw instruction. | ||||||||||
abstract IDVar |
createVar(int id, IJavaType type)
Create or retrieve a variable.
| ||||||||||
abstract IDVar |
createVar(int id, IJavaType type, boolean performTypeCheckIfExists)
Create or retrieve a variable.
| ||||||||||
abstract IDVar |
createVar(int id)
Create or retrieve a variable.
| ||||||||||
abstract IDVar |
createVirtualVar(IJavaType type)
Create a virtual variable.
| ||||||||||
abstract CFG<IDInstruction> |
getCfg()
Get the current IR (intermediate representation) CFG of the decompiled method.
| ||||||||||
abstract Object |
getData(String key)
Retrieve an arbitrary object in this context.
| ||||||||||
abstract Set<String> |
getDataKeys()
Retrieve the set of objects keys for data elements stored using
setData . | ||||||||||
abstract int |
getDecompilationFlags()
Retrieve the decompilation flags provided by the engine to decompile this method.
| ||||||||||
abstract IDexUnit |
getDex()
Retrieve the underlying dex unit.
| ||||||||||
abstract IDTryData |
getExceptionData()
Retrieve the exception information for the current IR, if the
exception information were parsed when the Dalvik method was converted to IR. | ||||||||||
abstract IDGlobalContext |
getGlobalContext()
Retrieve the global IR context, shared by all IR method contexts.
| ||||||||||
abstract IDexMethod |
getMethod()
Retrieve a reference to the dex method being decompiled.
| ||||||||||
abstract String |
getMethodSignature()
Retrieve the original signature of the method being decompiled.
| ||||||||||
abstract IJavaOperatorFactory |
getOperatorFactory()
Retrieve the global high-level operator factory.
| ||||||||||
abstract List<IDVar> |
getParameterVariables()
Retrieve the list of variables that hold the method parameters.
| ||||||||||
abstract SortedMap<Integer, IJavaType> |
getParametersTypeMap()
Retrieve the type map for the decompiled method.
| ||||||||||
abstract IJavaTypeFactory |
getTypeFactory()
Retrieve the global high-level type factory.
| ||||||||||
abstract IDTypeInfoProvider |
getTypeInfoProvider()
Retrieve the type information provider.
| ||||||||||
abstract IDVar | getVar(int id) | ||||||||||
abstract IDVar |
getVar(String name)
Retrieve a
variable by name. | ||||||||||
abstract SortedMap<Integer, IDVar> |
getVariableMap()
Retrieve a read-only map of all variables created by this context.
| ||||||||||
abstract Watchdog |
getWatchdog()
Retrieve the optional decompilation watchdog.
| ||||||||||
abstract boolean |
isBatchDecompilation()
Convenience method checking for
FLAG_BATCH_DECOMPILATION . | ||||||||||
abstract boolean |
isParseDebugInfo()
Determine whether debug information (in particular, variable names) will be ported over
variables created during the conversion to Intermediate Representation. | ||||||||||
abstract boolean |
isParseExceptions()
Determine whether exception information will be parsed and integrated within the initial
Intermediate Representation, when the Dalvik code is converted to IR.
| ||||||||||
abstract boolean |
isSSA()
Determine whether the CFG was
converted to an SSA form . | ||||||||||
abstract void |
load(IDMethodContext sourceContext)
Load the constituents of a source context into this context.
| ||||||||||
abstract void |
makeSSA()
Convert this CFG to SSA (static single assignment) form.
| ||||||||||
abstract void |
propagateTypes()
Perform type determination and propagation on the CFG.
| ||||||||||
abstract void |
replace(CFG<IDInstruction> replCfg, IDTryData replExdata)
Replace the current IR by a new CFG and exception information.
| ||||||||||
abstract void |
replaceCFG(CFG<IDInstruction> cfg2, Map<Integer, Integer> oldToNewOffsets)
Replace the current IR by a new CFG and exception information.
| ||||||||||
abstract int |
retrievePhysicalRegisterId(int varid)
Retrieve the underlying register used by a variable.
| ||||||||||
abstract int |
retrievePrimaryVariableId(int varid)
Retrieve the primary variable id from a variable.
| ||||||||||
abstract Object |
setData(String key, Object value)
Store an arbitrary object in this context.
| ||||||||||
abstract void |
verify()
Self-verification.
|
[Expand]
Inherited Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
![]() |
Create a copy of this context. This method is useful when optimizers need to operate and
modify in depth a context and its elements (e.g. the CFG or exception-flow data), while the
optimizer's success is not guaranteed. On failure, the copied context may be destroyed. On
success, the context may be updated using the copied context, by using
load(IDMethodContext)
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Create an assignment
instruction. Opcode: IR_ASSIGN
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Create a new Object(...)
instruction. Opcode: IR_INVOKE
.
Create a copy-variable. If the source variable has a preferred name
, it is copied to the newly-created variable.
srcVar | a primary variable, whose id is in [0, 0xFFFF] or [0x10000, 0x1FFFE] |
---|
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
This convenience IR factory method wraps around
createImm(long, IJavaType)
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Create an invocation
instruction. Opcode: IR_INVOKE
.
Create a jcond
(conditional jump) instruction. Opcode: IR_JCOND
.
Create a goto
(unconditional jump) instruction. Opcode: IR_JUMP
.
Convenience IR factory method wrapping around getGlobalContext()
.
Create a monitor-enter
instruction. Opcode: IR_MONITOR_ENTER
.
Create a monitor-exit
instruction. Opcode: IR_MONITOR_EXIT
.
Create a new array
instruction. Opcode: IR_INVOKE
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Create a variable mapping to a physical Dalvik register (or pair of registers). This method is used during the initial decompilation phase when the bytecode is converted to low-level IR.
regnum | dalvik register number (first register in the case of a pair) |
---|---|
type | variable type |
Create a return
instruction. Opcode: IR_RETURN
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Create an exception-store
instruction. Opcode:
IR_STORE_EXCEPTION
.
Convenience IR factory method wrapping around getGlobalContext()
.
Convenience IR factory method wrapping around getGlobalContext()
.
Create a switch
instruction. Opcode: IR_SWITCH
.
Convenience IR factory method wrapping around getGlobalContext()
.
Create a throw
instruction. Opcode: IR_THROW
.
Create or retrieve a variable. Caution: if the variable with the provided id already exists, it will be returned by this method without performing type check: the requested type at creation may not be the type of the returned (already existing) variable.
id | variable id (not to be confused with Dalvik register number) |
---|---|
type | mandatory type |
Create or retrieve a variable.
id | variable id (not to be confused with Dalvik register number) |
---|---|
type | mandatory type |
performTypeCheckIfExists | if false: if the variable with the provided id already exists, it will be returned by this method without performing type check: the requested type may not be the type of the returned (already existing) variable; if true: this method will throw an IllegalArgumentException if an already existing variable does not have the requested type |
Create or retrieve a variable.
id | variable id (not to be confused with Dalvik register number) |
---|
Create a virtual variable. A virtual variable does not map back to physical registers.
type | variable type |
---|
Get the current IR (intermediate representation) CFG of the decompiled method. As the method advances in the decompilation pipeline, the IR gets refined. When it is fully refined, the final IR is converted to a Java AST.
Retrieve an arbitrary object in this context.
Retrieve the set of objects keys for data elements stored using
setData
.
Retrieve the decompilation flags provided by the engine to decompile this method. Refer to
IDecompilerUnit#FLAG_xxx
constants.
Retrieve the exception information for the current IR, if the exception information
were parsed when the Dalvik method was converted to IR.
isParseExceptions()
was false when this object as built
Retrieve the global IR context, shared by all IR method contexts. The global context (also referred to as 'intermediate context') is managed by the decompiler.
Retrieve the original signature of the method being decompiled.
Retrieve the global high-level operator factory. The type factory can be used to create all operators, including conditionals, string concatenation, and create cast operators.
Retrieve the list of variables that hold the method parameters. If the method is non-static,
the first entry represents this
.
Retrieve the type map for the decompiled method. The map keys are Dalvik input slot indices.
The special index -1 indicates the return value type, if the method returns a value. The
first entry is this
, if the method is non-static. Although types long
and
double
use two slots, only the first slot number is returned. Other primitives and
reference type objects use a single slot.
- Example: virtual method f() of class A using 10 registers:
int f(char, double, String)
=> map=
(-1:int, 5:ref_A, 6:char, 7:double, 9:String)
- Example: static method g() of class B using 20 registers:
void g(long, long, Object, boolean) => map=
(14:long, 16:long, 18:Object, 19:boolean)
Retrieve the type information provider. This provider can access additional, user-provided libraries (jar, dex) to retrieve information on types referenced but not defined in the underlying dex unit.
Retrieve a variable
by name. This method may return null.
name | a variable name (standard name, or custom name) |
---|
Retrieve a read-only map of all variables created by this context.
Retrieve the optional decompilation watchdog. The watchdog embeds timing information and can be queried by decompilation components: a component can request a self-verification, which will result in an exception being thrown (and decompilation aborted) if the timeout is exceeded.
Convenience method checking for FLAG_BATCH_DECOMPILATION
.
Determine whether debug information (in particular, variable names) will be ported over
variables
created during the conversion to Intermediate Representation.
Determine whether exception information will be parsed and integrated within the initial Intermediate Representation, when the Dalvik code is converted to IR.
Determine whether the CFG was converted to an SSA form
.
Load the constituents of a source context into this context. This method is to be used in
conjunction with copy()
.
sourceContext | a source context |
---|
Convert this CFG to SSA (static single assignment) form. An SSA form should be generated before attempting to apply types. This method is reserved for internal use.
Perform type determination and propagation on the CFG. The CFG should be in SSA form before doing so. This method is reserved for internal use.
Replace the current IR by a new CFG and exception information.
This method should be seldom called; most times, modifying the CFG itself is sufficient. However, in some cases, a full replacement may be necessary.
replCfg | new CFG |
---|---|
replExdata | new exception data (may be null) |
Replace the current IR by a new CFG and exception information. It is recommended to use
replace(CFG, IDTryData)
instead.
This method should be seldom called; most times, modifying the CFG itself is sufficient. However, in some cases, a full replacement may be necessary.
cfg2 | new CFG |
---|---|
oldToNewOffsets | mandatory map map specifying a correspondence "old IR offset to new IR offset" for each instruction of the CFG (this map is currently used to update various internal structures as well as IR exception information) |
Retrieve the underlying register used by a variable. If the variable uses a long type, the first register of the pair is returned. If the variable is virtual, -1 is returned.
varid | a variable id |
---|
Retrieve the primary variable id from a variable. If the variable directly maps a register or pair of registers, or is virtual, its id is simply returned. If the variable is a copy of another variable, the id of the copied variable is provided.
varid | a variable id |
---|
Store an arbitrary object in this context.
key | non-null key |
---|---|
value | null means remove the entry |
Self-verification. This method performs several consistency checks on the IR. On failure, the method will throw and an attempt will be made to dump the current IR CFG to a file named "failed.dot".
IllegalStateException | thrown on verification failure |
---|