Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
极致猎手
jadx
提交
82f3b57e
J
jadx
项目概览
极致猎手
/
jadx
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
jadx
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
82f3b57e
编写于
2月 15, 2022
作者:
S
Skylot
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
perf: improve ternary mod on big methods (#1379)
上级
af2f14f8
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
35 addition
and
9 deletion
+35
-9
jadx-core/src/main/java/jadx/core/dex/attributes/AFlag.java
jadx-core/src/main/java/jadx/core/dex/attributes/AFlag.java
+1
-0
jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfRegionVisitor.java
.../java/jadx/core/dex/visitors/regions/IfRegionVisitor.java
+1
-3
jadx-core/src/main/java/jadx/core/dex/visitors/regions/TernaryMod.java
.../main/java/jadx/core/dex/visitors/regions/TernaryMod.java
+32
-6
jadx-core/src/main/java/jadx/core/dex/visitors/shrink/CodeShrinkVisitor.java
...java/jadx/core/dex/visitors/shrink/CodeShrinkVisitor.java
+1
-0
未找到文件。
jadx-core/src/main/java/jadx/core/dex/attributes/AFlag.java
浏览文件 @
82f3b57e
...
...
@@ -76,6 +76,7 @@ public enum AFlag {
INCONSISTENT_CODE
,
// warning about incorrect decompilation
REQUEST_IF_REGION_OPTIMIZE
,
// run if region visitor again
REQUEST_CODE_SHRINK
,
RERUN_SSA_TRANSFORM
,
METHOD_CANDIDATE_FOR_INLINE
,
...
...
jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfRegionVisitor.java
浏览文件 @
82f3b57e
...
...
@@ -16,8 +16,6 @@ import jadx.core.utils.RegionUtils;
import
static
jadx
.
core
.
utils
.
RegionUtils
.
insnsCount
;
public
class
IfRegionVisitor
extends
AbstractVisitor
{
private
static
final
TernaryMod
TERNARY_VISITOR
=
new
TernaryMod
();
private
static
final
ProcessIfRegionVisitor
PROCESS_IF_REGION_VISITOR
=
new
ProcessIfRegionVisitor
();
private
static
final
RemoveRedundantElseVisitor
REMOVE_REDUNDANT_ELSE_VISITOR
=
new
RemoveRedundantElseVisitor
();
...
...
@@ -30,7 +28,7 @@ public class IfRegionVisitor extends AbstractVisitor {
}
public
static
void
process
(
MethodNode
mth
)
{
DepthRegionTraversal
.
traverseIterative
(
mth
,
TERNARY_VISITOR
);
TernaryMod
.
process
(
mth
);
DepthRegionTraversal
.
traverse
(
mth
,
PROCESS_IF_REGION_VISITOR
);
DepthRegionTraversal
.
traverseIterative
(
mth
,
REMOVE_REDUNDANT_ELSE_VISITOR
);
}
...
...
jadx-core/src/main/java/jadx/core/dex/visitors/regions/TernaryMod.java
浏览文件 @
82f3b57e
...
...
@@ -25,10 +25,38 @@ import jadx.core.utils.InsnRemover;
/**
* Convert 'if' to ternary operation
*/
public
class
TernaryMod
implements
IRegionIterativeVisitor
{
public
class
TernaryMod
extends
AbstractRegionVisitor
implements
IRegionIterativeVisitor
{
private
static
final
TernaryMod
INSTANCE
=
new
TernaryMod
();
public
static
void
process
(
MethodNode
mth
)
{
// first: convert all found ternary nodes in one iteration
DepthRegionTraversal
.
traverse
(
mth
,
INSTANCE
);
if
(
mth
.
contains
(
AFlag
.
REQUEST_CODE_SHRINK
))
{
CodeShrinkVisitor
.
shrinkMethod
(
mth
);
}
// second: iterative runs with shrink after each change
DepthRegionTraversal
.
traverseIterative
(
mth
,
INSTANCE
);
}
@Override
public
boolean
enterRegion
(
MethodNode
mth
,
IRegion
region
)
{
if
(
processRegion
(
mth
,
region
))
{
mth
.
add
(
AFlag
.
REQUEST_CODE_SHRINK
);
}
return
true
;
}
@Override
public
boolean
visitRegion
(
MethodNode
mth
,
IRegion
region
)
{
if
(
processRegion
(
mth
,
region
))
{
CodeShrinkVisitor
.
shrinkMethod
(
mth
);
return
true
;
}
return
false
;
}
private
static
boolean
processRegion
(
MethodNode
mth
,
IRegion
region
)
{
if
(
region
instanceof
IfRegion
)
{
return
makeTernaryInsn
(
mth
,
(
IfRegion
)
region
);
}
...
...
@@ -115,9 +143,6 @@ public class TernaryMod implements IRegionIterativeVisitor {
header
.
getInstructions
().
add
(
ternInsn
);
clearConditionBlocks
(
conditionBlocks
,
header
);
// shrink method again
CodeShrinkVisitor
.
shrinkMethod
(
mth
);
return
true
;
}
...
...
@@ -151,8 +176,6 @@ public class TernaryMod implements IRegionIterativeVisitor {
header
.
add
(
AFlag
.
RETURN
);
clearConditionBlocks
(
conditionBlocks
,
header
);
CodeShrinkVisitor
.
shrinkMethod
(
mth
);
return
true
;
}
return
false
;
...
...
@@ -291,4 +314,7 @@ public class TernaryMod implements IRegionIterativeVisitor {
// shrink method again
CodeShrinkVisitor
.
shrinkMethod
(
mth
);
}
private
TernaryMod
()
{
}
}
jadx-core/src/main/java/jadx/core/dex/visitors/shrink/CodeShrinkVisitor.java
浏览文件 @
82f3b57e
...
...
@@ -42,6 +42,7 @@ public class CodeShrinkVisitor extends AbstractVisitor {
if
(
mth
.
isNoCode
())
{
return
;
}
mth
.
remove
(
AFlag
.
REQUEST_CODE_SHRINK
);
for
(
BlockNode
block
:
mth
.
getBasicBlocks
())
{
shrinkBlock
(
mth
,
block
);
simplifyMoveInsns
(
mth
,
block
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录