Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Quincy379
jadx
提交
aa8fd3c8
J
jadx
项目概览
Quincy379
/
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 搜索 >>
提交
aa8fd3c8
编写于
10月 02, 2020
作者:
S
Skylot
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix: added another enum restore pattern (#926)
上级
e2b42804
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
234 addition
and
3 deletion
+234
-3
jadx-core/src/main/java/jadx/core/dex/visitors/EnumVisitor.java
...ore/src/main/java/jadx/core/dex/visitors/EnumVisitor.java
+14
-3
jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums8.java
...rc/test/java/jadx/tests/integration/enums/TestEnums8.java
+17
-0
jadx-core/src/test/smali/enums/TestEnums8.smali
jadx-core/src/test/smali/enums/TestEnums8.smali
+203
-0
未找到文件。
jadx-core/src/main/java/jadx/core/dex/visitors/EnumVisitor.java
浏览文件 @
aa8fd3c8
...
...
@@ -167,6 +167,8 @@ public class EnumVisitor extends AbstractVisitor {
InsnRemover
.
removeAllAndUnbind
(
classInitMth
,
staticBlock
,
toRemove
);
if
(
classInitMth
.
countInsns
()
==
0
)
{
classInitMth
.
add
(
AFlag
.
DONT_GENERATE
);
}
else
if
(!
toRemove
.
isEmpty
())
{
CodeShrinkVisitor
.
shrinkMethod
(
classInitMth
);
}
removeEnumMethods
(
cls
,
clsType
,
valuesField
);
return
true
;
...
...
@@ -263,13 +265,14 @@ public class EnumVisitor extends AbstractVisitor {
InsnNode
wrappedInsn
=
((
InsnWrapArg
)
arg
).
getWrapInsn
();
field
=
processEnumFieldByField
(
cls
,
wrappedInsn
,
staticBlock
,
toRemove
);
}
else
if
(
arg
.
isRegister
())
{
field
=
processEnumFiledByRegister
(
cls
,
(
RegisterArg
)
arg
,
toRemove
);
field
=
processEnumFiledByRegister
(
cls
,
(
RegisterArg
)
arg
,
staticBlock
,
toRemove
);
}
if
(
field
==
null
)
{
return
null
;
}
enumFields
.
add
(
field
);
}
toRemove
.
add
(
arrFillInsn
);
return
enumFields
;
}
...
...
@@ -292,13 +295,21 @@ public class EnumVisitor extends AbstractVisitor {
if
(
co
==
null
)
{
return
null
;
}
toRemove
.
add
(
sgetInsn
);
RegisterArg
sgetResult
=
sgetInsn
.
getResult
();
if
(
sgetResult
==
null
||
sgetResult
.
getSVar
().
getUseCount
()
==
1
)
{
toRemove
.
add
(
sgetInsn
);
}
toRemove
.
add
(
sputInsn
);
return
createEnumFieldByConstructor
(
cls
,
enumFieldNode
,
co
);
}
@Nullable
private
EnumField
processEnumFiledByRegister
(
ClassNode
cls
,
RegisterArg
arg
,
List
<
InsnNode
>
toRemove
)
{
private
EnumField
processEnumFiledByRegister
(
ClassNode
cls
,
RegisterArg
arg
,
BlockNode
staticBlock
,
List
<
InsnNode
>
toRemove
)
{
InsnNode
assignInsn
=
arg
.
getAssignInsn
();
if
(
assignInsn
!=
null
&&
assignInsn
.
getType
()
==
InsnType
.
SGET
)
{
return
processEnumFieldByField
(
cls
,
assignInsn
,
staticBlock
,
toRemove
);
}
SSAVar
ssaVar
=
arg
.
getSVar
();
if
(
ssaVar
.
getUseCount
()
==
1
)
{
return
null
;
...
...
jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums8.java
0 → 100644
浏览文件 @
aa8fd3c8
package
jadx.tests.integration.enums
;
import
org.junit.jupiter.api.Test
;
import
jadx.tests.api.SmaliTest
;
import
static
jadx
.
tests
.
api
.
utils
.
assertj
.
JadxAssertions
.
assertThat
;
public
class
TestEnums8
extends
SmaliTest
{
@Test
public
void
test
()
{
assertThat
(
getClassNodeFromSmali
())
.
code
()
.
containsOne
(
"enum TestEnums8"
);
}
}
jadx-core/src/test/smali/enums/TestEnums8.smali
0 → 100644
浏览文件 @
aa8fd3c8
.class public final enum Lenums/TestEnums8;
.super Ljava/lang/Enum;
.source "SourceFile"
# annotations
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/lang/Enum<",
"Lenums/TestEnums8;",
">;"
}
.end annotation
# static fields
.field private static final synthetic $VALUES:[Lenums/TestEnums8;
.field private static final FOR_BITS:[Lenums/TestEnums8;
.field public static final enum H:Lenums/TestEnums8;
.field public static final enum L:Lenums/TestEnums8;
.field public static final enum M:Lenums/TestEnums8;
.field public static final enum Q:Lenums/TestEnums8;
# instance fields
.field private final bits:I
# direct methods
.method static constructor <clinit>()V
.locals 10
.line 28
new-instance v0, Lenums/TestEnums8;
const/4 v1, 0x1
const/4 v2, 0x0
const-string v3, "L"
invoke-direct {v0, v3, v2, v1}, Lenums/TestEnums8;-><init>(Ljava/lang/String;II)V
sput-object v0, Lenums/TestEnums8;->L:Lenums/TestEnums8;
.line 30
new-instance v0, Lenums/TestEnums8;
const-string v3, "M"
invoke-direct {v0, v3, v1, v2}, Lenums/TestEnums8;-><init>(Ljava/lang/String;II)V
sput-object v0, Lenums/TestEnums8;->M:Lenums/TestEnums8;
.line 32
new-instance v0, Lenums/TestEnums8;
const/4 v3, 0x3
const/4 v4, 0x2
const-string v5, "Q"
invoke-direct {v0, v5, v4, v3}, Lenums/TestEnums8;-><init>(Ljava/lang/String;II)V
sput-object v0, Lenums/TestEnums8;->Q:Lenums/TestEnums8;
.line 34
new-instance v0, Lenums/TestEnums8;
const-string v5, "H"
invoke-direct {v0, v5, v3, v4}, Lenums/TestEnums8;-><init>(Ljava/lang/String;II)V
sput-object v0, Lenums/TestEnums8;->H:Lenums/TestEnums8;
const/4 v0, 0x4
new-array v5, v0, [Lenums/TestEnums8;
.line 25
sget-object v6, Lenums/TestEnums8;->L:Lenums/TestEnums8;
aput-object v6, v5, v2
sget-object v7, Lenums/TestEnums8;->M:Lenums/TestEnums8;
aput-object v7, v5, v1
sget-object v8, Lenums/TestEnums8;->Q:Lenums/TestEnums8;
aput-object v8, v5, v4
sget-object v9, Lenums/TestEnums8;->H:Lenums/TestEnums8;
aput-object v9, v5, v3
sput-object v5, Lenums/TestEnums8;->$VALUES:[Lenums/TestEnums8;
new-array v0, v0, [Lenums/TestEnums8;
aput-object v7, v0, v2
aput-object v6, v0, v1
aput-object v9, v0, v4
aput-object v8, v0, v3
.line 36
sput-object v0, Lenums/TestEnums8;->FOR_BITS:[Lenums/TestEnums8;
return-void
.end method
.method private constructor <init>(Ljava/lang/String;II)V
.locals 0
.annotation system Ldalvik/annotation/Signature;
value = {
"(I)V"
}
.end annotation
.line 40
invoke-direct {p0, p1, p2}, Ljava/lang/Enum;-><init>(Ljava/lang/String;I)V
.line 41
iput p3, p0, Lenums/TestEnums8;->bits:I
return-void
.end method
.method public static forBits(I)Lenums/TestEnums8;
.locals 2
if-ltz p0, :cond_0
.line 53
sget-object v0, Lenums/TestEnums8;->FOR_BITS:[Lenums/TestEnums8;
array-length v1, v0
if-ge p0, v1, :cond_0
.line 56
aget-object p0, v0, p0
return-object p0
.line 54
:cond_0
new-instance p0, Ljava/lang/IllegalArgumentException;
invoke-direct {p0}, Ljava/lang/IllegalArgumentException;-><init>()V
throw p0
.end method
.method public static valueOf(Ljava/lang/String;)Lenums/TestEnums8;
.locals 1
.line 25
const-class v0, Lenums/TestEnums8;
invoke-static {v0, p0}, Ljava/lang/Enum;->valueOf(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
move-result-object p0
check-cast p0, Lenums/TestEnums8;
return-object p0
.end method
.method public static values()[Lenums/TestEnums8;
.locals 1
.line 25
sget-object v0, Lenums/TestEnums8;->$VALUES:[Lenums/TestEnums8;
invoke-virtual {v0}, [Lenums/TestEnums8;->clone()Ljava/lang/Object;
move-result-object v0
check-cast v0, [Lenums/TestEnums8;
return-object v0
.end method
# virtual methods
.method public getBits()I
.locals 1
.line 45
iget v0, p0, Lenums/TestEnums8;->bits:I
return v0
.end method
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录