Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
keyescgm
jadx
提交
33f2c3f2
J
jadx
项目概览
keyescgm
/
jadx
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
jadx
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
33f2c3f2
编写于
9月 23, 2020
作者:
S
Skylot
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix: transform loop to `for` with branching at end
Signed-off-by:
N
Skylot
<
skylot@gmail.com
>
上级
dcca0133
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
64 addition
and
7 deletion
+64
-7
jadx-core/src/main/java/jadx/core/dex/attributes/AFlag.java
jadx-core/src/main/java/jadx/core/dex/attributes/AFlag.java
+2
-0
jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfRegionVisitor.java
.../java/jadx/core/dex/visitors/regions/IfRegionVisitor.java
+3
-0
jadx-core/src/main/java/jadx/core/dex/visitors/regions/LoopRegionVisitor.java
...ava/jadx/core/dex/visitors/regions/LoopRegionVisitor.java
+15
-7
jadx-core/src/test/java/jadx/tests/integration/loops/TestArrayForEach3.java
.../java/jadx/tests/integration/loops/TestArrayForEach3.java
+44
-0
未找到文件。
jadx-core/src/main/java/jadx/core/dex/attributes/AFlag.java
浏览文件 @
33f2c3f2
...
...
@@ -73,4 +73,6 @@ public enum AFlag {
SOFT_CAST
,
// synthetic cast to help type inference
INCONSISTENT_CODE
,
// warning about incorrect decompilation
REQUEST_IF_REGION_OPTIMIZE
,
// run if region visitor again
}
jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfRegionVisitor.java
浏览文件 @
33f2c3f2
...
...
@@ -26,7 +26,10 @@ public class IfRegionVisitor extends AbstractVisitor {
if
(
mth
.
isNoCode
())
{
return
;
}
process
(
mth
);
}
public
static
void
process
(
MethodNode
mth
)
{
DepthRegionTraversal
.
traverseIterative
(
mth
,
TERNARY_VISITOR
);
DepthRegionTraversal
.
traverse
(
mth
,
PROCESS_IF_REGION_VISITOR
);
DepthRegionTraversal
.
traverseIterative
(
mth
,
REMOVE_REDUNDANT_ELSE_VISITOR
);
...
...
jadx-core/src/main/java/jadx/core/dex/visitors/regions/LoopRegionVisitor.java
浏览文件 @
33f2c3f2
...
...
@@ -53,35 +53,43 @@ public class LoopRegionVisitor extends AbstractVisitor implements IRegionVisitor
@Override
public
void
visit
(
MethodNode
mth
)
{
DepthRegionTraversal
.
traverse
(
mth
,
this
);
if
(
mth
.
contains
(
AFlag
.
REQUEST_IF_REGION_OPTIMIZE
))
{
IfRegionVisitor
.
process
(
mth
);
mth
.
remove
(
AFlag
.
REQUEST_IF_REGION_OPTIMIZE
);
}
}
@Override
public
boolean
enterRegion
(
MethodNode
mth
,
IRegion
region
)
{
if
(
region
instanceof
LoopRegion
)
{
processLoopRegion
(
mth
,
(
LoopRegion
)
region
);
if
(
processLoopRegion
(
mth
,
(
LoopRegion
)
region
))
{
// optimize `if` block after instructions remove
mth
.
add
(
AFlag
.
REQUEST_IF_REGION_OPTIMIZE
);
}
}
return
true
;
}
private
static
void
processLoopRegion
(
MethodNode
mth
,
LoopRegion
loopRegion
)
{
private
static
boolean
processLoopRegion
(
MethodNode
mth
,
LoopRegion
loopRegion
)
{
if
(
loopRegion
.
isConditionAtEnd
())
{
return
;
return
false
;
}
IfCondition
condition
=
loopRegion
.
getCondition
();
if
(
condition
==
null
)
{
return
;
return
false
;
}
if
(
checkForIndexedLoop
(
mth
,
loopRegion
,
condition
))
{
return
;
return
true
;
}
checkIterableForEach
(
mth
,
loopRegion
,
condition
);
return
checkIterableForEach
(
mth
,
loopRegion
,
condition
);
}
/**
* Check for indexed loop.
*/
private
static
boolean
checkForIndexedLoop
(
MethodNode
mth
,
LoopRegion
loopRegion
,
IfCondition
condition
)
{
InsnNode
incrInsn
=
RegionUtils
.
getLastInsn
(
loopRegion
);
BlockNode
loopEndBlock
=
loopRegion
.
getInfo
().
getEnd
();
InsnNode
incrInsn
=
BlockUtils
.
getLastInsn
(
BlockUtils
.
skipSyntheticPredecessor
(
loopEndBlock
));
if
(
incrInsn
==
null
)
{
return
false
;
}
...
...
jadx-core/src/test/java/jadx/tests/integration/loops/TestArrayForEach3.java
0 → 100644
浏览文件 @
33f2c3f2
package
jadx.tests.integration.loops
;
import
org.junit.jupiter.api.Test
;
import
jadx.tests.api.IntegrationTest
;
import
static
jadx
.
tests
.
api
.
utils
.
assertj
.
JadxAssertions
.
assertThat
;
import
static
org
.
assertj
.
core
.
api
.
Assertions
.
fail
;
/**
* Issue #977
*/
public
class
TestArrayForEach3
extends
IntegrationTest
{
public
static
class
TestCls
{
public
void
test
(
String
[]
arr
)
{
for
(
String
s
:
arr
)
{
if
(
s
.
length
()
>
0
)
{
return
;
}
}
throw
new
IllegalArgumentException
(
"All strings are empty"
);
}
public
void
check
()
{
test
(
new
String
[]
{
""
,
"a"
});
// no exception
try
{
test
(
new
String
[]
{
""
,
""
});
fail
(
"IllegalArgumentException expected"
);
}
catch
(
IllegalArgumentException
e
)
{
// expected
}
}
}
@Test
public
void
test
()
{
noDebugInfo
();
assertThat
(
getClassNode
(
TestCls
.
class
))
.
code
()
.
doesNotContain
(
"while"
)
.
containsOne
(
"for (String str : strArr) {"
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录