diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java index 04037ad5a..f617ee82c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java @@ -1516,7 +1516,7 @@ public class AVM2Code implements Cloneable { break; } - if (Configuration._simplifyExpressions.get()) { + if (Configuration.simplifyExpressions.get()) { stack.simplify(); } visited[ip] = true; @@ -2086,8 +2086,7 @@ public class AVM2Code implements Cloneable { ins.operands[j] = updater.updateOperandOffset(target, ins.operands[j]); } }*/ //Faster, but not so universal - { - if (ins.definition instanceof IfTypeIns) { + if (ins.definition instanceof IfTypeIns) { long target = ins.getTargetAddress(); try { ins.operands[0] = updater.updateOperandOffset(ins.getAddress(), target, ins.operands[0]); @@ -2095,7 +2094,6 @@ public class AVM2Code implements Cloneable { throw new ConvertException("Invalid offset (" + ins + ")", i); } } - } ins.setAddress(updater.updateInstructionOffset(ins.getAddress())); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java index 31abda42b..ca67b478c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java @@ -971,6 +971,9 @@ public abstract class Action implements GraphSourceItem { output.add(new ScriptEndItem()); break; } + if (Configuration.simplifyExpressions.get()) { + stack.simplify(); + } Action action = actions.get(ip); if (action.isIgnored()) { ip++; @@ -1062,7 +1065,7 @@ public abstract class Action implements GraphSourceItem { } /*ActionJump && ActionIf removed*/ - /*if ((action instanceof ActionEnumerate2) || (action instanceof ActionEnumerate)) { + /*if ((action instanceof ActionEnumerate2) || (action instanceof ActionEnumerate)) { loopStart = ip + 1; isForIn = true; ip += 4; 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 7a11535d3..995e30ed2 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 @@ -589,9 +589,8 @@ public class Configuration { public static final ConfigurationItem _enableFlexExport = null; @ConfigurationDefaultBoolean(false) - //@ConfigurationCategory("script") - @ConfigurationInternal - public static final ConfigurationItem _simplifyExpressions = null; + @ConfigurationCategory("script") + public static final ConfigurationItem simplifyExpressions = null; private enum OSId { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java index 8a3e1073a..1eacb1cf3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java @@ -339,7 +339,7 @@ public abstract class GraphTargetItem implements Serializable, Cloneable { } } } - if (!implicitCoerce.isEmpty() && Configuration._simplifyExpressions.get()) { + if (!implicitCoerce.isEmpty() && Configuration.simplifyExpressions.get()) { t = t.simplify(implicitCoerce); } return t.appendTo(writer, localData); diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java index e011b0f62..ece0623a0 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java @@ -42,6 +42,7 @@ public class ActionScript2Test extends ActionScript2TestBase { public void init() throws IOException, InterruptedException { //Main.initLogging(false); Configuration.autoDeobfuscate.set(false); + Configuration.simplifyExpressions.set(false); Configuration.decompile.set(true); Configuration.registerNameFormat.set("_loc%d_"); swf = new SWF(new BufferedInputStream(new FileInputStream("testdata/as2/as2.swf")), false); diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java index bc5b26dfa..c1e77c76a 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java @@ -70,7 +70,7 @@ public class ActionScript3Test extends ActionScriptTestBase { assertTrue(clsIndex > -1); this.abc = tag.getABC(); Configuration.autoDeobfuscate.set(false); - Configuration._simplifyExpressions.set(false); + Configuration.simplifyExpressions.set(false); Configuration.decompile.set(true); Configuration.registerNameFormat.set("_loc%d_"); @@ -80,7 +80,7 @@ public class ActionScript3Test extends ActionScriptTestBase { private void decompileMethod(String methodName, String expectedResult, boolean isStatic) { int bodyIndex = abc.findMethodBodyByName(clsIndex, methodName); assertTrue(bodyIndex > -1); - HighlightedTextWriter writer = null; + HighlightedTextWriter writer; try { List ts = new ArrayList<>(); ts.add(abc.instance_info.get(clsIndex).instance_traits); @@ -89,6 +89,7 @@ public class ActionScript3Test extends ActionScriptTestBase { abc.bodies.get(bodyIndex).toString(methodName, ScriptExportMode.AS, abc, null, writer, new ArrayList<>()); } catch (InterruptedException ex) { fail(); + return; } String actualResult = cleanPCode(writer.toString()); expectedResult = cleanPCode(expectedResult); diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java b/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java index 105e18910..3e39158a2 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java @@ -75,14 +75,15 @@ public abstract class MainFrameMenu implements MenuBuilder { private ConfigurationItemChangeListener configListenerAutoDeobfuscate; + private ConfigurationItemChangeListener configListenerSimplifyExpressions; + private ConfigurationItemChangeListener configListenerInternalFlashViewer; private ConfigurationItemChangeListener configListenerParallelSpeedUp; private ConfigurationItemChangeListener configListenerDecompile; - private ConfigurationItemChangeListener configListenerCacheOnDisk; - + //private ConfigurationItemChangeListener configListenerCacheOnDisk; private ConfigurationItemChangeListener configListenerGotoMainClassOnStartup; private ConfigurationItemChangeListener configListenerAutoRenameIdentifiers; @@ -557,7 +558,7 @@ public abstract class MainFrameMenu implements MenuBuilder { Configuration.autoRenameIdentifiers.set(selected); } - protected void cacheOnDiskActionPerformed(ActionEvent evt) { + /*protected void cacheOnDiskActionPerformed(ActionEvent evt) { AbstractButton button = (AbstractButton) evt.getSource(); boolean selected = button.isSelected(); @@ -567,8 +568,7 @@ public abstract class MainFrameMenu implements MenuBuilder { } else { Cache.setStorageType(Cache.STORAGE_MEMORY); } - } - + }*/ protected void setLanguageActionPerformed(ActionEvent evt) { new SelectLanguageDialog().display(); } @@ -628,6 +628,14 @@ public abstract class MainFrameMenu implements MenuBuilder { mainFrame.getPanel().reload(true); } + protected void simplifyExpressionsActionPerformed(ActionEvent evt) { + AbstractButton button = (AbstractButton) evt.getSource(); + boolean selected = button.isSelected(); + + Configuration.simplifyExpressions.set(selected); + mainFrame.getPanel().autoDeobfuscateChanged(); + } + protected void autoDeobfuscationActionPerformed(ActionEvent evt) { AbstractButton button = (AbstractButton) evt.getSource(); boolean selected = button.isSelected(); @@ -883,10 +891,11 @@ public abstract class MainFrameMenu implements MenuBuilder { addMenuItem("/settings", translate("menu.settings"), null, null, 0, null, false, null, false); addToggleMenuItem("/settings/autoDeobfuscation", translate("menu.settings.autodeobfuscation"), null, null, this::autoDeobfuscationActionPerformed, 0, null); + addToggleMenuItem("/settings/simplifyExpressions", translate("menu.settings.simplifyExpressions"), null, null, this::simplifyExpressionsActionPerformed, 0, null); addToggleMenuItem("/settings/internalViewer", translate("menu.settings.internalflashviewer"), null, null, this::internalViewerSwitchActionPerformed, 0, null); addToggleMenuItem("/settings/parallelSpeedUp", translate("menu.settings.parallelspeedup"), null, null, this::parallelSpeedUpActionPerformed, 0, null); addToggleMenuItem("/settings/disableDecompilation", translate("menu.settings.disabledecompilation"), null, null, this::disableDecompilationActionPerformed, 0, null); - addToggleMenuItem("/settings/cacheOnDisk", translate("menu.settings.cacheOnDisk"), null, null, this::cacheOnDiskActionPerformed, 0, null); + //addToggleMenuItem("/settings/cacheOnDisk", translate("menu.settings.cacheOnDisk"), null, null, this::cacheOnDiskActionPerformed, 0, null); addToggleMenuItem("/settings/gotoMainClassOnStartup", translate("menu.settings.gotoMainClassOnStartup"), null, null, this::gotoDucumentClassOnStartupActionPerformed, 0, null); addToggleMenuItem("/settings/autoRenameIdentifiers", translate("menu.settings.autoRenameIdentifiers"), null, null, this::autoRenameIdentifiersActionPerformed, 0, null); addToggleMenuItem("/settings/autoOpenLoadedSWFs", translate("menu.settings.autoOpenLoadedSWFs"), null, null, this::autoOpenLoadedSWFsActionPerformed, 0, null); @@ -919,6 +928,11 @@ public abstract class MainFrameMenu implements MenuBuilder { setMenuChecked("/settings/autoDeobfuscation", newValue); }); + setMenuChecked("/settings/simplifyExpressions", Configuration.simplifyExpressions.get()); + Configuration.simplifyExpressions.addListener(configListenerSimplifyExpressions = (Boolean newValue) -> { + setMenuChecked("/settings/simplifyExpressions", newValue); + }); + setMenuChecked("/settings/internalViewer", Configuration.internalFlashViewer.get() || externalFlashPlayerUnavailable); Configuration.internalFlashViewer.addListener(configListenerInternalFlashViewer = (Boolean newValue) -> { setMenuChecked("/settings/internalViewer", newValue || externalFlashPlayerUnavailable); @@ -934,11 +948,10 @@ public abstract class MainFrameMenu implements MenuBuilder { setMenuChecked("/settings/disableDecompilation", !newValue); }); - setMenuChecked("/settings/cacheOnDisk", Configuration.cacheOnDisk.get()); + /*setMenuChecked("/settings/cacheOnDisk", Configuration.cacheOnDisk.get()); Configuration.cacheOnDisk.addListener(configListenerCacheOnDisk = (Boolean newValue) -> { setMenuChecked("/settings/cacheOnDisk", newValue); - }); - + });*/ setMenuChecked("/settings/gotoMainClassOnStartup", Configuration.gotoMainClassOnStartup.get()); Configuration.gotoMainClassOnStartup.addListener(configListenerGotoMainClassOnStartup = (Boolean newValue) -> { setMenuChecked("/settings/gotoMainClassOnStartup", newValue); @@ -1116,10 +1129,11 @@ public abstract class MainFrameMenu implements MenuBuilder { manager.removeKeyEventDispatcher(keyEventDispatcher); Configuration.autoDeobfuscate.removeListener(configListenerAutoDeobfuscate); + Configuration.simplifyExpressions.removeListener(configListenerSimplifyExpressions); Configuration.internalFlashViewer.removeListener(configListenerInternalFlashViewer); Configuration.parallelSpeedUp.removeListener(configListenerParallelSpeedUp); Configuration.decompile.removeListener(configListenerDecompile); - Configuration.cacheOnDisk.removeListener(configListenerCacheOnDisk); + //Configuration.cacheOnDisk.removeListener(configListenerCacheOnDisk); Configuration.gotoMainClassOnStartup.removeListener(configListenerGotoMainClassOnStartup); Configuration.autoRenameIdentifiers.removeListener(configListenerAutoRenameIdentifiers); Configuration.autoOpenLoadedSWFs.removeListener(configListenerAutoOpenLoadedSWFs); diff --git a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties index bf283823b..f0f7a1305 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties @@ -426,3 +426,6 @@ config.description.useRegExprLiteral = Use /pattern/mod syntax when decompiling config.name.handleSkinPartsAutomatically = Handle [SkinPart] metadata automatically config.description.handleSkinPartsAutomatically = Decompiles and direct edits [SkinPart] metadata automatically. When turned off, _skinParts attribute and its getter method is visible and manually editable. + +config.name.simplifyExpressions = Simplify expressions +config.description.simplifyExpressions = Evaluate and simplify expressions to make code more readable diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties index 025f1aed2..2d9a0f022 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties @@ -707,3 +707,5 @@ message.imported.swf.manually = Cannot load imported SWF\n%url%\nThe file or URL message.warning.hexViewNotUpToDate = Hex View is not up-to-date. Please save and reload the file to update Hex View. message.font.replace.updateTexts = Some characters were replaced. Do you want to update the existing texts? + +menu.settings.simplifyExpressions = Simplify expressions \ No newline at end of file