Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
ql04210214
jadx
提交
2383c401
J
jadx
项目概览
ql04210214
/
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,体验更适合开发者的 AI 搜索 >>
提交
2383c401
编写于
5月 15, 2019
作者:
S
Skylot
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix: correct arg replace in PHI instruction (#462)
上级
305cf537
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
69 addition
and
37 deletion
+69
-37
jadx-core/src/main/java/jadx/core/dex/instructions/PhiInsn.java
...ore/src/main/java/jadx/core/dex/instructions/PhiInsn.java
+46
-26
jadx-core/src/main/java/jadx/core/dex/nodes/InsnNode.java
jadx-core/src/main/java/jadx/core/dex/nodes/InsnNode.java
+18
-4
jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeInferenceVisitor.java
...core/dex/visitors/typeinference/TypeInferenceVisitor.java
+5
-4
jadx-core/src/main/java/jadx/core/utils/DebugUtils.java
jadx-core/src/main/java/jadx/core/utils/DebugUtils.java
+0
-3
未找到文件。
jadx-core/src/main/java/jadx/core/dex/instructions/PhiInsn.java
浏览文件 @
2383c401
package
jadx.core.dex.instructions
;
import
java.util.
LinkedHashMap
;
import
java.util.
Map
;
import
java.util.
ArrayList
;
import
java.util.
List
;
import
org.jetbrains.annotations.NotNull
;
import
org.jetbrains.annotations.Nullable
;
import
jadx.core.dex.attributes.AFlag
;
import
jadx.core.dex.instructions.args.ArgType
;
...
...
@@ -17,11 +18,12 @@ import jadx.core.utils.exceptions.JadxRuntimeException;
public
final
class
PhiInsn
extends
InsnNode
{
private
final
Map
<
RegisterArg
,
BlockNode
>
blockBinds
;
// map arguments to blocks (in same order as in arguments list)
private
final
List
<
BlockNode
>
blockBinds
;
public
PhiInsn
(
int
regNum
,
int
predecessors
)
{
super
(
InsnType
.
PHI
,
predecessors
);
this
.
blockBinds
=
new
LinkedHashMap
<>(
predecessors
);
this
.
blockBinds
=
new
ArrayList
<>(
predecessors
);
setResult
(
InsnArg
.
reg
(
regNum
,
ArgType
.
UNKNOWN
));
add
(
AFlag
.
DONT_INLINE
);
add
(
AFlag
.
DONT_GENERATE
);
...
...
@@ -34,19 +36,24 @@ public final class PhiInsn extends InsnNode {
}
public
void
bindArg
(
RegisterArg
arg
,
BlockNode
pred
)
{
if
(
blockBinds
.
contains
Value
(
pred
))
{
if
(
blockBinds
.
contains
(
pred
))
{
throw
new
JadxRuntimeException
(
"Duplicate predecessors in PHI insn: "
+
pred
+
", "
+
this
);
}
addArg
(
arg
);
blockBinds
.
put
(
arg
,
pred
);
super
.
addArg
(
arg
);
blockBinds
.
add
(
pred
);
}
@Nullable
public
BlockNode
getBlockByArg
(
RegisterArg
arg
)
{
return
blockBinds
.
get
(
arg
);
int
index
=
getArgIndex
(
arg
);
if
(
index
==
-
1
)
{
return
null
;
}
return
blockBinds
.
get
(
index
);
}
public
Map
<
RegisterArg
,
BlockNode
>
getBlockBinds
(
)
{
return
blockBinds
;
public
BlockNode
getBlockByArgIndex
(
int
argIndex
)
{
return
blockBinds
.
get
(
argIndex
)
;
}
@Override
...
...
@@ -57,17 +64,20 @@ public final class PhiInsn extends InsnNode {
@Override
public
boolean
removeArg
(
InsnArg
arg
)
{
if
(!(
arg
instanceof
RegisterArg
))
{
int
index
=
getArgIndex
(
arg
);
if
(
index
==
-
1
)
{
return
false
;
}
RegisterArg
reg
=
(
RegisterArg
)
arg
;
if
(
super
.
removeArg
(
reg
))
{
blockBinds
.
remove
(
reg
);
reg
.
getSVar
().
removeUse
(
reg
);
InsnRemover
.
fixUsedInPhiFlag
(
reg
);
return
true
;
}
return
false
;
removeArg
(
index
);
return
true
;
}
@Override
protected
RegisterArg
removeArg
(
int
index
)
{
RegisterArg
reg
=
(
RegisterArg
)
super
.
removeArg
(
index
);
blockBinds
.
remove
(
index
);
InsnRemover
.
fixUsedInPhiFlag
(
reg
);
return
reg
;
}
@Override
...
...
@@ -75,21 +85,31 @@ public final class PhiInsn extends InsnNode {
if
(!(
from
instanceof
RegisterArg
)
||
!(
to
instanceof
RegisterArg
))
{
return
false
;
}
BlockNode
pred
=
getBlockByArg
((
RegisterArg
)
from
);
int
argIndex
=
getArgIndex
(
from
);
if
(
argIndex
==
-
1
)
{
return
false
;
}
BlockNode
pred
=
getBlockByArgIndex
(
argIndex
);
if
(
pred
==
null
)
{
throw
new
JadxRuntimeException
(
"Unknown predecessor block by arg "
+
from
+
" in PHI: "
+
this
);
}
if
(
removeArg
(
from
))
{
RegisterArg
reg
=
(
RegisterArg
)
to
;
bindArg
(
reg
,
pred
)
;
reg
.
getSVar
().
setUsedInPhi
(
this
);
}
removeArg
(
argIndex
);
RegisterArg
reg
=
(
RegisterArg
)
to
;
bindArg
(
reg
,
pred
);
reg
.
getSVar
().
setUsedInPhi
(
this
);
return
true
;
}
@Override
public
void
addArg
(
InsnArg
arg
)
{
throw
new
JadxRuntimeException
(
"Direct addArg is forbidden for PHI insn, bindArg must be used"
);
}
@Override
public
void
setArg
(
int
n
,
InsnArg
arg
)
{
throw
new
JadxRuntimeException
(
"
Unsupported operation for PHI node
"
);
throw
new
JadxRuntimeException
(
"
Direct setArg is forbidden for PHI insn, bindArg must be used
"
);
}
@Override
...
...
jadx-core/src/main/java/jadx/core/dex/nodes/InsnNode.java
浏览文件 @
2383c401
...
...
@@ -139,15 +139,29 @@ public class InsnNode extends LineAttrNode {
}
protected
boolean
removeArg
(
InsnArg
arg
)
{
int
index
=
getArgIndex
(
arg
);
if
(
index
==
-
1
)
{
return
false
;
}
removeArg
(
index
);
return
true
;
}
protected
InsnArg
removeArg
(
int
index
)
{
InsnArg
arg
=
arguments
.
get
(
index
);
arguments
.
remove
(
index
);
InsnRemover
.
unbindArgUsage
(
null
,
arg
);
return
arg
;
}
protected
int
getArgIndex
(
InsnArg
arg
)
{
int
count
=
getArgsCount
();
for
(
int
i
=
0
;
i
<
count
;
i
++)
{
if
(
arg
==
arguments
.
get
(
i
))
{
arguments
.
remove
(
i
);
InsnRemover
.
unbindArgUsage
(
null
,
arg
);
return
true
;
return
i
;
}
}
return
false
;
return
-
1
;
}
protected
void
addReg
(
DecodedInstruction
insn
,
int
i
,
ArgType
type
)
{
...
...
jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeInferenceVisitor.java
浏览文件 @
2383c401
...
...
@@ -3,7 +3,6 @@ package jadx.core.dex.visitors.typeinference;
import
java.util.ArrayList
;
import
java.util.LinkedHashSet
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Objects
;
import
java.util.Optional
;
import
java.util.Set
;
...
...
@@ -318,10 +317,12 @@ public final class TypeInferenceVisitor extends AbstractVisitor {
return
false
;
}
}
for
(
Map
.
Entry
<
RegisterArg
,
BlockNode
>
entry
:
phiInsn
.
getBlockBinds
().
entrySet
())
{
RegisterArg
reg
=
entry
.
getKey
();
int
argsCount
=
phiInsn
.
getArgsCount
();
for
(
int
argIndex
=
0
;
argIndex
<
argsCount
;
argIndex
++)
{
RegisterArg
reg
=
phiInsn
.
getArg
(
argIndex
);
if
(
reg
.
getSVar
()
==
var
)
{
BlockNode
blockNode
=
entry
.
getValue
(
);
BlockNode
blockNode
=
phiInsn
.
getBlockByArgIndex
(
argIndex
);
InsnNode
lastInsn
=
BlockUtils
.
getLastInsn
(
blockNode
);
if
(
lastInsn
!=
null
&&
BlockSplitter
.
makeSeparate
(
lastInsn
.
getType
()))
{
if
(
Consts
.
DEBUG
)
{
...
...
jadx-core/src/main/java/jadx/core/utils/DebugUtils.java
浏览文件 @
2383c401
...
...
@@ -162,9 +162,6 @@ public class DebugUtils {
if
(
insn
.
getType
()
==
InsnType
.
PHI
)
{
PhiInsn
phi
=
(
PhiInsn
)
insn
;
phis
.
add
(
phi
);
if
(
phi
.
getArgsCount
()
!=
phi
.
getBlockBinds
().
size
())
{
throw
new
JadxRuntimeException
(
"Incorrect args and binds in PHI"
);
}
if
(
phi
.
getArgsCount
()
==
0
)
{
throw
new
JadxRuntimeException
(
"No args and binds in PHI"
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录