Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
J
jadx
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
open-source
jadx
Commits
cbbb7335
Commit
cbbb7335
authored
Jul 04, 2013
by
Skylot
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove unneeded 'return' instructions
parent
f51d6337
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
61 additions
and
15 deletions
+61
-15
MethodNode.java
src/main/java/jadx/dex/nodes/MethodNode.java
+17
-0
BlockMakerVisitor.java
src/main/java/jadx/dex/visitors/BlockMakerVisitor.java
+12
-0
FinishRegions.java
src/main/java/jadx/dex/visitors/regions/FinishRegions.java
+29
-12
TracedRegionVisitor.java
...n/java/jadx/dex/visitors/regions/TracedRegionVisitor.java
+3
-3
No files found.
src/main/java/jadx/dex/nodes/MethodNode.java
View file @
cbbb7335
...
@@ -4,6 +4,7 @@ import jadx.Consts;
...
@@ -4,6 +4,7 @@ import jadx.Consts;
import
jadx.dex.attributes.AttrNode
;
import
jadx.dex.attributes.AttrNode
;
import
jadx.dex.attributes.AttributeFlag
;
import
jadx.dex.attributes.AttributeFlag
;
import
jadx.dex.attributes.JumpAttribute
;
import
jadx.dex.attributes.JumpAttribute
;
import
jadx.dex.attributes.LoopAttr
;
import
jadx.dex.attributes.annotations.Annotation
;
import
jadx.dex.attributes.annotations.Annotation
;
import
jadx.dex.info.AccessInfo
;
import
jadx.dex.info.AccessInfo
;
import
jadx.dex.info.AccessInfo.AFType
;
import
jadx.dex.info.AccessInfo.AFType
;
...
@@ -64,6 +65,7 @@ public class MethodNode extends AttrNode implements ILoadable {
...
@@ -64,6 +65,7 @@ public class MethodNode extends AttrNode implements ILoadable {
private
IContainer
region
;
private
IContainer
region
;
private
List
<
ExceptionHandler
>
exceptionHandlers
;
private
List
<
ExceptionHandler
>
exceptionHandlers
;
private
List
<
LoopAttr
>
loops
=
Collections
.
emptyList
();
public
MethodNode
(
ClassNode
classNode
,
Method
mthData
)
{
public
MethodNode
(
ClassNode
classNode
,
Method
mthData
)
{
this
.
mthInfo
=
MethodInfo
.
fromDex
(
classNode
.
dex
(),
mthData
.
getMethodIndex
());
this
.
mthInfo
=
MethodInfo
.
fromDex
(
classNode
.
dex
(),
mthData
.
getMethodIndex
());
...
@@ -411,6 +413,21 @@ public class MethodNode extends AttrNode implements ILoadable {
...
@@ -411,6 +413,21 @@ public class MethodNode extends AttrNode implements ILoadable {
this
.
exitBlocks
.
add
(
exitBlock
);
this
.
exitBlocks
.
add
(
exitBlock
);
}
}
public
void
registerLoop
(
LoopAttr
loop
)
{
if
(
loops
.
isEmpty
())
{
loops
=
new
ArrayList
<
LoopAttr
>(
5
);
}
loops
.
add
(
loop
);
}
public
LoopAttr
getLoopForBlock
(
BlockNode
block
)
{
for
(
LoopAttr
loop
:
loops
)
{
if
(
loop
.
getLoopBlocks
().
contains
(
block
))
return
loop
;
}
return
null
;
}
public
ExceptionHandler
addExceptionHandler
(
ExceptionHandler
handler
)
{
public
ExceptionHandler
addExceptionHandler
(
ExceptionHandler
handler
)
{
if
(
exceptionHandlers
==
null
)
{
if
(
exceptionHandlers
==
null
)
{
exceptionHandlers
=
new
ArrayList
<
ExceptionHandler
>(
2
);
exceptionHandlers
=
new
ArrayList
<
ExceptionHandler
>(
2
);
...
...
src/main/java/jadx/dex/visitors/BlockMakerVisitor.java
View file @
cbbb7335
...
@@ -180,6 +180,8 @@ public class BlockMakerVisitor extends AbstractVisitor {
...
@@ -180,6 +180,8 @@ public class BlockMakerVisitor extends AbstractVisitor {
if
(
i
>
100
)
if
(
i
>
100
)
throw
new
AssertionError
(
"Can't fix method cfg: "
+
mth
);
throw
new
AssertionError
(
"Can't fix method cfg: "
+
mth
);
}
}
registerLoops
(
mth
);
}
}
private
static
BlockNode
getBlock
(
int
offset
,
Map
<
Integer
,
BlockNode
>
blocksMap
)
{
private
static
BlockNode
getBlock
(
int
offset
,
Map
<
Integer
,
BlockNode
>
blocksMap
)
{
...
@@ -307,6 +309,16 @@ public class BlockMakerVisitor extends AbstractVisitor {
...
@@ -307,6 +309,16 @@ public class BlockMakerVisitor extends AbstractVisitor {
}
}
}
}
private
static
void
registerLoops
(
MethodNode
mth
)
{
for
(
BlockNode
block
:
mth
.
getBasicBlocks
())
{
AttributesList
attributes
=
block
.
getAttributes
();
IAttribute
loop
=
attributes
.
get
(
AttributeType
.
LOOP
);
if
(
loop
!=
null
&&
attributes
.
contains
(
AttributeFlag
.
LOOP_START
))
{
mth
.
registerLoop
((
LoopAttr
)
loop
);
}
}
}
private
static
boolean
modifyBlocksTree
(
MethodNode
mth
)
{
private
static
boolean
modifyBlocksTree
(
MethodNode
mth
)
{
for
(
BlockNode
block
:
mth
.
getBasicBlocks
())
{
for
(
BlockNode
block
:
mth
.
getBasicBlocks
())
{
if
(
block
.
getPredecessors
().
isEmpty
()
&&
block
!=
mth
.
getEnterBlock
())
{
if
(
block
.
getPredecessors
().
isEmpty
()
&&
block
!=
mth
.
getEnterBlock
())
{
...
...
src/main/java/jadx/dex/visitors/regions/FinishRegions.java
View file @
cbbb7335
package
jadx
.
dex
.
visitors
.
regions
;
package
jadx
.
dex
.
visitors
.
regions
;
import
jadx.dex.instructions.InsnType
;
import
jadx.dex.instructions.InsnType
;
import
jadx.dex.instructions.args.ArgType
;
import
jadx.dex.nodes.BlockNode
;
import
jadx.dex.nodes.IBlock
;
import
jadx.dex.nodes.IBlock
;
import
jadx.dex.nodes.IRegion
;
import
jadx.dex.nodes.IRegion
;
import
jadx.dex.nodes.InsnNode
;
import
jadx.dex.nodes.InsnNode
;
import
jadx.dex.nodes.MethodNode
;
import
jadx.dex.nodes.MethodNode
;
import
jadx.dex.regions.LoopRegion
;
import
jadx.dex.regions.LoopRegion
;
import
java.util.Iterator
;
import
java.util.List
;
import
java.util.List
;
public
class
FinishRegions
implements
IRegionVisitor
{
public
class
FinishRegions
extends
TracedRegionVisitor
{
@Override
@Override
public
void
processBlock
(
MethodNode
mth
,
IBlock
block
)
{
public
void
processBlockTraced
(
MethodNode
mth
,
IBlock
container
,
IRegion
currentRegion
)
{
if
(
container
.
getClass
()
!=
BlockNode
.
class
)
return
;
BlockNode
block
=
(
BlockNode
)
container
;
// remove return from class init method
// remove last return in void functions
if
(
mth
.
getMethodInfo
().
isClassInit
())
{
if
(
block
.
getCleanSuccessors
().
isEmpty
()
&&
mth
.
getReturnType
().
equals
(
ArgType
.
VOID
))
{
List
<
InsnNode
>
insns
=
block
.
getInstructions
();
List
<
InsnNode
>
insns
=
block
.
getInstructions
();
if
(
insns
.
size
()
!=
0
)
{
int
lastIndex
=
insns
.
size
()
-
1
;
InsnNode
last
=
insns
.
get
(
insns
.
size
()
-
1
);
if
(
lastIndex
!=
-
1
)
{
if
(
last
.
getType
()
==
InsnType
.
RETURN
)
{
InsnNode
last
=
insns
.
get
(
lastIndex
);
insns
.
remove
(
insns
.
size
()
-
1
);
if
(
last
.
getType
()
==
InsnType
.
RETURN
&&
blockNotInLoop
(
mth
,
block
))
{
insns
.
remove
(
lastIndex
);
}
}
}
}
}
}
}
}
@Override
private
boolean
blockNotInLoop
(
MethodNode
mth
,
BlockNode
block
)
{
public
void
enterRegion
(
MethodNode
mth
,
IRegion
region
)
{
if
(
mth
.
getLoopForBlock
(
block
)
!=
null
)
return
false
;
for
(
Iterator
<
IRegion
>
it
=
regionStack
.
descendingIterator
();
it
.
hasNext
();
)
{
IRegion
region
=
it
.
next
();
if
(
region
.
getClass
()
==
LoopRegion
.
class
)
return
false
;
}
return
true
;
}
}
@Override
@Override
...
@@ -36,6 +53,6 @@ public class FinishRegions implements IRegionVisitor {
...
@@ -36,6 +53,6 @@ public class FinishRegions implements IRegionVisitor {
LoopRegion
loop
=
(
LoopRegion
)
region
;
LoopRegion
loop
=
(
LoopRegion
)
region
;
loop
.
mergePreCondition
();
loop
.
mergePreCondition
();
}
}
super
.
leaveRegion
(
mth
,
region
);
}
}
}
}
src/main/java/jadx/dex/visitors/regions/TracedRegionVisitor.java
View file @
cbbb7335
...
@@ -4,11 +4,12 @@ import jadx.dex.nodes.IBlock;
...
@@ -4,11 +4,12 @@ import jadx.dex.nodes.IBlock;
import
jadx.dex.nodes.IRegion
;
import
jadx.dex.nodes.IRegion
;
import
jadx.dex.nodes.MethodNode
;
import
jadx.dex.nodes.MethodNode
;
import
java.util.Stack
;
import
java.util.ArrayDeque
;
import
java.util.Deque
;
public
abstract
class
TracedRegionVisitor
implements
IRegionVisitor
{
public
abstract
class
TracedRegionVisitor
implements
IRegionVisitor
{
pr
ivate
final
Stack
<
IRegion
>
regionStack
=
new
Stack
<
IRegion
>();
pr
otected
final
Deque
<
IRegion
>
regionStack
=
new
ArrayDeque
<
IRegion
>();
@Override
@Override
public
void
enterRegion
(
MethodNode
mth
,
IRegion
region
)
{
public
void
enterRegion
(
MethodNode
mth
,
IRegion
region
)
{
...
@@ -27,5 +28,4 @@ public abstract class TracedRegionVisitor implements IRegionVisitor {
...
@@ -27,5 +28,4 @@ public abstract class TracedRegionVisitor implements IRegionVisitor {
public
void
leaveRegion
(
MethodNode
mth
,
IRegion
region
)
{
public
void
leaveRegion
(
MethodNode
mth
,
IRegion
region
)
{
regionStack
.
pop
();
regionStack
.
pop
();
}
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment