diff options
| author | 2015-02-25 22:42:34 -0500 | |
|---|---|---|
| committer | 2015-02-25 22:42:34 -0500 | |
| commit | 9809078524bd3bd40fbf7aa411f6e0dca02fd009 (patch) | |
| tree | 19f9ee0613231c747e728bc61f8a1b6ffa58e5b7 /src/cuchaz/enigma/mapping | |
| parent | more work getting inner class trees working in obf'd and deobf'd land (diff) | |
| download | enigma-fork-9809078524bd3bd40fbf7aa411f6e0dca02fd009.tar.gz enigma-fork-9809078524bd3bd40fbf7aa411f6e0dca02fd009.tar.xz enigma-fork-9809078524bd3bd40fbf7aa411f6e0dca02fd009.zip | |
fixed lots of issues with inner class reconstruction, particularly for inner class trees
also fixed lots of issues with reading jars that aren't Minecraft. =P
Diffstat (limited to 'src/cuchaz/enigma/mapping')
| -rw-r--r-- | src/cuchaz/enigma/mapping/ClassEntry.java | 22 | ||||
| -rw-r--r-- | src/cuchaz/enigma/mapping/EntryFactory.java | 34 |
2 files changed, 21 insertions, 35 deletions
diff --git a/src/cuchaz/enigma/mapping/ClassEntry.java b/src/cuchaz/enigma/mapping/ClassEntry.java index 69f171a..69e66bc 100644 --- a/src/cuchaz/enigma/mapping/ClassEntry.java +++ b/src/cuchaz/enigma/mapping/ClassEntry.java | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | package cuchaz.enigma.mapping; | 11 | package cuchaz.enigma.mapping; |
| 12 | 12 | ||
| 13 | import java.io.Serializable; | 13 | import java.io.Serializable; |
| 14 | import java.util.List; | ||
| 14 | 15 | ||
| 15 | public class ClassEntry implements Entry, Serializable { | 16 | public class ClassEntry implements Entry, Serializable { |
| 16 | 17 | ||
| @@ -114,13 +115,28 @@ public class ClassEntry implements Entry, Serializable { | |||
| 114 | } | 115 | } |
| 115 | 116 | ||
| 116 | public String getSimpleName() { | 117 | public String getSimpleName() { |
| 117 | if (isInnerClass()) { | ||
| 118 | return getInnerClassName(); | ||
| 119 | } | ||
| 120 | int pos = m_name.lastIndexOf('/'); | 118 | int pos = m_name.lastIndexOf('/'); |
| 121 | if (pos > 0) { | 119 | if (pos > 0) { |
| 122 | return m_name.substring(pos + 1); | 120 | return m_name.substring(pos + 1); |
| 123 | } | 121 | } |
| 124 | return m_name; | 122 | return m_name; |
| 125 | } | 123 | } |
| 124 | |||
| 125 | public ClassEntry buildClassEntry(List<ClassEntry> classChain) { | ||
| 126 | assert(classChain.contains(this)); | ||
| 127 | StringBuilder buf = new StringBuilder(); | ||
| 128 | for (ClassEntry chainEntry : classChain) { | ||
| 129 | if (buf.length() == 0) { | ||
| 130 | buf.append(chainEntry.getName()); | ||
| 131 | } else { | ||
| 132 | buf.append("$"); | ||
| 133 | buf.append(chainEntry.isInnerClass() ? chainEntry.getInnerClassName() : chainEntry.getSimpleName()); | ||
| 134 | } | ||
| 135 | |||
| 136 | if (chainEntry == this) { | ||
| 137 | break; | ||
| 138 | } | ||
| 139 | } | ||
| 140 | return new ClassEntry(buf.toString()); | ||
| 141 | } | ||
| 126 | } | 142 | } |
diff --git a/src/cuchaz/enigma/mapping/EntryFactory.java b/src/cuchaz/enigma/mapping/EntryFactory.java index bbdfa73..f4d62c8 100644 --- a/src/cuchaz/enigma/mapping/EntryFactory.java +++ b/src/cuchaz/enigma/mapping/EntryFactory.java | |||
| @@ -1,7 +1,5 @@ | |||
| 1 | package cuchaz.enigma.mapping; | 1 | package cuchaz.enigma.mapping; |
| 2 | 2 | ||
| 3 | import java.util.List; | ||
| 4 | |||
| 5 | import javassist.CtBehavior; | 3 | import javassist.CtBehavior; |
| 6 | import javassist.CtClass; | 4 | import javassist.CtClass; |
| 7 | import javassist.CtConstructor; | 5 | import javassist.CtConstructor; |
| @@ -13,7 +11,6 @@ import javassist.expr.FieldAccess; | |||
| 13 | import javassist.expr.MethodCall; | 11 | import javassist.expr.MethodCall; |
| 14 | import javassist.expr.NewExpr; | 12 | import javassist.expr.NewExpr; |
| 15 | 13 | ||
| 16 | import com.beust.jcommander.internal.Lists; | ||
| 17 | import com.strobel.assembler.metadata.MethodDefinition; | 14 | import com.strobel.assembler.metadata.MethodDefinition; |
| 18 | 15 | ||
| 19 | import cuchaz.enigma.analysis.JarIndex; | 16 | import cuchaz.enigma.analysis.JarIndex; |
| @@ -25,35 +22,8 @@ public class EntryFactory { | |||
| 25 | } | 22 | } |
| 26 | 23 | ||
| 27 | public static ClassEntry getObfClassEntry(JarIndex jarIndex, ClassMapping classMapping) { | 24 | public static ClassEntry getObfClassEntry(JarIndex jarIndex, ClassMapping classMapping) { |
| 28 | return getChainedOuterClassName(jarIndex, new ClassEntry(classMapping.getObfFullName())); | 25 | ClassEntry obfClassEntry = new ClassEntry(classMapping.getObfFullName()); |
| 29 | } | 26 | return obfClassEntry.buildClassEntry(jarIndex.getObfClassChain(obfClassEntry)); |
| 30 | |||
| 31 | public static ClassEntry getChainedOuterClassName(JarIndex jarIndex, ClassEntry obfClassEntry) { | ||
| 32 | |||
| 33 | // lookup the chain of outer classes | ||
| 34 | List<ClassEntry> obfClassChain = Lists.newArrayList(obfClassEntry); | ||
| 35 | ClassEntry checkClassEntry = obfClassEntry; | ||
| 36 | while (true) { | ||
| 37 | ClassEntry obfOuterClassEntry = jarIndex.getOuterClass(checkClassEntry); | ||
| 38 | if (obfOuterClassEntry != null) { | ||
| 39 | obfClassChain.add(obfOuterClassEntry); | ||
| 40 | checkClassEntry = obfOuterClassEntry; | ||
| 41 | } else { | ||
| 42 | break; | ||
| 43 | } | ||
| 44 | } | ||
| 45 | |||
| 46 | // build the chained class name | ||
| 47 | StringBuilder buf = new StringBuilder(); | ||
| 48 | for (int i=obfClassChain.size()-1; i>=0; i--) { | ||
| 49 | if (buf.length() == 0) { | ||
| 50 | buf.append(obfClassChain.get(i).getName()); | ||
| 51 | } else { | ||
| 52 | buf.append("$"); | ||
| 53 | buf.append(obfClassChain.get(i).getSimpleName()); | ||
| 54 | } | ||
| 55 | } | ||
| 56 | return new ClassEntry(buf.toString()); | ||
| 57 | } | 27 | } |
| 58 | 28 | ||
| 59 | public static ClassEntry getDeobfClassEntry(ClassMapping classMapping) { | 29 | public static ClassEntry getDeobfClassEntry(ClassMapping classMapping) { |