Added patch from Peter Klauser (klp at users.sf.net), to support

packages with same name as classes in the obfuscator.


git-svn-id: https://svn.code.sf.net/p/jode/code/branches/branch_1_1@1391 379699f6-c40d-0410-875b-85095c16579e
branch_1_1
hoenicke 19 years ago
parent aae07e1491
commit 90aa079d11
  1. 16
      jode/ChangeLog
  2. 2
      jode/jode/obfuscator/ClassBundle.java.in
  3. 158
      jode/jode/obfuscator/PackageIdentifier.java.in

@ -1,3 +1,19 @@
2005-09-13 Jochen Hoenicke <jochen@gnu.org>
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 <jochen@gnu.org> 2003-06-11 Jochen Hoenicke <jochen@gnu.org>
Added patch from Thomas Oldervoll, to continue decompiling Added patch from Thomas Oldervoll, to continue decompiling

@ -300,7 +300,7 @@ public class ClassBundle implements OptionHandler {
if (clazzCache.containsKey(name)) if (clazzCache.containsKey(name))
return (ClassIdentifier) clazzCache.get(name); return (ClassIdentifier) clazzCache.get(name);
ClassIdentifier ident ClassIdentifier ident
= (ClassIdentifier) basePackage.getIdentifier(name); = (ClassIdentifier) basePackage.getClassIdentifier(name);
clazzCache.put(name, ident); clazzCache.put(name, ident);
return ident; return ident;
} }

