From 58e82681262ea19218a79f92fac8d35e7663b058 Mon Sep 17 00:00:00 2001 From: Skylot <118523+skylot@users.noreply.github.com> Date: Sun, 4 Aug 2024 22:46:46 +0100 Subject: [PATCH] fix: workaround to make method inline deterministic (#1089) --- .../src/main/java/jadx/core/ProcessClass.java | 16 ++++++++++++++++ .../jadx/core/dex/visitors/InlineMethods.java | 13 +++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/ProcessClass.java b/jadx-core/src/main/java/jadx/core/ProcessClass.java index 2d042e9d5..74d781ea5 100644 --- a/jadx-core/src/main/java/jadx/core/ProcessClass.java +++ b/jadx-core/src/main/java/jadx/core/ProcessClass.java @@ -125,6 +125,22 @@ public class ProcessClass { } } + /** + * Load and process class without its deps + */ + public void forceProcess(ClassNode cls) { + ClassNode topParentClass = cls.getTopParentClass(); + if (topParentClass != cls) { + forceProcess(topParentClass); + return; + } + try { + process(cls, false); + } catch (Throwable e) { + throw new JadxRuntimeException("Failed to process class: " + cls.getFullName(), e); + } + } + public void initPasses(RootNode root) { for (IDexTreeVisitor pass : passes) { try { diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/InlineMethods.java b/jadx-core/src/main/java/jadx/core/dex/visitors/InlineMethods.java index f87d8684e..64c8d7fe9 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/InlineMethods.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/InlineMethods.java @@ -59,12 +59,17 @@ public class InlineMethods extends AbstractVisitor { } MethodNode callMth = (MethodNode) callMthDetails; try { - // TODO: sort inner classes process order by dependencies! MethodInlineAttr mia = MarkMethodsForInline.process(callMth); if (mia == null) { - // method not yet loaded => will retry at codegen stage - callMth.getParentClass().reloadAtCodegenStage(); - return; + // method is not yet loaded => force process + mth.addDebugComment("Class process forced to load method for inline: " + callMth); + mth.root().getProcessClasses().forceProcess(callMth.getParentClass()); + // run check again + mia = MarkMethodsForInline.process(callMth); + if (mia == null) { + mth.addWarnComment("Failed to check method for inline after forced process" + callMth); + return; + } } if (mia.notNeeded()) { return;