|
52 | 52 | import software.coley.recaf.services.deobfuscation.transform.generic.IllegalSignatureRemovingTransformer; |
53 | 53 | import software.coley.recaf.services.deobfuscation.transform.generic.IllegalVarargsRemovingTransformer; |
54 | 54 | import software.coley.recaf.services.deobfuscation.transform.generic.KotlinNameRestorationTransformer; |
55 | | -import software.coley.recaf.services.deobfuscation.transform.generic.OpaqueConstantFoldingTransformer; |
56 | 55 | import software.coley.recaf.services.deobfuscation.transform.generic.LongAnnotationRemovingTransformer; |
57 | 56 | import software.coley.recaf.services.deobfuscation.transform.generic.LongExceptionRemovingTransformer; |
| 57 | +import software.coley.recaf.services.deobfuscation.transform.generic.OpaqueConstantFoldingTransformer; |
58 | 58 | import software.coley.recaf.services.deobfuscation.transform.generic.OpaquePredicateFoldingTransformer; |
59 | 59 | import software.coley.recaf.services.deobfuscation.transform.generic.RedundantTryCatchRemovingTransformer; |
60 | 60 | import software.coley.recaf.services.deobfuscation.transform.generic.SourceNameRestorationTransformer; |
|
84 | 84 | import software.coley.recaf.util.FxThreadUtil; |
85 | 85 | import software.coley.recaf.util.Lang; |
86 | 86 | import software.coley.recaf.util.StringUtil; |
| 87 | +import software.coley.recaf.util.threading.Batch; |
| 88 | +import software.coley.recaf.util.threading.ThreadPoolFactory; |
| 89 | +import software.coley.recaf.util.threading.ThreadUtil; |
87 | 90 | import software.coley.recaf.workspace.model.Workspace; |
88 | 91 |
|
89 | 92 | import java.util.ArrayList; |
|
99 | 102 | @Dependent |
100 | 103 | public class DeobfuscationWindow extends RecafStage { |
101 | 104 | private static final int MAX_PASSES = 5; // TODO: Make this an input |
| 105 | + private static final Batch deobfuscationBatch = ThreadUtil.batch(ThreadPoolFactory.newSingleThreadExecutor("deobfuscation-preview")); |
102 | 106 | private static final DebuggingLogger logger = Logging.get(DeobfuscationWindow.class); |
103 | 107 | private final TransformationManager transformationManager; |
104 | 108 | private final TransformationApplierService transformationApplierService; |
@@ -483,10 +487,19 @@ public boolean isDecompilePreview() { |
483 | 487 | } |
484 | 488 |
|
485 | 489 | private void updatePreview() { |
486 | | - if (isDecompilePreview()) |
487 | | - decompile(); |
488 | | - else |
489 | | - disassemble(); |
| 490 | + // TODO: We can't really stop expensive decompilations, they don't check for interrupts on the current thread |
| 491 | + // and we have no good way of force killing them (rip Thread.stop) so the best we can really do is only |
| 492 | + // allow one of these tasks to run at a time, with one next 'pending' task. |
| 493 | + // While a task is executing we update what is the next 'pending' task when we call this method. |
| 494 | + // Once the current task is done, or there is nothing running we make the 'pending' the current task and run it. |
| 495 | + deobfuscationBatch.add(() -> { |
| 496 | + deobfuscationBatch.clear(); |
| 497 | + if (isDecompilePreview()) |
| 498 | + decompile(); |
| 499 | + else |
| 500 | + disassemble(); |
| 501 | + }); |
| 502 | + deobfuscationBatch.executeNewest(); |
490 | 503 | } |
491 | 504 |
|
492 | 505 | private void disassemble() { |
|
0 commit comments