@ -45,6 +45,7 @@ public class PackageIdentifier extends Identifier {
boolean loadOnDemand; boolean loadOnDemand;
Map loadedClasses; Map loadedClasses;
Map loadedPackages;
List swappedClasses; List swappedClasses;
public PackageIdentifier(ClassBundle bundle, public PackageIdentifier(ClassBundle bundle,
@ -56,6 +57,7 @@ public class PackageIdentifier extends Identifier {
this.fullName = fullName; this.fullName = fullName;
this.name = name; this.name = name;
this.loadedClasses = new HashMap(); this.loadedClasses = new HashMap();
this.loadedPackages = new HashMap();
} }
/** /**
@ -79,17 +81,18 @@ public class PackageIdentifier extends Identifier {
ClassInfo.getClassesAndPackages(getFullName()); ClassInfo.getClassesAndPackages(getFullName());
while (enum.hasMoreElements()) { while (enum.hasMoreElements()) {
String subclazz = ((String)enum.nextElement()).intern(); String subclazz = ((String)enum.nextElement()).intern();
if (loadedClasses.containsKey(subclazz))
continue;
String subFull = (fullNamePrefix + subclazz).intern(); String subFull = (fullNamePrefix + subclazz).intern();
if (ClassInfo.isPackage(subFull)) { if (ClassInfo.isPackage(subFull)
&& !loadedPackages.containsKey(subclazz)) {
PackageIdentifier ident = new PackageIdentifier PackageIdentifier ident = new PackageIdentifier
(bundle, this, subFull, subclazz); (bundle, this, subFull, subclazz);
loadedClasses.put(subclazz, ident); loadedPackages.put(subclazz, ident);
swappedClasses = null; swappedClasses = null;
ident.setLoadOnDemand(); ident.setLoadOnDemand();
} else { }
if (ClassInfo.exists(subFull)
&& !loadedClasses.containsKey(subclazz)) {
ClassIdentifier ident = new ClassIdentifier ClassIdentifier ident = new ClassIdentifier
(this, subFull, subclazz, ClassInfo.forName(subFull)); (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) { if (loadOnDemand) {
Identifier ident = loadClass(name); ClassIdentifier ident = loadClass(name);
return ident; return ident;
} }
int index = name.indexOf('.'); int index = name.indexOf('.');
if (index == -1) if (index == -1)
return (Identifier) loadedClasses.get(name); return (ClassIdentifier) loadedClasses.get(name);
else { else {
PackageIdentifier pack = (PackageIdentifier) PackageIdentifier pack = (PackageIdentifier)
loadedClasses.get(name.substring(0, index)); loadedPackages.get(name.substring(0, index));
if (pack != null) if (pack != null)
return pack.getIdentifier(name.substring(index+1)); return pack.getClassIdentifier(name.substring(index+1));
else else
return null; return null;
} }
} }
public Identifier loadClass(String name) { public ClassIdentifier loadClass(String name) {
int index = name.indexOf('.'); int index = name.indexOf('.');
if (index == -1) { if (index == -1) {
Identifier ident = (Identifier) loadedClasses.get(name); ClassIdentifier ident = (Identifier) loadedClasses.get(name);
if (ident == null) { if (ident == null) {
String subFull = String subFull =
(fullName.length() > 0) ? fullName + "."+ name : name; (fullName.length() > 0) ? fullName + "."+ name : name;
subFull = subFull.intern(); 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 PackageIdentifier pack
= new PackageIdentifier(bundle, this, subFull, name); = new PackageIdentifier(bundle, this, subFull, name);
loadedClasses.put(name, pack); loadedPackages.put(name, pack);
swappedClasses = null; swappedClasses = null;
pack.setLoadOnDemand(); pack.setLoadOnDemand();
ident = pack; }
} else if (!ClassInfo.exists(subFull)) { if (!ClassInfo.exists(subFull)) {
GlobalOptions.err.println("Warning: Can't find class " GlobalOptions.err.println("Warning: Can't find class "
+ subFull); + subFull);
Thread.dumpStack(); Thread.dumpStack();
@ -157,7 +163,7 @@ public class PackageIdentifier extends Identifier {
} else { } else {
String subpack = name.substring(0, index); String subpack = name.substring(0, index);
PackageIdentifier pack = PackageIdentifier pack =
(PackageIdentifier) loadedClasses.get(subpack); (PackageIdentifier) loadedPackages.get(subpack);
if (pack == null) { if (pack == null) {
String subFull = (fullName.length() > 0) String subFull = (fullName.length() > 0)
? fullName + "."+ subpack : subpack; ? fullName + "."+ subpack : subpack;
@ -165,7 +171,7 @@ public class PackageIdentifier extends Identifier {
if (ClassInfo.isPackage(subFull)) { if (ClassInfo.isPackage(subFull)) {
pack = new PackageIdentifier(bundle, this, pack = new PackageIdentifier(bundle, this,
subFull, subpack); subFull, subpack);
loadedClasses.put(subpack, pack); loadedPackages.put(subpack, pack);
swappedClasses = null; swappedClasses = null;
if (loadOnDemand) if (loadOnDemand)
pack.setLoadOnDemand(); pack.setLoadOnDemand();
@ -182,45 +188,45 @@ public class PackageIdentifier extends Identifier {
public void loadMatchingClasses(IdentifierMatcher matcher) { public void loadMatchingClasses(IdentifierMatcher matcher) {
String component = matcher.getNextComponent(this); String component = matcher.getNextComponent(this);
if (component != null) { if (component != null) {
Identifier ident = (Identifier) loadedClasses.get(component); component = component.intern();
if (ident == null) { String subFull = (fullName.length() > 0)
component = component.intern(); ? fullName + "."+ component : component;
String subFull = (fullName.length() > 0) subFull = subFull.intern();
? fullName + "."+ component : component; if (loadedClasses.get(component) == null
subFull = subFull.intern(); && ClassInfo.exists(subFull)) {
if (ClassInfo.isPackage(subFull)) { if (GlobalOptions.verboseLevel > 1)
ident = new PackageIdentifier(bundle, this, GlobalOptions.err.println("loading Class " +subFull);
subFull, component); ClassIdentifier ident =
new ClassIdentifier(this, subFull, component,
ClassInfo.forName(subFull));
if (loadOnDemand || matcher.matches(ident)) {
loadedClasses.put(component, ident); loadedClasses.put(component, ident);
swappedClasses = null; swappedClasses = null;
if (loadOnDemand) bundle.addClassIdentifier(ident);
((PackageIdentifier) ident).setLoadOnDemand(); ident.initClass();
} 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);
} }
} }
if (ident instanceof PackageIdentifier) { /* can be a package AND a class with the same name */
if (matcher.matches(ident)) { 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) if (GlobalOptions.verboseLevel > 0)
GlobalOptions.err.println("loading Package " GlobalOptions.err.println("loading Package "
+ident.getFullName()); +pkgIdent.getFullName());
((PackageIdentifier) ident).setLoadOnDemand(); pkgIdent.setLoadOnDemand();
} }
if (matcher.matchesSub(ident, null)) if (matcher.matchesSub(pkgIdent, null))
((PackageIdentifier) ident).loadMatchingClasses(matcher); pkgIdent.loadMatchingClasses(matcher);
} }
} else { } else {
String fullNamePrefix = String fullNamePrefix =
@ -230,22 +236,24 @@ public class PackageIdentifier extends Identifier {
ClassInfo.getClassesAndPackages(getFullName()); ClassInfo.getClassesAndPackages(getFullName());
while (enum.hasMoreElements()) { while (enum.hasMoreElements()) {
String subclazz = ((String)enum.nextElement()).intern(); String subclazz = ((String)enum.nextElement()).intern();
if (loadedClasses.containsKey(subclazz))
continue;
String subFull = (fullNamePrefix + subclazz).intern(); String subFull = (fullNamePrefix + subclazz).intern();
if (matcher.matchesSub(this, subclazz)) { if (matcher.matchesSub(this, subclazz)) {
if (ClassInfo.isPackage(subFull)) { if (ClassInfo.isPackage(subFull)
&& !loadedPackages.containsKey(subclazz)) {
if (GlobalOptions.verboseLevel > 0) if (GlobalOptions.verboseLevel > 0)
GlobalOptions.err.println("loading Package " GlobalOptions.err.println("loading Package "
+ subFull); + subFull);
PackageIdentifier ident = new PackageIdentifier PackageIdentifier ident = new PackageIdentifier
(bundle, this, subFull, subclazz); (bundle, this, subFull, subclazz);
loadedClasses.put(subclazz, ident); loadedPackages.put(subclazz, ident);
swappedClasses = null; swappedClasses = null;
if (loadOnDemand || matcher.matches(ident)) if (loadOnDemand || matcher.matches(ident))
ident.setLoadOnDemand(); ident.setLoadOnDemand();
} else { }
if (ClassInfo.exists(subFull)
&& !loadedClasses.containsKey(subclazz)) {
ClassIdentifier ident = new ClassIdentifier ClassIdentifier ident = new ClassIdentifier
(this, subFull, subclazz, (this, subFull, subclazz,
ClassInfo.forName(subFull)); ClassInfo.forName(subFull));
@ -263,17 +271,15 @@ public class PackageIdentifier extends Identifier {
} }
} }
List list = new ArrayList(); List list = new ArrayList();
list.addAll(loadedClasses.values()); list.addAll(loadedPackages.values());
for (Iterator i = list.iterator(); i.hasNext(); ) { for (Iterator i = list.iterator(); i.hasNext(); ) {
Identifier ident = (Identifier) i.next(); PackageIdentifier ident = (PackageIdentifier) i.next();
if (ident instanceof PackageIdentifier) { if (matcher.matches(ident))
if (matcher.matches(ident)) ((PackageIdentifier) ident).setLoadOnDemand();
((PackageIdentifier) ident).setLoadOnDemand();
if (matcher.matchesSub(ident, null))
if (matcher.matchesSub(ident, null)) ((PackageIdentifier) ident)
((PackageIdentifier) ident) .loadMatchingClasses(matcher);
.loadMatchingClasses(matcher);
}
} }
} }
} }
@ -332,6 +338,12 @@ public class PackageIdentifier extends Identifier {
|| ident.isReachable()) || ident.isReachable())
ident.readTable(table); 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() { public Identifier getParent() {
@ -352,7 +364,8 @@ public class PackageIdentifier extends Identifier {
* even parts of the names. * even parts of the names.
*/ */
if (swappedClasses == null) { if (swappedClasses == null) {
swappedClasses = Arrays.asList(loadedClasses.values().toArray()); swappedClasses = new ArrayList(loadedClasses.values());
swappedClasses.addAll(loadedPackages.values());
Collections.shuffle(swappedClasses, Main.rand); Collections.shuffle(swappedClasses, Main.rand);
} }
return swappedClasses.iterator(); return swappedClasses.iterator();
@ -439,16 +452,19 @@ public class PackageIdentifier extends Identifier {
public boolean contains(String newAlias, Identifier except) { public boolean contains(String newAlias, Identifier except) {
for (Iterator i = loadedClasses.values().iterator(); i.hasNext(); ) { for (Iterator i = loadedClasses.values().iterator(); i.hasNext(); ) {
Identifier ident = (Identifier)i.next(); ClassIdentifier ident = (ClassIdentifier)i.next();
if (ident != except) { if (ident != except) {
if (((Main.stripping & Main.STRIP_UNREACH) == 0 if (((Main.stripping & Main.STRIP_UNREACH) == 0
|| ident.isReachable()) || ident.isReachable())
&& ident.getAlias().equalsIgnoreCase(newAlias)) && ident.getAlias().equalsIgnoreCase(newAlias))
return true; return true;
if (ident instanceof PackageIdentifier }
&& ident.getAlias().length() == 0 }
&& (((PackageIdentifier) ident) for (Iterator i = loadedPackages.values().iterator(); i.hasNext(); ) {
.contains(newAlias, this))) PackageIdentifier ident = (PackageIdentifier)i.next();
if (ident != except) {
if (ident.getAlias().length() == 0
&& ident.contains(newAlias, this))
return true; return true;
} }
} }

Loading…
Cancel
Save