summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/analysis/EntryRenamer.java
diff options
context:
space:
mode:
authorGravatar gegy10002018-07-17 19:14:08 +0200
committerGravatar GitHub2018-07-17 19:14:08 +0200
commita88175ffc95792b88a8724f66db6dda2b8cc32ee (patch)
tree65895bbc6cf1766f4ca01e1257619ab1993e71dc /src/main/java/cuchaz/enigma/analysis/EntryRenamer.java
parentMerge pull request #3 from thiakil/src-jar (diff)
downloadenigma-fork-a88175ffc95792b88a8724f66db6dda2b8cc32ee.tar.gz
enigma-fork-a88175ffc95792b88a8724f66db6dda2b8cc32ee.tar.xz
enigma-fork-a88175ffc95792b88a8724f66db6dda2b8cc32ee.zip
ASM Based Class Translator (#1)
* Initial port to ASM * Package updates * Annotation + inner class translation * Fix inner class mapping * More bytecode translation * Signature refactoring * Fix highlighting of mapped names * Fix parameter name offset * Fix anonymous class generation * Fix issues with inner class signature transformation * Fix bridged method detection * Fix compile issues * Resolve all failed tests * Apply deobfuscated name to transformed classes * Fix class signatures not being translated * Fix frame array type translation * Fix frame array type translation * Fix array translation in method calls * Fix method reference and bridge detection * Fix handling of null deobf mappings * Parameter translation in interfaces * Fix enum parameter index offset * Fix parsed local variable indexing * Fix stackoverflow on rebuilding method names * Ignore invalid decompiled variable indices * basic source jar * Output directly to file on source export * Make decompile parallel * fix incorrect super calls * Use previous save state to delete old mapping files * Fix old mappings not properly being removed * Fix old mappings not properly being removed * make isMethodProvider public (cherry picked from commit ebad6a9) * speed up Deobfuscator's getSources by using a single TranslatingTypeloader and caching the ClassLoaderTypeloader * ignore .idea project folders * move SynchronizedTypeLoader to a non-inner * fix signature remap of inners for now * index & resolve method/field references for usages view * Allow reader/writer subclasses to provide the underlying file operations * fix giving obf classes a name not removing them from the panel * buffer the ParsedJar class entry inputstream, allow use with a jarinputstream * make CachingClasspathTypeLoader public * make CachingClasspathTypeLoader public * support enum switches with obfuscated SwitchMaps
Diffstat (limited to 'src/main/java/cuchaz/enigma/analysis/EntryRenamer.java')
-rw-r--r--src/main/java/cuchaz/enigma/analysis/EntryRenamer.java63
1 files changed, 41 insertions, 22 deletions
diff --git a/src/main/java/cuchaz/enigma/analysis/EntryRenamer.java b/src/main/java/cuchaz/enigma/analysis/EntryRenamer.java
index 75806c3..9be8378 100644
--- a/src/main/java/cuchaz/enigma/analysis/EntryRenamer.java
+++ b/src/main/java/cuchaz/enigma/analysis/EntryRenamer.java
@@ -15,6 +15,7 @@ import com.google.common.collect.Lists;
15import com.google.common.collect.Multimap; 15import com.google.common.collect.Multimap;
16import com.google.common.collect.Sets; 16import com.google.common.collect.Sets;
17import cuchaz.enigma.mapping.*; 17import cuchaz.enigma.mapping.*;
18import cuchaz.enigma.mapping.entry.*;
18 19
19import java.util.AbstractMap; 20import java.util.AbstractMap;
20import java.util.List; 21import java.util.List;
@@ -87,18 +88,18 @@ public class EntryRenamer {
87 MethodEntry newMethodEntry = renames.get(methodEntry); 88 MethodEntry newMethodEntry = renames.get(methodEntry);
88 if (newMethodEntry != null) { 89 if (newMethodEntry != null) {
89 return (T) new MethodEntry( 90 return (T) new MethodEntry(
90 methodEntry.getClassEntry(), 91 methodEntry.getOwnerClassEntry(),
91 newMethodEntry.getName(), 92 newMethodEntry.getName(),
92 methodEntry.getSignature() 93 methodEntry.getDesc()
93 ); 94 );
94 } 95 }
95 return thing; 96 return thing;
96 } else if (thing instanceof ArgumentEntry) { 97 } else if (thing instanceof LocalVariableEntry) {
97 ArgumentEntry argumentEntry = (ArgumentEntry) thing; 98 LocalVariableEntry variableEntry = (LocalVariableEntry) thing;
98 return (T) new ArgumentEntry( 99 return (T) new LocalVariableEntry(
99 renameMethodsInThing(renames, argumentEntry.getBehaviorEntry()), 100 renameMethodsInThing(renames, variableEntry.getOwnerEntry()),
100 argumentEntry.getIndex(), 101 variableEntry.getIndex(),
101 argumentEntry.getName() 102 variableEntry.getName()
102 ); 103 );
103 } else if (thing instanceof EntryReference) { 104 } else if (thing instanceof EntryReference) {
104 EntryReference<Entry, Entry> reference = (EntryReference<Entry, Entry>) thing; 105 EntryReference<Entry, Entry> reference = (EntryReference<Entry, Entry>) thing;
@@ -119,27 +120,45 @@ public class EntryRenamer {
119 } else if (thing instanceof ClassEntry) { 120 } else if (thing instanceof ClassEntry) {
120 ClassEntry classEntry = (ClassEntry) thing; 121 ClassEntry classEntry = (ClassEntry) thing;
121 return (T) new ClassEntry(renameClassesInThing(renames, classEntry.getClassName())); 122 return (T) new ClassEntry(renameClassesInThing(renames, classEntry.getClassName()));
122 } else if (thing instanceof FieldEntry) { 123 } else if (thing instanceof FieldDefEntry) {
123 FieldEntry fieldEntry = (FieldEntry) thing; 124 FieldDefEntry fieldEntry = (FieldDefEntry) thing;
124 return (T) new FieldEntry(renameClassesInThing(renames, fieldEntry.getClassEntry()), fieldEntry.getName(), renameClassesInThing(renames, fieldEntry.getType())); 125 return (T) new FieldDefEntry(
125 } else if (thing instanceof ConstructorEntry) { 126 renameClassesInThing(renames, fieldEntry.getOwnerClassEntry()),
126 ConstructorEntry constructorEntry = (ConstructorEntry) thing; 127 fieldEntry.getName(),
127 return (T) new ConstructorEntry(renameClassesInThing(renames, constructorEntry.getClassEntry()), renameClassesInThing(renames, constructorEntry.getSignature())); 128 renameClassesInThing(renames, fieldEntry.getDesc()),
129 renameClassesInThing(renames, fieldEntry.getSignature()),
130 fieldEntry.getAccess()
131 );
132 } else if (thing instanceof MethodDefEntry) {
133 MethodDefEntry methodEntry = (MethodDefEntry) thing;
134 return (T) new MethodDefEntry(
135 renameClassesInThing(renames, methodEntry.getOwnerClassEntry()),
136 methodEntry.getName(),
137 renameClassesInThing(renames, methodEntry.getDesc()),
138 renameClassesInThing(renames, methodEntry.getSignature()),
139 methodEntry.getAccess()
140 );
128 } else if (thing instanceof MethodEntry) { 141 } else if (thing instanceof MethodEntry) {
129 MethodEntry methodEntry = (MethodEntry) thing; 142 MethodEntry methodEntry = (MethodEntry) thing;
130 return (T) new MethodEntry(renameClassesInThing(renames, methodEntry.getClassEntry()), methodEntry.getName(), renameClassesInThing(renames, methodEntry.getSignature())); 143 return (T) new MethodEntry(
131 } else if (thing instanceof ArgumentEntry) { 144 renameClassesInThing(renames, methodEntry.getOwnerClassEntry()),
132 ArgumentEntry argumentEntry = (ArgumentEntry) thing; 145 methodEntry.getName(),
133 return (T) new ArgumentEntry(renameClassesInThing(renames, argumentEntry.getBehaviorEntry()), argumentEntry.getIndex(), argumentEntry.getName()); 146 renameClassesInThing(renames, methodEntry.getDesc())
147 );
148 } else if (thing instanceof LocalVariableEntry) {
149 LocalVariableEntry argumentEntry = (LocalVariableEntry) thing;
150 return (T) new LocalVariableEntry(renameClassesInThing(renames, argumentEntry.getOwnerEntry()), argumentEntry.getIndex(), argumentEntry.getName());
134 } else if (thing instanceof EntryReference) { 151 } else if (thing instanceof EntryReference) {
135 EntryReference<Entry, Entry> reference = (EntryReference<Entry, Entry>) thing; 152 EntryReference<Entry, Entry> reference = (EntryReference<Entry, Entry>) thing;
136 reference.entry = renameClassesInThing(renames, reference.entry); 153 reference.entry = renameClassesInThing(renames, reference.entry);
137 reference.context = renameClassesInThing(renames, reference.context); 154 reference.context = renameClassesInThing(renames, reference.context);
138 return thing; 155 return thing;
156 } else if (thing instanceof MethodDescriptor) {
157 return (T) ((MethodDescriptor) thing).remap(className -> renameClassesInThing(renames, className));
158 } else if (thing instanceof TypeDescriptor) {
159 return (T) ((TypeDescriptor) thing).remap(className -> renameClassesInThing(renames, className));
139 } else if (thing instanceof Signature) { 160 } else if (thing instanceof Signature) {
140 return (T) new Signature((Signature) thing, className -> renameClassesInThing(renames, className)); 161 return (T) ((Signature) thing).remap(className -> renameClassesInThing(renames, className));
141 } else if (thing instanceof Type) {
142 return (T) new Type((Type) thing, className -> renameClassesInThing(renames, className));
143 } 162 }
144 163
145 return thing; 164 return thing;