From 2f301bf15056d1687f59f30911ed6df82be0eb7c Mon Sep 17 00:00:00 2001 From: Skylot Date: Sun, 25 Sep 2022 17:47:53 +0100 Subject: [PATCH] fix: don't mark constructor for inline if anonymous class inline is disabled (#1680) --- .../java/jadx/core/dex/nodes/ClassNode.java | 4 +++- .../dex/visitors/ProcessMethodsForInline.java | 21 +++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java index d6bf2fee..c0465e96 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java @@ -805,7 +805,9 @@ public class ClassNode extends NotificationAttrNode implements ILoadable, ICodeN } public void addCodegenDep(ClassNode dep) { - this.codegenDeps = ListUtils.safeAdd(this.codegenDeps, dep); + if (!codegenDeps.contains(dep)) { + this.codegenDeps = ListUtils.safeAdd(this.codegenDeps, dep); + } } public int getTotalDepsCount() { diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/ProcessMethodsForInline.java b/jadx-core/src/main/java/jadx/core/dex/visitors/ProcessMethodsForInline.java index d0bbde5f..04fd3e22 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/ProcessMethodsForInline.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/ProcessMethodsForInline.java @@ -1,12 +1,12 @@ package jadx.core.dex.visitors; +import jadx.core.Consts; import jadx.core.dex.attributes.AFlag; import jadx.core.dex.info.AccessInfo; import jadx.core.dex.nodes.ClassNode; import jadx.core.dex.nodes.MethodNode; import jadx.core.dex.nodes.RootNode; import jadx.core.dex.visitors.usage.UsageInfoVisitor; -import jadx.core.utils.ListUtils; import jadx.core.utils.exceptions.JadxException; @JadxVisitor( @@ -45,7 +45,14 @@ public class ProcessMethodsForInline extends AbstractVisitor { } AccessInfo accessFlags = mth.getAccessFlags(); boolean isSynthetic = accessFlags.isSynthetic() || mth.getName().contains("$"); - return isSynthetic && (accessFlags.isStatic() || mth.isConstructor()); + return isSynthetic && canInlineMethod(mth, accessFlags); + } + + private static boolean canInlineMethod(MethodNode mth, AccessInfo accessFlags) { + if (accessFlags.isStatic()) { + return true; + } + return mth.isConstructor() && mth.root().getArgs().isInlineAnonymousClasses(); } private static void fixClassDependencies(MethodNode mth) { @@ -54,8 +61,14 @@ public class ProcessMethodsForInline extends AbstractVisitor { // remove possible cross dependency // to force class with inline method to be processed before its usage ClassNode useTopCls = useInMth.getTopParentClass(); - parentClass.setDependencies(ListUtils.safeRemoveAndTrim(parentClass.getDependencies(), useTopCls)); - useTopCls.addCodegenDep(parentClass); + if (useTopCls != parentClass) { + parentClass.removeDependency(useTopCls); + useTopCls.addCodegenDep(parentClass); + if (Consts.DEBUG_USAGE) { + parentClass.addDebugComment("Remove dependency: " + useTopCls + " to inline " + mth); + useTopCls.addDebugComment("Add dependency: " + parentClass + " to inline " + mth); + } + } } } } -- GitLab