summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/mapping
diff options
context:
space:
mode:
authorGravatar jeff2015-02-25 22:42:34 -0500
committerGravatar jeff2015-02-25 22:42:34 -0500
commit9809078524bd3bd40fbf7aa411f6e0dca02fd009 (patch)
tree19f9ee0613231c747e728bc61f8a1b6ffa58e5b7 /src/cuchaz/enigma/mapping
parentmore work getting inner class trees working in obf'd and deobf'd land (diff)
downloadenigma-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.java22
-rw-r--r--src/cuchaz/enigma/mapping/EntryFactory.java34
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 @@
11package cuchaz.enigma.mapping; 11package cuchaz.enigma.mapping;
12 12
13import java.io.Serializable; 13import java.io.Serializable;
14import java.util.List;
14 15
15public class ClassEntry implements Entry, Serializable { 16public 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 @@
1package cuchaz.enigma.mapping; 1package cuchaz.enigma.mapping;
2 2
3import java.util.List;
4
5import javassist.CtBehavior; 3import javassist.CtBehavior;
6import javassist.CtClass; 4import javassist.CtClass;
7import javassist.CtConstructor; 5import javassist.CtConstructor;
@@ -13,7 +11,6 @@ import javassist.expr.FieldAccess;
13import javassist.expr.MethodCall; 11import javassist.expr.MethodCall;
14import javassist.expr.NewExpr; 12import javassist.expr.NewExpr;
15 13
16import com.beust.jcommander.internal.Lists;
17import com.strobel.assembler.metadata.MethodDefinition; 14import com.strobel.assembler.metadata.MethodDefinition;
18 15
19import cuchaz.enigma.analysis.JarIndex; 16import 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) {