Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
qq_39073359
jadx
提交
1b98be0b
J
jadx
项目概览
qq_39073359
/
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,发现更多精彩内容 >>
提交
1b98be0b
编写于
2月 17, 2015
作者:
S
Skylot
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
core: fix array type for new-array instruction (fix #50)
上级
e5b84d94
变更
8
显示空白变更内容
内联
并排
Showing
8 changed file
with
95 addition
and
11 deletion
+95
-11
jadx-core/src/main/java/jadx/core/codegen/InsnGen.java
jadx-core/src/main/java/jadx/core/codegen/InsnGen.java
+2
-1
jadx-core/src/main/java/jadx/core/dex/instructions/FilledNewArrayNode.java
...n/java/jadx/core/dex/instructions/FilledNewArrayNode.java
+3
-1
jadx-core/src/main/java/jadx/core/dex/instructions/InsnDecoder.java
...src/main/java/jadx/core/dex/instructions/InsnDecoder.java
+3
-2
jadx-core/src/main/java/jadx/core/dex/instructions/NewArrayNode.java
...rc/main/java/jadx/core/dex/instructions/NewArrayNode.java
+41
-0
jadx-core/src/main/java/jadx/core/dex/visitors/ConstInlinerVisitor.java
...main/java/jadx/core/dex/visitors/ConstInlinerVisitor.java
+3
-1
jadx-core/src/main/java/jadx/core/dex/visitors/ModVisitor.java
...core/src/main/java/jadx/core/dex/visitors/ModVisitor.java
+3
-1
jadx-core/src/main/java/jadx/core/dex/visitors/ReSugarCode.java
...ore/src/main/java/jadx/core/dex/visitors/ReSugarCode.java
+8
-5
jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrays3.java
.../test/java/jadx/tests/integration/arrays/TestArrays3.java
+32
-0
未找到文件。
jadx-core/src/main/java/jadx/core/codegen/InsnGen.java
浏览文件 @
1b98be0b
...
...
@@ -20,6 +20,7 @@ import jadx.core.dex.instructions.IndexInsnNode;
import
jadx.core.dex.instructions.InsnType
;
import
jadx.core.dex.instructions.InvokeNode
;
import
jadx.core.dex.instructions.InvokeType
;
import
jadx.core.dex.instructions.NewArrayNode
;
import
jadx.core.dex.instructions.SwitchNode
;
import
jadx.core.dex.instructions.args.ArgType
;
import
jadx.core.dex.instructions.args.FieldArg
;
...
...
@@ -341,7 +342,7 @@ public class InsnGen {
break
;
case
NEW_ARRAY:
{
ArgType
arrayType
=
insn
.
getResult
().
get
Type
();
ArgType
arrayType
=
((
NewArrayNode
)
insn
).
getArray
Type
();
code
.
add
(
"new "
);
useType
(
code
,
arrayType
.
getArrayRootElement
());
code
.
add
(
'['
);
...
...
jadx-core/src/main/java/jadx/core/dex/instructions/FilledNewArrayNode.java
浏览文件 @
1b98be0b
...
...
@@ -3,11 +3,13 @@ package jadx.core.dex.instructions;
import
jadx.core.dex.instructions.args.ArgType
;
import
jadx.core.dex.nodes.InsnNode
;
import
org.jetbrains.annotations.NotNull
;
public
class
FilledNewArrayNode
extends
InsnNode
{
private
final
ArgType
elemType
;
public
FilledNewArrayNode
(
ArgType
elemType
,
int
size
)
{
public
FilledNewArrayNode
(
@NotNull
ArgType
elemType
,
int
size
)
{
super
(
InsnType
.
FILLED_NEW_ARRAY
,
size
);
this
.
elemType
=
elemType
;
}
...
...
jadx-core/src/main/java/jadx/core/dex/instructions/InsnDecoder.java
浏览文件 @
1b98be0b
...
...
@@ -535,8 +535,9 @@ public class InsnDecoder {
InsnArg
.
reg
(
insn
,
0
,
dex
.
getType
(
insn
.
getIndex
())));
case
Opcodes
.
NEW_ARRAY
:
return
insn
(
InsnType
.
NEW_ARRAY
,
InsnArg
.
reg
(
insn
,
0
,
dex
.
getType
(
insn
.
getIndex
())),
ArgType
arrType
=
dex
.
getType
(
insn
.
getIndex
());
return
new
NewArrayNode
(
arrType
,
InsnArg
.
reg
(
insn
,
0
,
arrType
),
InsnArg
.
reg
(
insn
,
1
,
ArgType
.
INT
));
case
Opcodes
.
FILL_ARRAY_DATA
:
...
...
jadx-core/src/main/java/jadx/core/dex/instructions/NewArrayNode.java
0 → 100644
浏览文件 @
1b98be0b
package
jadx.core.dex.instructions
;
import
jadx.core.dex.instructions.args.ArgType
;
import
jadx.core.dex.instructions.args.InsnArg
;
import
jadx.core.dex.instructions.args.RegisterArg
;
import
jadx.core.dex.nodes.InsnNode
;
import
org.jetbrains.annotations.NotNull
;
public
class
NewArrayNode
extends
InsnNode
{
private
final
ArgType
arrType
;
public
NewArrayNode
(
@NotNull
ArgType
arrType
,
RegisterArg
res
,
InsnArg
size
)
{
super
(
InsnType
.
NEW_ARRAY
,
1
);
this
.
arrType
=
arrType
;
setResult
(
res
);
addArg
(
size
);
}
public
ArgType
getArrayType
()
{
return
arrType
;
}
@Override
public
boolean
isSame
(
InsnNode
obj
)
{
if
(
this
==
obj
)
{
return
true
;
}
if
(!(
obj
instanceof
NewArrayNode
)
||
!
super
.
isSame
(
obj
))
{
return
false
;
}
NewArrayNode
other
=
(
NewArrayNode
)
obj
;
return
arrType
==
other
.
arrType
;
}
@Override
public
String
toString
()
{
return
super
.
toString
()
+
" type: "
+
arrType
;
}
}
jadx-core/src/main/java/jadx/core/dex/visitors/ConstInlinerVisitor.java
浏览文件 @
1b98be0b
...
...
@@ -222,7 +222,9 @@ public class ConstInlinerVisitor extends AbstractVisitor {
break
;
case
NEW_ARRAY:
if
(
litArg
==
insn
.
getArg
(
0
))
{
litArg
.
merge
(
ArgType
.
INT
);
}
break
;
default
:
...
...
jadx-core/src/main/java/jadx/core/dex/visitors/ModVisitor.java
浏览文件 @
1b98be0b
...
...
@@ -12,6 +12,7 @@ import jadx.core.dex.instructions.FilledNewArrayNode;
import
jadx.core.dex.instructions.IndexInsnNode
;
import
jadx.core.dex.instructions.InsnType
;
import
jadx.core.dex.instructions.InvokeNode
;
import
jadx.core.dex.instructions.NewArrayNode
;
import
jadx.core.dex.instructions.SwitchNode
;
import
jadx.core.dex.instructions.args.ArgType
;
import
jadx.core.dex.instructions.args.InsnArg
;
...
...
@@ -108,7 +109,8 @@ public class ModVisitor extends AbstractVisitor {
InsnNode
ni
=
block
.
getInstructions
().
get
(
next
);
if
(
ni
.
getType
()
==
InsnType
.
FILL_ARRAY
)
{
ni
.
getResult
().
merge
(
insn
.
getResult
());
((
FillArrayNode
)
ni
).
mergeElementType
(
insn
.
getResult
().
getType
().
getArrayElement
());
ArgType
arrType
=
((
NewArrayNode
)
insn
).
getArrayType
();
((
FillArrayNode
)
ni
).
mergeElementType
(
arrType
.
getArrayElement
());
remover
.
add
(
insn
);
}
}
...
...
jadx-core/src/main/java/jadx/core/dex/visitors/ReSugarCode.java
浏览文件 @
1b98be0b
...
...
@@ -9,6 +9,7 @@ import jadx.core.dex.instructions.FilledNewArrayNode;
import
jadx.core.dex.instructions.IndexInsnNode
;
import
jadx.core.dex.instructions.InsnType
;
import
jadx.core.dex.instructions.InvokeNode
;
import
jadx.core.dex.instructions.NewArrayNode
;
import
jadx.core.dex.instructions.SwitchNode
;
import
jadx.core.dex.instructions.args.ArgType
;
import
jadx.core.dex.instructions.args.InsnArg
;
...
...
@@ -70,19 +71,21 @@ public class ReSugarCode extends AbstractVisitor {
*/
private
static
InsnNode
processNewArray
(
MethodNode
mth
,
List
<
InsnNode
>
instructions
,
int
i
,
InstructionRemover
remover
)
{
InsnNode
insn
=
instructions
.
get
(
i
);
InsnArg
arg
=
i
nsn
.
getArg
(
0
);
NewArrayNode
newArrayInsn
=
(
NewArrayNode
)
instructions
.
get
(
i
);
InsnArg
arg
=
newArrayI
nsn
.
getArg
(
0
);
if
(!
arg
.
isLiteral
())
{
return
null
;
}
int
len
=
(
int
)
((
LiteralArg
)
arg
).
getLiteral
();
int
size
=
instructions
.
size
();
if
(
len
<=
0
||
i
+
len
>=
size
||
instructions
.
get
(
i
+
len
).
getType
()
!=
InsnType
.
APUT
)
{
if
(
len
<=
0
||
i
+
len
>=
size
||
instructions
.
get
(
i
+
len
).
getType
()
!=
InsnType
.
APUT
)
{
return
null
;
}
ArgType
arrType
=
insn
.
getResult
().
get
Type
();
ArgType
arrType
=
newArrayInsn
.
getArray
Type
();
InsnNode
filledArr
=
new
FilledNewArrayNode
(
arrType
.
getArrayElement
(),
len
);
filledArr
.
setResult
(
i
nsn
.
getResult
());
filledArr
.
setResult
(
newArrayI
nsn
.
getResult
());
for
(
int
j
=
0
;
j
<
len
;
j
++)
{
InsnNode
put
=
instructions
.
get
(
i
+
1
+
j
);
if
(
put
.
getType
()
!=
InsnType
.
APUT
)
{
...
...
jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrays3.java
0 → 100644
浏览文件 @
1b98be0b
package
jadx.tests.integration.arrays
;
import
jadx.core.dex.nodes.ClassNode
;
import
jadx.tests.api.IntegrationTest
;
import
org.junit.Test
;
import
static
jadx
.
tests
.
api
.
utils
.
JadxMatchers
.
containsOne
;
import
static
org
.
hamcrest
.
CoreMatchers
.
instanceOf
;
import
static
org
.
junit
.
Assert
.
assertThat
;
public
class
TestArrays3
extends
IntegrationTest
{
public
static
class
TestCls
{
private
Object
test
(
byte
[]
bArr
)
{
return
new
Object
[]{
bArr
};
}
public
void
check
()
{
assertThat
(
test
(
new
byte
[]{
1
,
2
}),
instanceOf
(
Object
[].
class
));
}
}
@Test
public
void
test
()
{
noDebugInfo
();
ClassNode
cls
=
getClassNode
(
TestCls
.
class
);
String
code
=
cls
.
getCode
().
toString
();
assertThat
(
code
,
containsOne
(
"return new Object[]{bArr};"
));
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录