diff --git a/jode/ChangeLog b/jode/ChangeLog index c61b747..07ff754 100644 --- a/jode/ChangeLog +++ b/jode/ChangeLog @@ -1,3 +1,19 @@ +2005-09-13 Jochen Hoenicke + + Added patch from Peter Klauser (klp at users.sf.net), to support + packages with same name as classes in the obfuscator. + + * jode/obfuscator/PackageIdentifier.java.in + (loadedPackages): New field, to store packages in separate map. + (getIdentifier): Renamed to... + (getClassIdentifier): ...this (and return only ClassIdentifier). + (setLoadOnDemand): Use loadedPackages. + (loadClass): Likewise. + (loadMatchingClass): Likewise. + (readTable): Likewise. + (getChilds): Likewise. + (contains): Likewise. + 2003-06-11 Jochen Hoenicke Added patch from Thomas Oldervoll, to continue decompiling diff --git a/jode/jode/obfuscator/ClassBundle.java.in b/jode/jode/obfuscator/ClassBundle.java.in index 90493d9..8c4721a 100644 --- a/jode/jode/obfuscator/ClassBundle.java.in +++ b/jode/jode/obfuscator/ClassBundle.java.in @@ -300,7 +300,7 @@ public class ClassBundle implements OptionHandler { if (clazzCache.containsKey(name)) return (ClassIdentifier) clazzCache.get(name); ClassIdentifier ident - = (ClassIdentifier) basePackage.getIdentifier(name); + = (ClassIdentifier) basePackage.getClassIdentifier(name); clazzCache.put(name, ident); return ident; } diff --git a/jode/jode/obfuscator/PackageIdentifier.java.in b/jode/jode/obfuscator/PackageIdentifier.java.in index bbf0fcc..b6bd8a3 100644 --- a/jode/jode/obfuscator/PackageIdentifier.java.in +++ b/jode/jode/obfuscator/PackageIdentifier.java.in @@ -45,6 +45,7 @@ public class PackageIdentifier extends Identifier { boolean loadOnDemand; Map loadedClasses; + Map loadedPackages; List swappedClasses; public PackageIdentifier(ClassBundle bundle, @@ -56,6 +57,7 @@ public class PackageIdentifier extends Identifier { this.fullName = fullName; this.name = name; this.loadedClasses = new HashMap(); + this.loadedPackages = new HashMap(); } /** @@ -79,17 +81,18 @@ public class PackageIdentifier extends Identifier { ClassInfo.getClassesAndPackages(getFullName()); while (enum.hasMoreElements()) { String subclazz = ((String)enum.nextElement()).intern(); - if (loadedClasses.containsKey(subclazz)) - continue; String subFull = (fullNamePrefix + subclazz).intern(); - - if (ClassInfo.isPackage(subFull)) { + + if (ClassInfo.isPackage(subFull) + && !loadedPackages.containsKey(subclazz)) { PackageIdentifier ident = new PackageIdentifier (bundle, this, subFull, subclazz); - loadedClasses.put(subclazz, ident); + loadedPackages.put(subclazz, ident); swappedClasses = null; ident.setLoadOnDemand(); - } else { + } + if (ClassInfo.exists(subFull) + && !loadedClasses.containsKey(subclazz)) { ClassIdentifier ident = new ClassIdentifier (this, subFull, subclazz, ClassInfo.forName(subFull)); @@ -107,40 +110,43 @@ public class PackageIdentifier extends Identifier { } } - public Identifier getIdentifier(String name) { + public ClassIdentifier getClassIdentifier(String name) { if (loadOnDemand) { - Identifier ident = loadClass(name); + ClassIdentifier ident = loadClass(name); return ident; } int index = name.indexOf('.'); if (index == -1) - return (Identifier) loadedClasses.get(name); + return (ClassIdentifier) loadedClasses.get(name); else { PackageIdentifier pack = (PackageIdentifier) - loadedClasses.get(name.substring(0, index)); + loadedPackages.get(name.substring(0, index)); if (pack != null) - return pack.getIdentifier(name.substring(index+1)); + return pack.getClassIdentifier(name.substring(index+1)); else return null; } } - public Identifier loadClass(String name) { + public ClassIdentifier loadClass(String name) { int index = name.indexOf('.'); if (index == -1) { - Identifier ident = (Identifier) loadedClasses.get(name); + ClassIdentifier ident = (Identifier) loadedClasses.get(name); if (ident == null) { String subFull = (fullName.length() > 0) ? fullName + "."+ name : name; subFull = subFull.intern(); - if (ClassInfo.isPackage(subFull)) { + + /* may be a package to load with the same name as class */ + if (ClassInfo.isPackage(subFull) + && !loadedPackages.containsKey(name)) { PackageIdentifier pack = new PackageIdentifier(bundle, this, subFull, name); - loadedClasses.put(name, pack); + loadedPackages.put(name, pack); swappedClasses = null; pack.setLoadOnDemand(); - ident = pack; - } else if (!ClassInfo.exists(subFull)) { + } + if (!ClassInfo.exists(subFull)) { GlobalOptions.err.println("Warning: Can't find class " + subFull); Thread.dumpStack(); @@ -157,7 +163,7 @@ public class PackageIdentifier extends Identifier { } else { String subpack = name.substring(0, index); PackageIdentifier pack = - (PackageIdentifier) loadedClasses.get(subpack); + (PackageIdentifier) loadedPackages.get(subpack); if (pack == null) { String subFull = (fullName.length() > 0) ? fullName + "."+ subpack : subpack; @@ -165,7 +171,7 @@ public class PackageIdentifier extends Identifier { if (ClassInfo.isPackage(subFull)) { pack = new PackageIdentifier(bundle, this, subFull, subpack); - loadedClasses.put(subpack, pack); + loadedPackages.put(subpack, pack); swappedClasses = null; if (loadOnDemand) pack.setLoadOnDemand(); @@ -182,45 +188,45 @@ public class PackageIdentifier extends Identifier { public void loadMatchingClasses(IdentifierMatcher matcher) { String component = matcher.getNextComponent(this); if (component != null) { - Identifier ident = (Identifier) loadedClasses.get(component); - if (ident == null) { - component = component.intern(); - String subFull = (fullName.length() > 0) - ? fullName + "."+ component : component; - subFull = subFull.intern(); - if (ClassInfo.isPackage(subFull)) { - ident = new PackageIdentifier(bundle, this, - subFull, component); + component = component.intern(); + String subFull = (fullName.length() > 0) + ? fullName + "."+ component : component; + subFull = subFull.intern(); + if (loadedClasses.get(component) == null + && ClassInfo.exists(subFull)) { + if (GlobalOptions.verboseLevel > 1) + GlobalOptions.err.println("loading Class " +subFull); + ClassIdentifier ident = + new ClassIdentifier(this, subFull, component, + ClassInfo.forName(subFull)); + if (loadOnDemand || matcher.matches(ident)) { loadedClasses.put(component, ident); swappedClasses = null; - if (loadOnDemand) - ((PackageIdentifier) ident).setLoadOnDemand(); - } else if (ClassInfo.exists(subFull)) { - if (GlobalOptions.verboseLevel > 1) - GlobalOptions.err.println("loading Class " +subFull); - ident = new ClassIdentifier(this, subFull, component, - ClassInfo.forName(subFull)); - if (loadOnDemand || matcher.matches(ident)) { - loadedClasses.put(component, ident); - swappedClasses = null; - bundle.addClassIdentifier(ident); - ((ClassIdentifier) ident).initClass(); - } - } else { - GlobalOptions.err.println - ("Warning: Can't find class/package " + subFull); + bundle.addClassIdentifier(ident); + ident.initClass(); } } - if (ident instanceof PackageIdentifier) { - if (matcher.matches(ident)) { + /* can be a package AND a class with the same name */ + PackageIdentifier pkgIdent = + (PackageIdentifier) loadedPackages.get(component); + if (pkgIdent == null && ClassInfo.isPackage(subFull)) { + pkgIdent = new PackageIdentifier(bundle, this, + subFull, component); + loadedPackages.put(component, pkgIdent); + swappedClasses = null; + if (loadOnDemand) + pkgIdent.setLoadOnDemand(); + } + if (pkgIdent != null) { + if (matcher.matches(pkgIdent)) { if (GlobalOptions.verboseLevel > 0) GlobalOptions.err.println("loading Package " - +ident.getFullName()); - ((PackageIdentifier) ident).setLoadOnDemand(); + +pkgIdent.getFullName()); + pkgIdent.setLoadOnDemand(); } - if (matcher.matchesSub(ident, null)) - ((PackageIdentifier) ident).loadMatchingClasses(matcher); + if (matcher.matchesSub(pkgIdent, null)) + pkgIdent.loadMatchingClasses(matcher); } } else { String fullNamePrefix = @@ -230,22 +236,24 @@ public class PackageIdentifier extends Identifier { ClassInfo.getClassesAndPackages(getFullName()); while (enum.hasMoreElements()) { String subclazz = ((String)enum.nextElement()).intern(); - if (loadedClasses.containsKey(subclazz)) - continue; String subFull = (fullNamePrefix + subclazz).intern(); if (matcher.matchesSub(this, subclazz)) { - if (ClassInfo.isPackage(subFull)) { + if (ClassInfo.isPackage(subFull) + && !loadedPackages.containsKey(subclazz)) { if (GlobalOptions.verboseLevel > 0) GlobalOptions.err.println("loading Package " + subFull); PackageIdentifier ident = new PackageIdentifier (bundle, this, subFull, subclazz); - loadedClasses.put(subclazz, ident); + loadedPackages.put(subclazz, ident); swappedClasses = null; if (loadOnDemand || matcher.matches(ident)) ident.setLoadOnDemand(); - } else { + } + + if (ClassInfo.exists(subFull) + && !loadedClasses.containsKey(subclazz)) { ClassIdentifier ident = new ClassIdentifier (this, subFull, subclazz, ClassInfo.forName(subFull)); @@ -263,17 +271,15 @@ public class PackageIdentifier extends Identifier { } } List list = new ArrayList(); - list.addAll(loadedClasses.values()); + list.addAll(loadedPackages.values()); for (Iterator i = list.iterator(); i.hasNext(); ) { - Identifier ident = (Identifier) i.next(); - if (ident instanceof PackageIdentifier) { - if (matcher.matches(ident)) - ((PackageIdentifier) ident).setLoadOnDemand(); - - if (matcher.matchesSub(ident, null)) - ((PackageIdentifier) ident) - .loadMatchingClasses(matcher); - } + PackageIdentifier ident = (PackageIdentifier) i.next(); + if (matcher.matches(ident)) + ((PackageIdentifier) ident).setLoadOnDemand(); + + if (matcher.matchesSub(ident, null)) + ((PackageIdentifier) ident) + .loadMatchingClasses(matcher); } } } @@ -332,6 +338,12 @@ public class PackageIdentifier extends Identifier { || ident.isReachable()) ident.readTable(table); } + for (Iterator i = loadedPackages.values().iterator(); i.hasNext(); ) { + Identifier ident = (Identifier) i.next(); + if ((Main.stripping & Main.STRIP_UNREACH) == 0 + || ident.isReachable()) + ident.readTable(table); + } } public Identifier getParent() { @@ -352,7 +364,8 @@ public class PackageIdentifier extends Identifier { * even parts of the names. */ if (swappedClasses == null) { - swappedClasses = Arrays.asList(loadedClasses.values().toArray()); + swappedClasses = new ArrayList(loadedClasses.values()); + swappedClasses.addAll(loadedPackages.values()); Collections.shuffle(swappedClasses, Main.rand); } return swappedClasses.iterator(); @@ -439,16 +452,19 @@ public class PackageIdentifier extends Identifier { public boolean contains(String newAlias, Identifier except) { for (Iterator i = loadedClasses.values().iterator(); i.hasNext(); ) { - Identifier ident = (Identifier)i.next(); + ClassIdentifier ident = (ClassIdentifier)i.next(); if (ident != except) { if (((Main.stripping & Main.STRIP_UNREACH) == 0 || ident.isReachable()) && ident.getAlias().equalsIgnoreCase(newAlias)) return true; - if (ident instanceof PackageIdentifier - && ident.getAlias().length() == 0 - && (((PackageIdentifier) ident) - .contains(newAlias, this))) + } + } + for (Iterator i = loadedPackages.values().iterator(); i.hasNext(); ) { + PackageIdentifier ident = (PackageIdentifier)i.next(); + if (ident != except) { + if (ident.getAlias().length() == 0 + && ident.contains(newAlias, this)) return true; } }