diff --git a/jadx-core/src/main/java/jadx/api/JadxDecompiler.java b/jadx-core/src/main/java/jadx/api/JadxDecompiler.java index 5382b02e0..b16481e8d 100644 --- a/jadx-core/src/main/java/jadx/api/JadxDecompiler.java +++ b/jadx-core/src/main/java/jadx/api/JadxDecompiler.java @@ -66,9 +66,9 @@ public final class JadxDecompiler { private BinaryXMLParser xmlParser; - private Map classesMap = new HashMap(); - private Map methodsMap = new HashMap(); - private Map fieldsMap = new HashMap(); + private Map classesMap = new java.util.concurrent.ConcurrentHashMap(); + private Map methodsMap = new java.util.concurrent.ConcurrentHashMap(); + private Map fieldsMap = new java.util.concurrent.ConcurrentHashMap(); public JadxDecompiler() { this(new JadxArgs()); diff --git a/jadx-core/src/main/java/jadx/core/clsp/ClspGraph.java b/jadx-core/src/main/java/jadx/core/clsp/ClspGraph.java index 2f78059c8..674250fde 100644 --- a/jadx-core/src/main/java/jadx/core/clsp/ClspGraph.java +++ b/jadx-core/src/main/java/jadx/core/clsp/ClspGraph.java @@ -23,7 +23,7 @@ import org.slf4j.LoggerFactory; public class ClspGraph { private static final Logger LOG = LoggerFactory.getLogger(ClspGraph.class); - private final Map> ancestorCache = new WeakHashMap>(); + private final Map> ancestorCache = Collections.synchronizedMap(new WeakHashMap>()); private Map nameMap; private final Set missingClasses = new HashSet(); diff --git a/jadx-core/src/main/java/jadx/core/utils/BlockUtils.java b/jadx-core/src/main/java/jadx/core/utils/BlockUtils.java index aecd7d51d..d5b5bafa8 100644 --- a/jadx-core/src/main/java/jadx/core/utils/BlockUtils.java +++ b/jadx-core/src/main/java/jadx/core/utils/BlockUtils.java @@ -453,15 +453,18 @@ public class BlockUtils { */ public static List collectBlocksDominatedBy(BlockNode dominator, BlockNode start) { List result = new ArrayList(); - collectWhileDominates(dominator, start, result); + HashSet visited = new HashSet(); + collectWhileDominates(dominator, start, result, visited); return result; } - private static void collectWhileDominates(BlockNode dominator, BlockNode child, List result) { + private static void collectWhileDominates(BlockNode dominator, BlockNode child, List result, HashSet visited) { + if (visited.contains(child)) return; + visited.add(child); for (BlockNode node : child.getCleanSuccessors()) { if (node.isDominator(dominator)) { result.add(node); - collectWhileDominates(dominator, node, result); + collectWhileDominates(dominator, node, result, visited); } } }