summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/Deobfuscator.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/cuchaz/enigma/Deobfuscator.java')
-rw-r--r--src/main/java/cuchaz/enigma/Deobfuscator.java42
1 files changed, 39 insertions, 3 deletions
diff --git a/src/main/java/cuchaz/enigma/Deobfuscator.java b/src/main/java/cuchaz/enigma/Deobfuscator.java
index 0e03753..cb02ffa 100644
--- a/src/main/java/cuchaz/enigma/Deobfuscator.java
+++ b/src/main/java/cuchaz/enigma/Deobfuscator.java
@@ -15,6 +15,7 @@ import com.google.common.base.Stopwatch;
15import com.google.common.collect.Lists; 15import com.google.common.collect.Lists;
16import com.google.common.collect.Maps; 16import com.google.common.collect.Maps;
17import com.google.common.collect.Sets; 17import com.google.common.collect.Sets;
18import com.strobel.assembler.metadata.Buffer;
18import com.strobel.assembler.metadata.MetadataSystem; 19import com.strobel.assembler.metadata.MetadataSystem;
19import com.strobel.assembler.metadata.TypeDefinition; 20import com.strobel.assembler.metadata.TypeDefinition;
20import com.strobel.assembler.metadata.TypeReference; 21import com.strobel.assembler.metadata.TypeReference;
@@ -163,6 +164,10 @@ public class Deobfuscator {
163 } 164 }
164 165
165 public CompilationUnit getSourceTree(String className) { 166 public CompilationUnit getSourceTree(String className) {
167 return getSourceTree(className, createTypeLoader());
168 }
169
170 public CompilationUnit getSourceTree(String className, ITranslatingTypeLoader loader) {
166 171
167 // we don't know if this class name is obfuscated or deobfuscated 172 // we don't know if this class name is obfuscated or deobfuscated
168 // we need to tell the decompiler the deobfuscated name so it doesn't get freaked out 173 // we need to tell the decompiler the deobfuscated name so it doesn't get freaked out
@@ -178,7 +183,6 @@ public class Deobfuscator {
178 } 183 }
179 184
180 // set the desc loader 185 // set the desc loader
181 TranslatingTypeLoader loader = createTypeLoader();
182 this.settings.setTypeLoader(loader); 186 this.settings.setTypeLoader(loader);
183 187
184 // see if procyon can find the desc 188 // see if procyon can find the desc
@@ -267,6 +271,10 @@ public class Deobfuscator {
267 progress.init(classEntries.size(), "Decompiling classes..."); 271 progress.init(classEntries.size(), "Decompiling classes...");
268 } 272 }
269 273
274 //create a common instance outside the loop as mappings shouldn't be changing while this is happening
275 //synchronized to make sure the parallelStream doesn't CME with the cache
276 ITranslatingTypeLoader typeLoader = new SynchronizedTypeLoader(createTypeLoader());
277
270 // DEOBFUSCATE ALL THE THINGS!! @_@ 278 // DEOBFUSCATE ALL THE THINGS!! @_@
271 Stopwatch stopwatch = Stopwatch.createStarted(); 279 Stopwatch stopwatch = Stopwatch.createStarted();
272 AtomicInteger count = new AtomicInteger(); 280 AtomicInteger count = new AtomicInteger();
@@ -278,7 +286,7 @@ public class Deobfuscator {
278 286
279 try { 287 try {
280 // get the source 288 // get the source
281 CompilationUnit sourceTree = getSourceTree(obfClassEntry.getName()); 289 CompilationUnit sourceTree = getSourceTree(obfClassEntry.getName(), typeLoader);
282 290
283 // write the file 291 // write the file
284 File file = new File(dirOut, deobfClassEntry.getName().replace('.', '/') + ".java"); 292 File file = new File(dirOut, deobfClassEntry.getName().replace('.', '/') + ".java");
@@ -295,7 +303,7 @@ public class Deobfuscator {
295 } 303 }
296 }); 304 });
297 stopwatch.stop(); 305 stopwatch.stop();
298 System.out.println("Done in : " + stopwatch.toString()); 306 System.out.println("writeSources Done in : " + stopwatch.toString());
299 if (progress != null) { 307 if (progress != null) {
300 progress.onProgress(count.get(), "Done:"); 308 progress.onProgress(count.get(), "Done:");
301 } 309 }
@@ -658,4 +666,32 @@ public class Deobfuscator {
658 public interface ClassTransformer { 666 public interface ClassTransformer {
659 String transform(ClassNode node, ClassWriter writer); 667 String transform(ClassNode node, ClassWriter writer);
660 } 668 }
669
670 private class SynchronizedTypeLoader implements ITranslatingTypeLoader {
671 private final TranslatingTypeLoader delegate;
672
673 private SynchronizedTypeLoader(TranslatingTypeLoader delegate) {
674 this.delegate = delegate;
675 }
676
677 @Override
678 public List<String> getClassNamesToTry(String className) {
679 return delegate.getClassNamesToTry(className);
680 }
681
682 @Override
683 public List<String> getClassNamesToTry(ClassEntry obfClassEntry) {
684 return delegate.getClassNamesToTry(obfClassEntry);
685 }
686
687 @Override
688 public String transformInto(ClassNode node, ClassWriter writer) {
689 return delegate.transformInto(node, writer);
690 }
691
692 @Override
693 public synchronized boolean tryLoadType(String internalName, Buffer buffer) {
694 return delegate.tryLoadType(internalName, buffer);
695 }
696 }
661} 697}