From 5ffc71848b9d2d01813940316e91d77c84bdace4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Tue, 1 Jul 2025 19:45:04 +0200 Subject: [PATCH] Added: #2477 Option to disable AS2 detection of uninitialized class fields Added: AS2 detection of uninitialized class fields is cancellable and shows progress Changed: Icon of "Deobfuscation options" menu from pile of pills to medkit Fixed: Comments color highlighting --- CHANGELOG.md | 9 +++ lib/jsyntaxpane-0.9.5.jar | Bin 608282 -> 608364 bytes .../decompiler/flash/DecompilerPool.java | 3 + .../src/com/jpexs/decompiler/flash/SWF.java | 39 ++++++++++-- .../decompiler/flash/action/ActionGraph.java | 8 ++- .../as2/UninitializedClassFieldsDetector.java | 38 +++++++++++- .../flash/configuration/Configuration.java | 4 ++ .../flash/locales/AppResources.properties | 3 + .../flash/locales/AppResources_cs.properties | 3 + .../decompiler/graph/model/CommentItem.java | 18 +++++- .../com/jpexs/helpers/CancellableWorker.java | 11 ++++ .../jsyntaxpane/lexers/actionscript.flex | 21 ++++--- .../jsyntaxpane/lexers/actionscript3.flex | 18 +++--- .../flash/gui/MainFrameStatusPanel.java | 2 +- .../jpexs/decompiler/flash/gui/MainPanel.java | 6 ++ .../decompiler/flash/gui/abc/ABCPanel.java | 2 +- .../flash/gui/action/ActionPanel.java | 58 +++++++++++++++--- .../flash/gui/graphics/medkit16.png | Bin 0 -> 5570 bytes .../locales/AdvancedSettingsDialog.properties | 4 ++ .../AdvancedSettingsDialog_cs.properties | 4 ++ .../flash/gui/locales/MainFrame.properties | 6 +- .../flash/gui/locales/MainFrame_cs.properties | 5 +- 22 files changed, 225 insertions(+), 37 deletions(-) create mode 100644 src/com/jpexs/decompiler/flash/gui/graphics/medkit16.png diff --git a/CHANGELOG.md b/CHANGELOG.md index e8839e75d..da674dcd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,17 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Added +- [#2477] Option to disable AS2 detection of uninitialized class fields +- AS2 detection of uninitialized class fields is cancellable and shows progress + ### Fixed - [#2474] Gotos incorrectly decompiled - AS1/2/3 highligter - brackets parsing error causing memory leak / crash +- Comments color highlighting + + ### Changed +- Icon of "Deobfuscation options" menu from pile of pills to medkit ## [24.0.1] - 2025-06-27 ### Fixed @@ -3877,6 +3885,7 @@ Major version of SWF to XML export changed to 2. [alpha 9]: https://github.com/jindrapetrik/jpexs-decompiler/compare/alpha8...alpha9 [alpha 8]: https://github.com/jindrapetrik/jpexs-decompiler/compare/alpha7...alpha8 [alpha 7]: https://github.com/jindrapetrik/jpexs-decompiler/releases/tag/alpha7 +[#2477]: https://www.free-decompiler.com/flash/issues/2477 [#2474]: https://www.free-decompiler.com/flash/issues/2474 [#2476]: https://www.free-decompiler.com/flash/issues/2476 [#2404]: https://www.free-decompiler.com/flash/issues/2404 diff --git a/lib/jsyntaxpane-0.9.5.jar b/lib/jsyntaxpane-0.9.5.jar index b8bb16c51b6c2c2fda1d515c1abc1a58eb57e324..65fc50afbd30b41046d1335b7a93aa3c9bcd1349 100644 GIT binary patch delta 28108 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 Bm0|z@ delta 27971 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 diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/DecompilerPool.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/DecompilerPool.java index a14cc3b12..19b831f94 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/DecompilerPool.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/DecompilerPool.java @@ -243,6 +243,9 @@ public class DecompilerPool { future.cancel(true); throw ex; } catch (ExecutionException ex) { + if (ex.getCause() instanceof InterruptedException) { + throw (InterruptedException) ex.getCause(); + } Logger.getLogger(DecompilerPool.class.getName()).log(Level.SEVERE, null, ex); } finally { List> futures = openableToFutures.get(swf); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java index ca5c88572..262941bad 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java @@ -576,6 +576,15 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { * Uninitialized AS2 class traits. Class name to trait name to trait. */ private volatile Map> uninitializedAs2ClassTraits = null; + + /** + * Detecting uninitilized class fields + */ + @Internal + private boolean detectingUninitializedClassFields = false; + + @Internal + private UninitializedClassFieldsDetector uninitializedClassFieldsDetector = new UninitializedClassFieldsDetector(); /** * ExporterInfo tag. @@ -664,6 +673,10 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { */ private final Object charactersLock = new Object(); + public UninitializedClassFieldsDetector getUninitializedClassFieldsDetector() { + return uninitializedClassFieldsDetector; + } + /** * Sets main GFX exporterinfo tag * @@ -6208,24 +6221,40 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { * @throws java.lang.InterruptedException On interruption */ public void calculateAs2UninitializedClassTraits() throws InterruptedException { + setDetectingUninitialized(true); uninitializedAs2ClassTraits = new HashMap<>(); - UninitializedClassFieldsDetector detector = new UninitializedClassFieldsDetector(); try { - uninitializedAs2ClassTraits = detector.calculateAs2UninitializedClassTraits(this); - } catch (Throwable t) { + uninitializedAs2ClassTraits = getUninitializedClassFieldsDetector().calculateAs2UninitializedClassTraits(this); + } catch (Throwable t) { uninitializedAs2ClassTraits = null; throw t; + } finally { + setDetectingUninitialized(false); } } - + + private synchronized void setDetectingUninitialized(boolean val) { + this.detectingUninitializedClassFields = val; + } + + private synchronized boolean isDetectingUninitialized() { + return detectingUninitializedClassFields; + } + /** * Gets uninitialized class traits in AS2. * * @return Map of class name to map of trait name to trait */ - public synchronized Map> getUninitializedAs2ClassTraits() throws InterruptedException { + public Map> getUninitializedAs2ClassTraits() throws InterruptedException { + if (Configuration.skipDetectionOfUnitializedClassFields.get()) { + return new LinkedHashMap<>(); + } if (CancellableWorker.isInterrupted()) { throw new InterruptedException(); + } + if (isDetectingUninitialized()) { + return new LinkedHashMap<>(); } if (uninitializedAs2ClassTraits == null) { calculateAs2UninitializedClassTraits(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java index af716de78..090dcca54 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java @@ -16,6 +16,7 @@ */ package com.jpexs.decompiler.flash.action; +import com.jpexs.decompiler.flash.AppResources; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.FinalProcessLocalData; import com.jpexs.decompiler.flash.SWF; @@ -48,6 +49,7 @@ import com.jpexs.decompiler.flash.action.swf5.ActionDefineFunction; import com.jpexs.decompiler.flash.action.swf5.ActionEquals2; import com.jpexs.decompiler.flash.action.swf6.ActionStrictEquals; import com.jpexs.decompiler.flash.action.swf7.ActionDefineFunction2; +import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.ecma.Null; import com.jpexs.decompiler.flash.ecma.Undefined; import com.jpexs.decompiler.graph.AbstractGraphTargetVisitor; @@ -67,6 +69,7 @@ import com.jpexs.decompiler.graph.ThrowState; import com.jpexs.decompiler.graph.TranslateStack; import com.jpexs.decompiler.graph.model.BinaryOpItem; import com.jpexs.decompiler.graph.model.BreakItem; +import com.jpexs.decompiler.graph.model.CommentItem; import com.jpexs.decompiler.graph.model.GotoItem; import com.jpexs.decompiler.graph.model.IfItem; import com.jpexs.decompiler.graph.model.PopItem; @@ -129,7 +132,7 @@ public class ActionGraph extends Graph { this.insideDoInitAction = insideDoInitAction; this.insideFunction = insideFunction; } - + /** * Get uninitialized class traits * @@ -616,6 +619,9 @@ public class ActionGraph extends Graph { if (insideDoInitAction && !insideFunction) { ActionScript2ClassDetector detector = new ActionScript2ClassDetector(); detector.checkClass(uninitializedClassTraits, ret, ((ActionGraphSource) code).getVariables(), path); + if (Configuration.skipDetectionOfUnitializedClassFields.get()) { + ret.add(0, new CommentItem(AppResources.translate("decompilationWarning.as2.noUninitializedClassFieldsDetection"))); + } } ActionLocalData ald = (ActionLocalData) localData; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/as2/UninitializedClassFieldsDetector.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/as2/UninitializedClassFieldsDetector.java index 5dd0f9c8e..a07e29da3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/as2/UninitializedClassFieldsDetector.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/as2/UninitializedClassFieldsDetector.java @@ -35,6 +35,7 @@ import com.jpexs.decompiler.flash.tags.base.ASMSource; import com.jpexs.decompiler.graph.AbstractGraphTargetVisitor; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.helpers.CancellableWorker; +import com.jpexs.helpers.ProgressListener; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; @@ -48,6 +49,22 @@ import java.util.Map; */ public class UninitializedClassFieldsDetector { + private List progressListeners = new ArrayList<>(); + + public void addProgressListener(ProgressListener listener) { + progressListeners.add(listener); + } + + public void removeProgressListener(ProgressListener listener) { + progressListeners.remove(listener); + } + + private void fireProgress(String status) { + for (ProgressListener listener : progressListeners) { + listener.status(status); + } + } + /** * Gets path of variable and its getMembers: a.b.c.d => [a,b,c,d]. * @@ -210,6 +227,7 @@ public class UninitializedClassFieldsDetector { DoInitActionTag doi = (DoInitActionTag) asm; String exportName = doi.getSwf().getCharacter(doi.getCharacterId()).getExportName(); if (exportName != null && exportName.startsWith("__Packages.")) { + fireProgress(key); List tree = asm.getActionsToTree(); for (GraphTargetItem item : tree) { if (item instanceof InterfaceActionItem) { @@ -265,7 +283,7 @@ public class UninitializedClassFieldsDetector { } } } - } + } classesAsms.add(doi); } } @@ -295,6 +313,7 @@ public class UninitializedClassFieldsDetector { DoInitActionTag doi = (DoInitActionTag) asm; String exportName = doi.getSwf().getCharacter(doi.getCharacterId()).getExportName(); if (exportName != null && exportName.startsWith("__Packages.")) { + fireProgress(key); List tree = asm.getActionsToTree(); for (GraphTargetItem item : tree) { if (item instanceof ClassActionItem) { @@ -347,6 +366,7 @@ public class UninitializedClassFieldsDetector { throw new InterruptedException(); } ASMSource asm = asms.get(key); + fireProgress(key); List tree = asm.getActionsToTree(); for (GraphTargetItem item : tree) { AbstractGraphTargetVisitor visitor = new AbstractGraphTargetVisitor() { @@ -383,6 +403,22 @@ public class UninitializedClassFieldsDetector { item.visitRecursively(visitor); } } + + + //Removed cached version of classes - allow reparsing using detected uninitialized fields + for (String key : asms.keySet()) { + if (CancellableWorker.isInterrupted()) { + throw new InterruptedException(); + } + ASMSource asm = asms.get(key); + if (asm instanceof DoInitActionTag) { + DoInitActionTag doi = (DoInitActionTag) asm; + String exportName = doi.getSwf().getCharacter(doi.getCharacterId()).getExportName(); + if (exportName != null && exportName.startsWith("__Packages.")) { + SWF.uncache(doi); + } + } + } /*for (String cls:result.keySet()) { System.err.println("class "+cls); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java index c9938f0d4..da1dbfa41 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java @@ -1149,6 +1149,10 @@ public final class Configuration { @ConfigurationDefaultBoolean(true) @ConfigurationCategory("script") public static ConfigurationItem showCodeCompletionOnDot = null; + + @ConfigurationDefaultBoolean(false) + @ConfigurationCategory("script") + public static ConfigurationItem skipDetectionOfUnitializedClassFields = null; private static Map configurationDescriptions = new LinkedHashMap<>(); private static Map configurationTitles = new LinkedHashMap<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/locales/AppResources.properties b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/locales/AppResources.properties index f736fb975..daa5fb3bb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/locales/AppResources.properties +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/locales/AppResources.properties @@ -61,3 +61,6 @@ configurationFile.meta.showComments = Show configuration comments - set to true configurationFile.meta.modifiedOnly = Store modified items only in this file - set to false (and exit app again to resave) to show all. configurationFile.configuration = Section - Actual configuration configuration.removed = WARNING: This configuration was REMOVED. It is unused. + +#after 24.0.1 +decompilationWarning.as2.noUninitializedClassFieldsDetection = WARNING: This class was decompiled without detecting uninitialized class fields. diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/locales/AppResources_cs.properties b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/locales/AppResources_cs.properties index fa6774568..1fdc7d12b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/locales/AppResources_cs.properties +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/locales/AppResources_cs.properties @@ -62,3 +62,6 @@ configurationFile.meta.showComments = Zobrazit koment\u00e1\u0159e ke konfigurac configurationFile.meta.modifiedOnly = Ukl\u00e1dat do tohoto souboru pouze zm\u011bn\u011bn\u00e9 hodnoty - nastavte na false (a ukon\u010dete aplikaci pro nov\u00e9 ulo\u017een\u00ed) pro zobrazen\u00ed v\u0161eho. configurationFile.configuration = Sekce - Vlastn\u00ed konfigurace configuration.removed = VAROV\u00c1N\u00cd: Tato konfigurace byla ODSTRAN\u011aNA. Nepou\u017e\u00edv\u00e1 se. + +#after 24.0.1 +decompilationWarning.as2.noUninitializedClassFieldsDetection = VAROV\u00c1N\u00cd: Tato t\u0159\u00edda byla dekompilov\u00e1na bez detekce neinicializovan\u00fdch pol\u00ed t\u0159\u00edd. diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/CommentItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/CommentItem.java index c62c36203..5f7d91d1f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/CommentItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/CommentItem.java @@ -52,7 +52,18 @@ public class CommentItem extends GraphTargetItem { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) { - writer.append("/* "); + int commentLinesCount = 0; + for (int i = 0; i < commentLines.length; i++) { + if (commentLines[i] == null) { + continue; + } + commentLinesCount++; + } + if (commentLinesCount == 1) { + writer.append("// "); + } else { + writer.append("/* "); + } for (int i = 0; i < commentLines.length; i++) { if (commentLines[i] == null) { continue; @@ -62,7 +73,10 @@ public class CommentItem extends GraphTargetItem { writer.newLine(); } } - return writer.append(" */"); + if (commentLinesCount > 1) { + writer.append(" */"); + } + return writer; } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/helpers/CancellableWorker.java b/libsrc/ffdec_lib/src/com/jpexs/helpers/CancellableWorker.java index bcf1de4cd..231dde36a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/helpers/CancellableWorker.java +++ b/libsrc/ffdec_lib/src/com/jpexs/helpers/CancellableWorker.java @@ -66,6 +66,8 @@ public abstract class CancellableWorker implements RunnableFuture { private CancellableWorker parentWorker; private boolean canceled = false; + + private boolean userCancelled = false; private List cancelListeners = new ArrayList<>(); @@ -188,6 +190,15 @@ public abstract class CancellableWorker implements RunnableFuture { THREAD_POOL.execute(this); } + public final boolean userCancel(boolean mayIterruptIfRunning) { + userCancelled = true; + return cancel(mayIterruptIfRunning); + } + + public boolean isUserCancelled() { + return userCancelled; + } + @Override public final boolean cancel(boolean mayInterruptIfRunning) { canceled = true; diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript.flex b/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript.flex index 5d6150586..6dd9637c3 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript.flex +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript.flex @@ -64,9 +64,13 @@ import java.util.List; this.offset = ofst; prevToken = null; Token t = yylex(); - prevToken = t; + if (t.type != TokenType.COMMENT) { + prevToken = t; + } for (; t != null; t = yylex()) { - prevToken = t; + if (t.type != TokenType.COMMENT) { + prevToken = t; + } tokens.add(t); } } catch (IOException ex) { @@ -187,9 +191,14 @@ RegExp = \/([^\r\n/]|\\\/)+\/[a-z]* "typeof" | "void" { return token(TokenType.KEYWORD); } + /* comments */ + {Comment} { return token(TokenType.COMMENT); } + {RegExp} { - if (prevToken == null || (prevToken.type == TokenType.OPERATOR && prevToken.pairValue >= 0)) { + if (prevToken == null + || (prevToken.type == TokenType.OPERATOR && prevToken.pairValue >= 0) + ) { return token(TokenType.REGEX); } else { int ch = yychar; @@ -201,7 +210,7 @@ RegExp = \/([^\r\n/]|\\\/)+\/[a-z]* /* operators */ - "(" { return token(TokenType.OPERATOR, PAREN); } + "(" { return token(TokenType.OPERATOR, PAREN); } ")" { return token(TokenType.OPERATOR, -PAREN); } "{" { return token(TokenType.OPERATOR, CURLY); } "}" { return token(TokenType.OPERATOR, -CURLY); } @@ -286,9 +295,7 @@ RegExp = \/([^\r\n/]|\\\/)+\/[a-z]* // JavaDoc comments need a state so that we can highlight the @ controls - /* comments */ - {Comment} { return token(TokenType.COMMENT); } - + /* whitespace */ {WhiteSpace} { } /* identifiers */ diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript3.flex b/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript3.flex index 6ef37106c..cf6ae4916 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript3.flex +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript3.flex @@ -66,9 +66,13 @@ import java.util.List; this.offset = ofst; prevToken = null; Token t = yylex(); - prevToken = t; + if (t.type != TokenType.COMMENT) { + prevToken = t; + } for (; t != null; t = yylex()) { - prevToken = t; + if (t.type != TokenType.COMMENT) { + prevToken = t; + } tokens.add(t); } } catch (IOException ex) { @@ -211,6 +215,9 @@ VerbatimString = "@\"" {VerbatimStringCharacter}* "\"" "new" { prevNew = true; return token(TokenType.KEYWORD); } + /* comments */ + {Comment} { return token(TokenType.COMMENT); } + {RegExp} { prevNew = false; if (prevToken == null || (prevToken.type == TokenType.OPERATOR && prevToken.pairValue >= 0)) { @@ -324,12 +331,7 @@ VerbatimString = "@\"" {VerbatimStringCharacter}* "\"" {DoubleLiteral} | {DoubleLiteral}[dD] { prevNew = false; return token(TokenType.NUMBER); } - - // JavaDoc comments need a state so that we can highlight the @ controls - - /* comments */ - {Comment} { prevNew = false; return token(TokenType.COMMENT); } - + /* whitespace */ {WhiteSpace} { } {XMLBeginOneTag} { diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameStatusPanel.java b/src/com/jpexs/decompiler/flash/gui/MainFrameStatusPanel.java index 0aa9dc90b..36fb5ca49 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainFrameStatusPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainFrameStatusPanel.java @@ -81,7 +81,7 @@ public class MainFrameStatusPanel extends JPanel { cancelButton.addActionListener((ActionEvent e) -> { CancellableWorker w = currentWorker; if (w != null) { - w.cancel(true); + w.userCancel(true); } }); statusLeftPanel.add(loadingPanel); diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index af09053d8..40fb528e3 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -3379,6 +3379,12 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se updateClassesList(); reload(true); } + + public void skipDetectionOfUnitializedClassFieldsChanged() { + clearAllScriptCache(); + updateClassesList(); + reload(true); + } public void renameColliding(final Openable openable) { View.checkAccess(); diff --git a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java index fa296feef..e62a4cc94 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java @@ -1255,7 +1255,7 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener { - setSourceCompleted(asm, htext, finalActions); - }); + CancellableWorker that = this; + //if (withUninitializedClassFields) + ProgressListener progressListener = new ProgressListener() { + @Override + public void progress(int p) { + } + + @Override + public void status(String status) { + Main.startWork(AppStrings.translate("work.decompiling") + " " + status + " ...", that); + } + }; + UninitializedClassFieldsDetector det = asm.getSwf().getUninitializedClassFieldsDetector(); + det.addProgressListener(progressListener); + try { + HighlightedText htext = SWF.getCached(asm, innerActions); + ActionList finalActions = innerActions; + View.execInEventDispatch(() -> { + setSourceCompleted(asm, htext, finalActions); + }); + } finally { + det.removeProgressListener(progressListener); + } } else { ActionList finalActions = innerActions; View.execInEventDispatch(() -> { @@ -611,7 +634,7 @@ public class ActionPanel extends JPanel implements SearchListener() { + @Override + public void configurationItemChanged(Boolean newValue) { + mainPanel.skipDetectionOfUnitializedClassFieldsChanged(); + } + }); + + PopupButton deobfuscateOptionsButton = new PopupButton(View.getIcon("medkit16")) { @Override protected JPopupMenu getPopupMenu() { JPopupMenu popupMenu = new JPopupMenu(); @@ -978,9 +1008,13 @@ public class ActionPanel extends JPanel implements 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 SOE*Cz!