diff --git a/jode/jode/obfuscator/FieldIdentifier.java b/jode/jode/obfuscator/FieldIdentifier.java index d65a4df..632503d 100644 --- a/jode/jode/obfuscator/FieldIdentifier.java +++ b/jode/jode/obfuscator/FieldIdentifier.java @@ -17,6 +17,7 @@ * $Id$ */ package jode.obfuscator; +import java.lang.reflect.Modifier; import jode.bytecode.*; import java.io.*; @@ -30,6 +31,13 @@ public class FieldIdentifier extends Identifier{ this.clazz = clazz; } + public void applyPreserveRule(int preserveRule) { + if ((preserveRule & (info.getModifiers() ^ Modifier.PRIVATE)) != 0) { + setReachable(); + setPreserved(); + } + } + public void setSingleReachable() { super.setSingleReachable(); String type = getType(); diff --git a/jode/jode/obfuscator/Identifier.java b/jode/jode/obfuscator/Identifier.java index 35d4417..33fa47b 100644 --- a/jode/jode/obfuscator/Identifier.java +++ b/jode/jode/obfuscator/Identifier.java @@ -218,6 +218,7 @@ public abstract class Identifier { setAlias((String) table.get(getFullName())); } + public abstract void applyPreserveRule(int preserveRule); public abstract Identifier getParent(); public abstract String getName(); public abstract String getType(); diff --git a/jode/jode/obfuscator/MethodIdentifier.java b/jode/jode/obfuscator/MethodIdentifier.java index 3d2caaf..73a4a2f 100644 --- a/jode/jode/obfuscator/MethodIdentifier.java +++ b/jode/jode/obfuscator/MethodIdentifier.java @@ -17,6 +17,7 @@ * $Id$ */ package jode.obfuscator; +import java.lang.reflect.Modifier; import jode.Obfuscator; import jode.bytecode.*; import java.io.*; @@ -55,6 +56,13 @@ public class MethodIdentifier extends Identifier implements Opcodes { } } + public void applyPreserveRule(int preserveRule) { + if ((preserveRule & (info.getModifiers() ^ Modifier.PRIVATE)) != 0) { + setReachable(); + setPreserved(); + } + } + /** * Reads the opcodes out of the code info and determine its * references diff --git a/jode/jode/obfuscator/PackageIdentifier.java b/jode/jode/obfuscator/PackageIdentifier.java index b96cdff..5c0f1b7 100644 --- a/jode/jode/obfuscator/PackageIdentifier.java +++ b/jode/jode/obfuscator/PackageIdentifier.java @@ -46,8 +46,11 @@ public class PackageIdentifier extends Identifier { } public Identifier getIdentifier(String name) { - if (loadOnDemand) - return loadClass(name); + if (loadOnDemand) { + Identifier ident = loadClass(name); + if (bundle.preserveRule != -1) + ident.applyPreserveRule(bundle.preserveRule); + } int index = name.indexOf('.'); if (index == -1) @@ -116,6 +119,12 @@ public class PackageIdentifier extends Identifier { } } + public void applyPreserveRule(int preserveRule) { + Enumeration enum = loadedClasses.elements(); + while(enum.hasMoreElements()) + ((Identifier) enum.nextElement()).applyPreserveRule(preserveRule); + } + public void reachableIdentifier(String fqn, boolean isVirtual) { int index = fqn.indexOf('.'); String component = index == -1 ? fqn : fqn.substring(0, index);