Interface IDInstruction
- All Superinterfaces:
IDElement,IDExpression,IInstruction,IInstructionOperand,ILocatedInstruction
dexdec IR instruction object. Each intermediate representation instruction has:- an opcode: refer to
DOpcodeType- zero, one, or two operands, of type
IDElement- an offset (in the IR)
- a size
IR CFGs consist of basic blocks made of IR instructions. An IDMethodContext references it
IR CFG. IR instructions can also be created via the createXxx methods of the context
object.
When creating IR instructions, the default size is set to 1. The offset is not set (-1), and needs to be set manually. The size of an IR instruction can be set to any strictly positive value. In a CFG, it is important that all instructions be contiguous (i.e. there is no gap): if an instruction has offset O and size S, the next instruction must be at offset O+S.
-
Field Summary
FieldsFields inherited from interface com.pnfsoftware.jeb.core.units.code.android.ir.IDElement
DEFAULT_COMPARE_WITH_FULL_EQUALITY -
Method Summary
Modifier and TypeMethodDescriptionvoidadjustSize(int delta) Adjust this instruction's IR size.copy(DCopyOptions opt) Copy this element.voidcopyBaseFields(IDInstruction sourceInsn) Copy all base fields, that is all fields but the opcode and operands of the source instruction to this instruction.intcountUsedVariable(IDVar var) Count the number of times the provided variable is used (read) by this instruction.Deep copy of this instruction.duplicateForReplacement(IDInstruction replacedInsn) Duplicate this instruction with the intent to replace the source instruction.duplicateWithOffsetAndSize(long offset, int size) Duplicate this instruction with an explicit offset and size.Convenience method: evaluate the IR instruction using the provided set a variable values.Get the assignment destination.Get the assignment source.intGet the target offset for unconditional and conditional jumps.Retrieve the IR method context to which this instruction belongs.Get the identifier defined (written) by this method, if there is one.Retrieve invocation information.Get the condition predicate (if the instruction is a JCOND).longIR offsets are 32-bit integers; they can be safely cast to int.longRetrieve the end offset (exclusive) of this instructionGet this instruction opcode.Get the first operand.Get the second operand.Get the return expression.Retrieve the stored exception variable.Get switch data.Get the switch expression.Get the thrown expression.Get the variables used (read) by this instruction.booleanhasUseSideEffects(boolean includeCanThrow) Determine whether the used components of the statement may have side-effects.booleanisAssign()Determine whether this instruction is an assignment.default booleanDetermine whether this instruction assigns from a variable.default booleanisAssignFromVar(int wantedVarId) Determine whether this instruction assigns from a specific variable.default booleanDetermine whether this instruction assigns from a variable to another variable.default booleanisAssignFromVarToVar(int wantedSrcVarId, int wantedDstVarId) Determine whether this instruction assigns from a specific variable to another.default booleanDetermine whether this instruction assigns to a variable.default booleanisAssignToVar(int wantedVarId) Determine whether this instruction assigns to a specific variable.booleanisInvoke()Determine whether this instruction is an invocation.booleanisJcond()Determine whether this instruction is a conditional jump.booleanDetermine whether this instruction is a conditional jump or switch.booleanisJcondTo(int wantedTarget) Determine whether this instruction is a conditional jump to a specific target.booleanisJump()Determine whether this instruction is an unconditional jump.booleanDetermine whether this instruction is an unconditional or conditional jump.booleanisJumpOrJcondTo(int wantedTarget) Determine whether this instruction is an unconditional or conditional jump to a target.booleanisJumpTo(int wantedTarget) Determine whether this instruction is a jump to a specific target.booleanDetermine whether this instruction enters a monitor.booleanDetermine whether this instruction exits a monitor.booleanisNop()Determine whether this instruction is a no-op.booleanisOpcode(DOpcodeType... candidateOpcodes) Determine if this instruction's opcode is any of the provided candidates.booleanisReturn()Determine whether this instruction is a return.booleanDetermine whether this instruction is a return or throw.booleanDetermine whether this instruction stores an exception object.booleanisSwitch()Determine whether this instruction is a switch.booleanDetermine whether this instruction is a switch on integers.booleanDetermine whether this instruction is a switch on strings.booleanisThrow()Determine whether this instruction is a throw.voidmorph(DOpcodeType opcode, IDElement opnd1, IDElement opnd2) This dangerous method allows changing an IR instruction into a different one, while keeping metadata (e.g.intreplaceDefinedVariable(IDVar var, IDExpression repl) Replace the variable defined by this statement (if there is any).intreplaceUsedVariable(IDVar var, IDExpression repl) Deep replace all matching used variables of this instruction.voidReverse the conditional jump predicate.Set the assignment destination.Set the assignment source.intsetBranchTarget(int offset) Update the branch target for unconditional and conditional jumps only.Update the instruction context.Set the condition predicate for a conditional jump.voidsetOffset(long offset) Set this instruction's IR offset.voidsetOpcode(DOpcodeType opcode) Change the instruction opcode.voidsetOperand1(IDElement opnd) Change the instruction first operand.voidsetOperand2(IDElement opnd) Change the instruction second operand.Set the return expression.voidsetSize(int size) Set this instruction's IR size.Set the stored exception variable.setSwitchData(IDSwitchData swdata) Set switch data.Set the switch expression.Set the thrown expression.voidTransform a conditional jump instruction to a conditional-predicate assignment.voidTransform a conditional jump instruction to a jump.booleanTransform a single-case switch into a conditional jump.voidtransformToJump(int offset) Transform any instruction to a jump, and update the jump target.voidtransformToJump(IDTarget target) Transform any instruction to a jump, and update the jump target.voidTransform any instruction to a NOP.intupdateTargets(Map<Integer, Integer> oldToNewOffsets) Update the targets of a branching instruction.intupdateTargets(Map<Integer, Integer> oldToNewOffsets, boolean failOnMissedEntry) Update the targets of a branching instruction.voidverify()Verify this instruction.booleanvisitInstruction(IDVisitor visitor) Visit this instruction and its constituents.booleanvisitInstruction(IDVisitor visitor, boolean skipAssignmentDestination) Visit this instruction and its constituents.booleanvisitInstructionPostOrder(IDVisitor visitor, boolean skipAssignmentDestination) Visit this instruction and its constituents.booleanvisitInstructionPreOrder(IDVisitor visitor, boolean skipAssignmentDestination) Visit this instruction and its constituents.withOffset(long offset) Update the instruction offset.withSize(int size) Update the instruction size.Methods inherited from interface com.pnfsoftware.jeb.core.units.code.android.ir.IDElement
equalsEx, format, toString, toStringMethods inherited from interface com.pnfsoftware.jeb.core.units.code.android.ir.IDExpression
asArrayElt, asCallInfo, asImm, asInstanceField, asInstruction, asNewArrayInfo, asNewInfo, asOperation, asReferenceType, asStaticField, asVar, canThrow, checkType, collectAllPhysicalMethodIndices, collectAllPhysicalOffsets, collectSubExpressions, collectVarIds, countVariable, evaluate, evaluate, evaluate, find, findByType, findByType, findParent, findParent, generateAST, getCustomCanThrow, getData, getOrigin, getPhysicalMethodIndex, getPhysicalOffset, getSubExpressions, getType, getVarIds, hasSideEffects, isArrayElt, isCallInfo, isCallInfo, isCastOperation, isCastOperation, isConstantImm, isConstantImm, isImm, isInstanceField, isInstruction, isNewArrayInfo, isNewInfo, isOperation, isOperation, isOperation, isOperation, isOperation, isOperation, isOperation, isReferenceType, isStaticField, isStringImm, isVar, isVar, removeData, replaceSubExpression, replaceVariable, setCustomCanThrow, setData, setOrigin, setPhysicalMethodIndex, setPhysicalOffset, setType, setType, setType, spawn, transferMetadataFrom, updateAllPhysicalMethodIndices, updateAllPhysicalOffsets, updateTypes, visitDepthPost, visitDepthPost, visitDepthPost, visitDepthPre, visitDepthPre, visitDepthPreMethods inherited from interface com.pnfsoftware.jeb.core.units.code.IInstruction
canThrow, collectIndirectCallReferences, format, getACS, getBreakingFlow, getCode, getCountOfOperands, getDefUse, getDefUse, getDefUseInfo, getInstructionFlags, getMnemonic, getOperand, getOperands, getPrefix, getPrimaryBranchAddress, getProcessorMode, getRoutineCall, getSizeMethods inherited from interface com.pnfsoftware.jeb.core.units.code.IInstructionOperand
formatMethods inherited from interface com.pnfsoftware.jeb.core.units.code.ILocatedInstruction
collectIndirectCallReferences, getBreakingFlow, getPrimaryBranchAddress, getRoutineCall
-
Field Details
-
Method Details
-
duplicate
IDInstruction duplicate()Deep copy of this instruction.- Specified by:
duplicatein interfaceIDElement- Specified by:
duplicatein interfaceIDExpression- Returns:
- a deep copy of this element; the type of the duplicated element should be the same as this element's type
-
copy
Description copied from interface:IDElementCopy this element. This operation can be seen as a custom duplication; the resulting element may not be of the same type as this element.- Specified by:
copyin interfaceIDElement- Specified by:
copyin interfaceIDExpression- Parameters:
opt- optional; if one is provided,DCopyOptions.onDup(IDExpression)will be tried first to create a copy- Returns:
- the copied element
-
duplicateForReplacement
Duplicate this instruction with the intent to replace the source instruction. The offset and size of the source instruction are copied over to the newly created instruction.- Parameters:
replacedInsn- instruction being replaced- Returns:
- duplicated instruction
-
duplicateWithOffsetAndSize
Duplicate this instruction with an explicit offset and size.- Parameters:
offset- new offsetsize- new size- Returns:
- duplicated instruction
-
copyBaseFields
Copy all base fields, that is all fields but the opcode and operands of the source instruction to this instruction.- Parameters:
sourceInsn- source instruction
-
getContext
IDMethodContext getContext()Retrieve the IR method context to which this instruction belongs. The method context holds all information regarding a current method decompilation. It is also a factory to create moreIDInstructionobjects.- Returns:
- method context
-
setContext
Update the instruction context. It is important to update the context when transferring the instructions from a CFG (from context A) to another CFG (of contextB).- Parameters:
ctx- new context- Returns:
- the previous context
-
getOffset
long getOffset()IR offsets are 32-bit integers; they can be safely cast to int.- Specified by:
getOffsetin interfaceILocatedInstruction- Returns:
- the instruction offset/address
-
getOffsetEnd
long getOffsetEnd()Retrieve the end offset (exclusive) of this instruction- Specified by:
getOffsetEndin interfaceILocatedInstruction- Returns:
getOffset()+IInstruction.getSize()
-
setOffset
void setOffset(long offset) Set this instruction's IR offset. Dangerous method. Make sure to ensure CFG consistency if this instruction is part of a CFG.- Parameters:
offset- new offset
-
withOffset
Update the instruction offset.- Parameters:
offset- new offset- Returns:
- this object
-
setSize
void setSize(int size) Set this instruction's IR size. Dangerous method. Make sure to ensure CFG consistency if this instruction is part of a CFG.- Parameters:
size- new size
-
withSize
Update the instruction size.- Parameters:
size- new size- Returns:
- this object
-
adjustSize
void adjustSize(int delta) Adjust this instruction's IR size. Dangerous method. Make sure to ensure CFG consistency if this instruction is part of a CFG.- Parameters:
delta- added to the currentsize
-
getOpcode
DOpcodeType getOpcode()Get this instruction opcode.- Returns:
- instruction opcode
-
setOpcode
Change the instruction opcode. This method is dangerous. Instruction operands may require an update as well.- Parameters:
opcode- new opcode
-
isOpcode
Determine if this instruction's opcode is any of the provided candidates.- Parameters:
candidateOpcodes- a list of candidate opcodes- Returns:
- true if this instruction's opcode was one of the candidates
-
getOperand1
IDElement getOperand1()Get the first operand. May be null if the opcode does not specify one. Refer togetOpcode()andDOpcodeType.- Returns:
- first operand, or null
-
setOperand1
Change the instruction first operand. This method is dangerous. Other instruction attributes may require an update as well.- Parameters:
opnd- new first operand
-
getOperand2
IDElement getOperand2()Get the second operand. May be null if the opcode does not specify one. Refer togetOpcode()andDOpcodeType.- Returns:
- second operand, or null
-
setOperand2
Change the instruction second operand. This method is dangerous. Other instruction attributes may require an update as well.- Parameters:
opnd- new second operand
-
hasUseSideEffects
boolean hasUseSideEffects(boolean includeCanThrow) Determine whether the used components of the statement may have side-effects.This method is not fail-safe, it works on a best-effort basis. Refer to
IDExpression.hasSideEffects(IDMethodContext, boolean)for more information.- Parameters:
includeCanThrow- true to consider operations that may throw as side effects- Returns:
- true if used components may have side effects
-
isNop
boolean isNop()Determine whether this instruction is a no-op.- Returns:
- true if this instruction is a
nop
-
isAssign
boolean isAssign()Determine whether this instruction is an assignment.- Returns:
- true if this instruction is an
assignment
-
getAssignDestination
IDExpression getAssignDestination()Get the assignment destination.- Returns:
- assignment destination
-
setAssignDestination
Set the assignment destination.- Parameters:
dst- new destination- Returns:
- previous destination
-
getAssignSource
IDExpression getAssignSource()Get the assignment source.- Returns:
- assignment source
-
setAssignSource
Set the assignment source.- Parameters:
src- new source- Returns:
- previous source
-
isAssignToVar
default boolean isAssignToVar()Determine whether this instruction assigns to a variable.- Returns:
- true if this instruction assigns to a variable
-
isAssignToVar
default boolean isAssignToVar(int wantedVarId) Determine whether this instruction assigns to a specific variable.- Parameters:
wantedVarId- target variable id- Returns:
- true if this instruction assigns to the variable
-
isAssignFromVar
default boolean isAssignFromVar()Determine whether this instruction assigns from a variable.- Returns:
- true if this instruction assigns from a variable
-
isAssignFromVar
default boolean isAssignFromVar(int wantedVarId) Determine whether this instruction assigns from a specific variable.- Parameters:
wantedVarId- source variable id- Returns:
- true if this instruction assigns from the variable
-
isAssignFromVarToVar
default boolean isAssignFromVarToVar()Determine whether this instruction assigns from a variable to another variable.- Returns:
- true if this instruction is a variable-to-variable assignment
-
isAssignFromVarToVar
default boolean isAssignFromVarToVar(int wantedSrcVarId, int wantedDstVarId) Determine whether this instruction assigns from a specific variable to another.- Parameters:
wantedSrcVarId- source variable idwantedDstVarId- destination variable id- Returns:
- true if this instruction is the requested variable-to-variable assignment
-
isInvoke
boolean isInvoke()Determine whether this instruction is an invocation.- Returns:
- true if this instruction is an
invocation(call, new, new-array, alloc-object)
-
getInvokeData
IDInvokeInfo getInvokeData()Retrieve invocation information.- Returns:
- the invocation information, if the instruction
is an invocation
-
setBranchTarget
int setBranchTarget(int offset) Update the branch target for unconditional and conditional jumps only. This function fails for all other opcodes, including switches.- Parameters:
offset- the new offset- Returns:
- previous value
-
getBranchTarget
int getBranchTarget()Get the target offset for unconditional and conditional jumps.- Returns:
- branch target offset
-
isJump
boolean isJump()Determine whether this instruction is an unconditional jump.- Returns:
- true if this instruction is a
jump(goto)
-
isJumpTo
boolean isJumpTo(int wantedTarget) Determine whether this instruction is a jump to a specific target.- Parameters:
wantedTarget- target offset- Returns:
- true if this instruction is a jump to the target
-
isJcond
boolean isJcond()Determine whether this instruction is a conditional jump.- Returns:
- true if this instruction is a
conditional jump
-
isJcondTo
boolean isJcondTo(int wantedTarget) Determine whether this instruction is a conditional jump to a specific target.- Parameters:
wantedTarget- target offset- Returns:
- true if this instruction is a conditional jump to the target
-
isJumpOrJcond
boolean isJumpOrJcond()Determine whether this instruction is an unconditional or conditional jump.- Returns:
- true if this instruction is a jump or conditional jump
-
isJumpOrJcondTo
boolean isJumpOrJcondTo(int wantedTarget) Determine whether this instruction is an unconditional or conditional jump to a target.- Parameters:
wantedTarget- target offset- Returns:
- true if this instruction is a jump or conditional jump to the target
-
isJcondOrSwitch
boolean isJcondOrSwitch()Determine whether this instruction is a conditional jump or switch.- Returns:
- true if this instruction is a conditional jump or switch
-
getJcondCondition
IDExpression getJcondCondition()Get the condition predicate (if the instruction is a JCOND).- Returns:
- conditional jump predicate
-
setJcondCondition
Set the condition predicate for a conditional jump.- Parameters:
cond- new predicate- Returns:
- previous predicate
-
reverseJcondCondition
void reverseJcondCondition()Reverse the conditional jump predicate. -
isSwitch
boolean isSwitch()Determine whether this instruction is a switch.- Returns:
- true if this instruction is a
switch
-
isSwitchOnInt
boolean isSwitchOnInt()Determine whether this instruction is a switch on integers.- Returns:
- true if this instruction is an integer switch
-
isSwitchOnString
boolean isSwitchOnString()Determine whether this instruction is a switch on strings.- Returns:
- true if this instruction is a string switch
-
getSwitchData
IDSwitchData getSwitchData()Get switch data.- Returns:
- switch data
-
setSwitchData
Set switch data.- Parameters:
swdata- new switch data- Returns:
- previous switch data
-
getSwitchExpression
IDExpression getSwitchExpression()Get the switch expression.- Returns:
- switch expression
-
setSwitchExpression
Set the switch expression.- Parameters:
exp- new switch expression- Returns:
- previous switch expression
-
isReturn
boolean isReturn()Determine whether this instruction is a return.- Returns:
- true if this instruction is a
return
-
getReturnExpression
IDExpression getReturnExpression()Get the return expression.- Returns:
- return expression, or null for void returns
-
setReturnExpression
Set the return expression.- Parameters:
exp- new return expression- Returns:
- previous return expression
-
isThrow
boolean isThrow()Determine whether this instruction is a throw.- Returns:
- true if this instruction is a
throw
-
getThrowExpression
IDExpression getThrowExpression()Get the thrown expression.- Returns:
- thrown expression
-
setThrowExpression
Set the thrown expression.- Parameters:
exp- new thrown expression- Returns:
- previous thrown expression
-
isReturnOrThrow
boolean isReturnOrThrow()Determine whether this instruction is a return or throw.- Returns:
- true if this instruction is a return or throw
-
isStoreException
boolean isStoreException()Determine whether this instruction stores an exception object.- Returns:
- true if this instruction is a
store-exception(special opcode)
-
getStoredExceptionVariable
IDVar getStoredExceptionVariable()Retrieve the stored exception variable.- Returns:
- the exception variable set up by a
store-exceptioninstruction
-
setStoredExceptionVariable
Set the stored exception variable.- Parameters:
ex- a new exception variable for astore-exceptioninstruction- Returns:
- the previous variable
-
isMonitorEnter
boolean isMonitorEnter()Determine whether this instruction enters a monitor.- Returns:
- true if this instruction is a
monitor-enter
-
isMonitorExit
boolean isMonitorExit()Determine whether this instruction exits a monitor.- Returns:
- true if this instruction is a
monitor-exit
-
transformToNop
void transformToNop()Transform any instruction to a NOP. -
transformJcondToJump
void transformJcondToJump()Transform a conditional jump instruction to a jump. It is the caller's responsibility to verify that the instruction is a JCOND.IF pred GOTO target ==> GOTO target
-
transformToJump
void transformToJump(int offset) Transform any instruction to a jump, and update the jump target.- Parameters:
offset- target offset
-
transformToJump
Transform any instruction to a jump, and update the jump target.- Parameters:
target- a target
-
transformJcondToAssign
Transform a conditional jump instruction to a conditional-predicate assignment. It is the caller's responsibility to verify that the instruction is a JCOND.IF pred GOTO target ==> dst = pred
- Parameters:
dst- the destination operand for the predicate
-
transformSwitchToJcond
boolean transformSwitchToJcond()Transform a single-case switch into a conditional jump.SWITCH(VAR) { CASE X: GOTO target; } // fall-through => IF VAR==X GOTO target; // fall-through- Returns:
- success indicators (if the switch has several cases, this method will fail)
-
updateTargets
Update the targets of a branching instruction. This method has no effect on IR opcodes other thanJUMP,JCOND, andSWITCH.- Parameters:
oldToNewOffsets- a map of current IR offsets to new IR offsets- Returns:
- the number of updated targets
-
updateTargets
Update the targets of a branching instruction. This method has no effect on IR opcodes other thanJUMP,JCOND, andSWITCH.- Parameters:
oldToNewOffsets- a map of current IR offsets to new IR offsetsfailOnMissedEntry- if true, the method will raise if a (current) branch target cannot be mapped to a new target (i.e., if there is no entry for a branch target in the map)- Returns:
- the number of updated targets
-
morph
This dangerous method allows changing an IR instruction into a different one, while keeping metadata (e.g. offset, size, etc.) intact. If possible, use one of thetransformXxxinstructions instead.- Parameters:
opcode- new opcodeopnd1- new operand 1 (if any) - refer toDOpcodeType's type for operand typeopnd2- new operand 2 (if any) - refer toDOpcodeType's type for operand type
-
verify
Verify this instruction.Currently, this method verifies that the instruction operands match the
current opcodespecifications (seeDOpcodeType).- Throws:
IllegalStateException- throw on error
-
replaceUsedVariable
Deep replace all matching used variables of this instruction. The replacement expression is duplicated to avoid reuse. Defined identifiers (if any) are not replaced.- Parameters:
var- target variable to be replacedrepl- expression that will replace the variable- Returns:
- the number of replacements
-
replaceDefinedVariable
Replace the variable defined by this statement (if there is any).- Parameters:
var- target variable to be replacedrepl- expression that will replace the variable- Returns:
- the number of replacements (usually 0, potentially 1 for an assigment-like instruction)
-
getUsedVariables
Get the variables used (read) by this instruction.- Returns:
- the list of all variables used, which may contain duplicates variables if the
instruction uses the same variable multiple times (example:
z = x + (y * x)would return[y, x, x].
-
getDefinedVariable
IDVar getDefinedVariable()Get the identifier defined (written) by this method, if there is one. OnlyDOpcodeType.IR_ASSIGNandDOpcodeType.IR_STORE_EXCEPTIONmay define (write) identifiers.- Returns:
- variable defined by this instruction, or null
-
countUsedVariable
Count the number of times the provided variable is used (read) by this instruction.Example (ASSIGN opcode):
x = y * (y + z)=> x is not used; y is used twice; z is used once- Parameters:
var- variable to count- Returns:
- number of uses
-
visitInstruction
Visit this instruction and its constituents. The visit is made depth-first, pre-order, and parents are recorded. (Refer toIVisitResultsfor details.)Same as
visitInstructionPreOrder. Replacements must be reported (refer toIDExpression.visitDepthPre(IDVisitor)for details).- Parameters:
visitor- visitor object- Returns:
- success indicator; true unless a different value was specified in
DVisitResultswhen visiting an element
-
visitInstruction
Visit this instruction and its constituents. The visit is made depth-first, pre-order, and parents are recorded. (Refer toIVisitResultsfor details.)Same as
visitInstructionPreOrder. Replacements must be reported (refer toIDExpression.visitDepthPre(IDVisitor)for details).- Parameters:
visitor- visitor objectskipAssignmentDestination- true to skip visiting the destination ofDOpcodeType.IR_ASSIGNorDOpcodeType.IR_STORE_EXCEPTION- Returns:
- success indicator; true unless a different value was specified in
DVisitResultswhen visiting an element
-
visitInstructionPreOrder
Visit this instruction and its constituents. The visit is made depth-first, pre-order, and parents are recorded. (Refer toIVisitResultsfor details.)Replacements must be reported (refer to
IDExpression.visitDepthPre(IDVisitor)for details).- Parameters:
visitor- visitor objectskipAssignmentDestination- true to skip visiting the destination ofDOpcodeType.IR_ASSIGNorDOpcodeType.IR_STORE_EXCEPTION- Returns:
- success indicator; true unless a different value was specified in
DVisitResultswhen visiting an element
-
visitInstructionPostOrder
Visit this instruction and its constituents. The visit is made depth-first, post-order, and parents are recorded. (Refer toIVisitResultsfor details.)Replacements need not be reported.
- Parameters:
visitor- visitor objectskipAssignmentDestination- true to skip visiting the destination ofDOpcodeType.IR_ASSIGNorDOpcodeType.IR_STORE_EXCEPTION- Returns:
- success indicator; true unless a different value was specified in
DVisitResultswhen visiting an element
-
evaluate
Convenience method: evaluate the IR instruction using the provided set a variable values.- Parameters:
varmap- a map of variable values to be used when evaluating the expression (this map will not be modified after evaluation of the instruction; for full-control of the emulation, useIDExpression.evaluate(IDState)instead of this method)- Returns:
- the offset of the next IR instruction to be executed; null if none (e.g. a Return was executed)
- Throws:
DexDecEvaluationException- on evaluation error
-