java.lang.Object | |
↳ | com.pnfsoftware.jeb.core.units.code.asm.decompiler.ast.CUtil |
Utility methods to manipulate AST elements
.
Nested Classes | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
class | CUtil.BreakFlowResult | ||||||||||
enum | CUtil.BreakFlowStatus | Status of a flow breaker AST statement. |
Public Constructors | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
CUtil() |
Public Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
static ICOperation | add(ICMethod m, ICExpression a, ICExpression b) | ||||||||||
static ICOperation | add(ICMethod m, ICExpression a, ICExpression b, ICExpression c) | ||||||||||
static ICOperation | andB(ICMethod m, ICExpression a, ICExpression b) | ||||||||||
static ICOperation | andL(ICMethod m, ICExpression a, ICExpression b) | ||||||||||
static boolean |
canFallthrough(ICStatement currentStmt, ICStatement fallthroughStmt, boolean ignoreBreak)
Check if the current statement can fallthrough to the next statement, i.e.
| ||||||||||
static boolean | containsBreak(ICStatement stm) | ||||||||||
static boolean | containsLabel(ICStatement stm) | ||||||||||
static boolean | containsStatement(ICStatement stm, Class<? extends ICStatement> class_) | ||||||||||
static int |
countAllSubElements(ICElement elem)
Recursively count the total number of sub-elements in the given element (see
getSubElements() ). | ||||||||||
static ICOperation | div(ICMethod m, ICExpression a, ICExpression b) | ||||||||||
static ICOperation | eq(ICMethod m, ICExpression a, ICExpression b) | ||||||||||
static ICElement |
findParent(ICElement root, ICElement elt)
Retrieve the parent of an AST element (or first parent, if the element is reusable and has
potentially multiple parents - e.g.
| ||||||||||
static boolean |
flipIfElse(ICStatement stm, ICOperatorFactory of)
Check if a statement is a if-statement with two blocks, including a default block, and
reverse the condition.
| ||||||||||
static ICOperation | ge(ICMethod m, ICExpression a, ICExpression b) | ||||||||||
static CUtil.BreakFlowResult |
getBreakingFlowResult(ICStatement e)
Indicate if next instruction will be executed.
| ||||||||||
static Long |
getConstantAsLong(ICConstant<?> expr)
Retrieve the value associated to an
ICConstant as a Long. | ||||||||||
static ICDecl |
getDefinition(ICElement element)
Get the
ICDecl possibly contained in a statement; either the statement itself, or the
left-side of an assignment. | ||||||||||
static ICElement |
getDefinitionInitialValue(ICElement element)
Get the initial value of a defined variable, from its definition statement.
| ||||||||||
static ICStatement |
getFirstRealStatement(ICBlock b, int i)
Get the next "real" statement to be executed in the block, starting at the given index
inclusively.
| ||||||||||
static ICStatement |
getFirstRealStatementEx(ICMethod m, ICStatement first)
This method does two things:
| ||||||||||
static ICLabel |
getGotoLabel(ICStatement stm)
Check if the statement is a
ICGoto to return the label; else, return null. | ||||||||||
static ICLabel |
getIfGotoTarget(ICStatement stm)
Check if the statement follows the pattern
if(P){goto x;} and if so, returns
x . | ||||||||||
static COperatorType | getOperation(ICExpression e, COperatorType... optypes) | ||||||||||
static COperatorType | getOperation(ICOperation e, COperatorType... optypes) | ||||||||||
static ICStatement |
getParentBlock(ICMethod m, ICStatement b)
Retrieve parent block or null if no parent was found (or processed statement is the top body
of the
ICMethod ) | ||||||||||
static List<ICStatement> |
getPreviouslyExecutedStatements(ICMethod m, ICStatement first)
Attempt to retrieve the previously executed statements from a given statement.
| ||||||||||
static ICOperation | gt(ICMethod m, ICExpression a, ICExpression b) | ||||||||||
static boolean |
hasEmptyBranch(ICIfStm stm)
Check if a if-statement has an empty branch (including the default one).
| ||||||||||
static boolean | hasNoCall(ICElement elem) | ||||||||||
static boolean |
hasNoSideEffects(ICElement elem)
Check if an
ICElement can not possibly modify variables. | ||||||||||
static boolean |
isBreakTo(ICStatement stm, ICLabel target)
Check if the statement is a
ICBreak to the given label. | ||||||||||
static CUtil.BreakFlowStatus | isBreakingFlow(ICStatement e) | ||||||||||
static boolean | isClassMethodField(ICElement e) | ||||||||||
static boolean |
isContainingLabel(ICStatement stm, ICLabel targetLabel)
Check if a statement contains a given label; compound statements are recursively processed to
search for the label.
| ||||||||||
static boolean | isDeclareAndAssign(ICElement element) | ||||||||||
static boolean |
isDoWhileTrue(ICStatement stm)
Check if a statement is a do-while loop, whose predicate is literal True.
| ||||||||||
static boolean |
isGotoTo(ICStatement stm, ICLabel target)
Check if the statement is a
ICGoto to the given label. | ||||||||||
static boolean |
isIfBranch(ICStatement stm)
Check if the statement follows the pattern
if(P){BRANCH;} , where
BRANCH is a sole branch instruction. | ||||||||||
static boolean |
isIfElse(ICStatement stm)
Check if a statement is a if-statement with two blocks, including a default block.
| ||||||||||
static boolean |
isIfNoElse(ICStatement stm)
Check if a statement follows the pattern
if(P){ }[else if(...){}]* , i.e. | ||||||||||
static boolean |
isIntegerConstant(ICExpression expr)
Check if the element is a
ICConstantInteger
| ||||||||||
static boolean |
isIntegerValue(ICExpression expr, long value)
Check if the element is a
ICConstantInteger equals to the given value. | ||||||||||
static boolean | isOperation(ICExpression e, COperatorType... optypes) | ||||||||||
static boolean |
isPlainBreak(ICStatement stm)
Check if the statement is a
ICBreak without label. | ||||||||||
static boolean |
isWhileTrue(ICStatement stm)
Check if a statement is a while loop, whose predicate is literal True.
| ||||||||||
static ICOperation | le(ICMethod m, ICExpression a, ICExpression b) | ||||||||||
static ICOperation | lt(ICMethod m, ICExpression a, ICExpression b) | ||||||||||
static ICOperation | mul(ICMethod m, ICExpression a, ICExpression b) | ||||||||||
static ICOperation | ne(ICMethod m, ICExpression a, ICExpression b) | ||||||||||
static ICExpression | notB(ICMethod m, ICExpression a) | ||||||||||
static ICExpression | notL(ICMethod m, ICExpression a) | ||||||||||
static ICExpression | notLDeepReplace(ICMethod m, ICExpression a) | ||||||||||
static ICOperation | orB(ICMethod m, ICExpression a, ICExpression b) | ||||||||||
static ICOperation | orL(ICMethod m, ICExpression a, ICExpression b) | ||||||||||
static ICOperation | rem(ICMethod m, ICExpression a, ICExpression b) | ||||||||||
static int |
replaceSubElementRecurse(ICElement elt, ICExpression oldElement, ICExpression newElement)
Recursively replace sub-elements of an element , using equals() equality.
| ||||||||||
static ICExpression | resolveNotOperation(ICMethod m, ICOperation e, ICElement parent) | ||||||||||
static ICOperation | shl(ICMethod m, ICExpression a, ICExpression b) | ||||||||||
static ICOperation | shr(ICMethod m, ICExpression a, ICExpression b) | ||||||||||
static ICOperation | sub(ICMethod m, ICExpression a, ICExpression b) | ||||||||||
static ICOperation | ushr(ICMethod m, ICExpression a, ICExpression b) | ||||||||||
static boolean | visitICStatementDepthPost(ICVisitor visitor, ICBlock elt, int from, CVisitResults results) | ||||||||||
static boolean | visitICStatementDepthPost(ICVisitor visitor, ICStatement elt, CVisitResults results) | ||||||||||
static ICOperation | xorB(ICMethod m, ICExpression a, ICExpression b) |
[Expand]
Inherited Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
From class
java.lang.Object
|
Check if the current statement can fallthrough to the next statement, i.e. if the first one can redirect execution to the second one (directly or indirectly) when these two statements are next to each other. If the answer is false, the second statement can not possibly be executed once its predecessor has been executed.
Note: this is a conservative analysis (= false is a correct result, while true might indicate an unknown case). In particular, if the fallthrough statement is a label or a compound statement, the answer is true.
fallthroughStmt | the statement immediately following the current statement in the block |
---|---|
ignoreBreak | indicate that the break should be ignored (in particular, when not in loop or in a switch context) |
Recursively count the total number of sub-elements in the given element (see
getSubElements()
).
Retrieve the parent of an AST element (or first parent, if the element is reusable and has
potentially multiple parents - e.g. ICIdentifier
).
root | a root element, typically, an ICMethod |
---|---|
elt | the element for which the first parent is to be found |
Check if a statement is a if-statement with two blocks, including a default block, and
reverse the condition. Effectively, if(A){X}else{Y}
is transformed to
if(!A){Y}else{X}}
.
Indicate if next instruction will be executed. This is not an in-depth analysis, meaning that
if there if a if (true) return; b = 2;
, the method will return
BOTH
(predicates are not examined, only branches and based on last
instruction).
Retrieve the value associated to an ICConstant
as a Long.
Get the ICDecl
possibly contained in a statement; either the statement itself, or the
left-side of an assignment.
Get the initial value of a defined variable, from its definition statement.
Get the next "real" statement to be executed in the block, starting at the given index inclusively.
In particular, this method skips over:
do {
part of a do-while blockwhile(true) {
part of a while blockif(true) {
part of a conditional statementi | the index in the block, at which to start the search |
---|
This method does two things:
stm1; // first while(true) { stm2; // next ...Or:
stm1; // first do { stm2; // next ...Or:
if(...) { while(...) { // first ...; } } stm2; // next
Check if the statement is a ICGoto
to return the label; else, return null.
Check if the statement follows the pattern if(P){goto x;}
and if so, returns
x
.
Retrieve parent block or null if no parent was found (or processed statement is the top body
of the ICMethod
)
m | method to check |
---|---|
b | statement to look for parent |
Attempt to retrieve the previously executed statements from a given statement.
Note that there is no look up for goto and jump so the previous statement of a label will only be the previous instruction as seen in the method. This method returns null when previous statements are too complicated to retrieve.
Check if a if-statement has an empty branch (including the default one).
Check if the statement is a ICBreak
to the given label.
Check if a statement contains a given label; compound statements are recursively processed to search for the label.
Check if a statement is a do-while loop, whose predicate is literal True.
Check if the statement is a ICGoto
to the given label.
Check if the statement follows the pattern if(P){BRANCH;}
, where
BRANCH
is a sole branch instruction.
Check if a statement is a if-statement with two blocks, including a default block.
Check if a statement follows the pattern if(P){ }[else if(...){}]*
, i.e. a
if-statement with possibly multiple blocks but no default else
block.
Check if the element is a ICConstantInteger
Check if the element is a ICConstantInteger
equals to the given value.
Check if the statement is a ICBreak
without label.
Check if a statement is a while loop, whose predicate is literal True.
Recursively replace sub-elements of an element , using equals() equality.