From 6fc32629c25d351119395922a6eb6701f09dffa4 Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Tue, 30 Apr 2013 21:52:18 -0700 Subject: [PATCH] Look up ClassDefs in ClassPath using a hashmap --- .../org/jf/dexlib2/analysis/ClassPath.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java index 3b9002cd..0775032f 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java @@ -55,6 +55,7 @@ public class ClassPath { @Nonnull private final TypeProto unknownClass; @Nonnull private DexFile[] dexFiles; @Nonnull private HashMap loadedClasses = Maps.newHashMap(); + @Nonnull private HashMap availableClasses = Maps.newHashMap(); /** * Creates a new ClassPath instance that can load classes from the given dex files @@ -96,6 +97,15 @@ public class ClassPath { loadPrimitiveType("F"); loadPrimitiveType("D"); loadPrimitiveType("L"); + + for (DexFile dexFile: dexFiles) { + for (ClassDef classDef: dexFile.getClasses()) { + ClassDef prev = availableClasses.get(classDef.getType()); + if (prev == null) { + availableClasses.put(classDef.getType(), classDef); + } + } + } } private void loadPrimitiveType(String type) { @@ -134,15 +144,11 @@ public class ClassPath { @Nonnull public ClassDef getClassDef(String type) { - // TODO: need a <= O(log) way to look up classes - for (DexFile dexFile: dexFiles) { - for (ClassDef classDef: dexFile.getClasses()) { - if (classDef.getType().equals(type)) { - return classDef; - } - } + ClassDef ret = availableClasses.get(type); + if (ret == null) { + throw new UnresolvedClassException("Could not resolve class %s", type); } - throw new UnresolvedClassException("Could not resolve class %s", type); + return ret; } @Nonnull