diff --git a/libsrc/ffdec_lib/src/com/jpexs/helpers/Helper.java b/libsrc/ffdec_lib/src/com/jpexs/helpers/Helper.java index 9dd0f1976..0b2218c72 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/helpers/Helper.java +++ b/libsrc/ffdec_lib/src/com/jpexs/helpers/Helper.java @@ -42,6 +42,7 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.lang.reflect.Field; +import java.lang.reflect.Modifier; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; @@ -782,8 +783,17 @@ public class Helper { public static void emptyObject(Object obj) { Field[] fields = obj.getClass().getDeclaredFields(); for (Field f : fields) { + if ((f.getModifiers() & Modifier.STATIC) == Modifier.STATIC + || f.getType().isPrimitive()) { + continue; + } try { f.setAccessible(true); + + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(f, f.getModifiers() & ~Modifier.FINAL); + Object v = f.get(obj); if (v != null) { try { @@ -806,7 +816,8 @@ public class Helper { f.set(obj, null); } - } catch (UnsupportedOperationException | SecurityException | IllegalArgumentException | IllegalAccessException ex) { + } catch (UnsupportedOperationException | SecurityException | IllegalArgumentException | IllegalAccessException | NoSuchFieldException ex) { + throw new Error(ex); } } } diff --git a/src/com/jpexs/browsers/cache/chrome/ChromeCache.java b/src/com/jpexs/browsers/cache/chrome/ChromeCache.java index f0ab181c7..38128061f 100644 --- a/src/com/jpexs/browsers/cache/chrome/ChromeCache.java +++ b/src/com/jpexs/browsers/cache/chrome/ChromeCache.java @@ -108,8 +108,10 @@ public class ChromeCache implements CacheImplementation { File systemTempDir = new File(System.getProperty("java.io.tmpdir")); File originalIndexFile = new File(cacheDir + File.separator + "index"); tempDir = new File(systemTempDir, "cacheView" + System.identityHashCode(this)); + tempDir.deleteOnExit(); tempDir.mkdir(); indexFile = new File(tempDir, "index"); + indexFile.deleteOnExit(); try { Files.copy(originalIndexFile.toPath(), indexFile.toPath(), StandardCopyOption.REPLACE_EXISTING); } catch (IOException ex) { @@ -120,6 +122,7 @@ public class ChromeCache implements CacheImplementation { dataFiles = new ArrayList<>(); for (int i = 0; (originalDataFile = new File(cacheDir, "data_" + i)).exists(); i++) { File dataFile = new File(tempDir, "data_" + i); + dataFile.deleteOnExit(); dataFiles.add(dataFile); try { Files.copy(originalDataFile.toPath(), dataFile.toPath(), StandardCopyOption.REPLACE_EXISTING); diff --git a/src/com/jpexs/decompiler/flash/gui/ErrorLogFrame.java b/src/com/jpexs/decompiler/flash/gui/ErrorLogFrame.java index 2080fc3cb..812a334f0 100644 --- a/src/com/jpexs/decompiler/flash/gui/ErrorLogFrame.java +++ b/src/com/jpexs/decompiler/flash/gui/ErrorLogFrame.java @@ -16,6 +16,7 @@ */ package com.jpexs.decompiler.flash.gui; +import com.jpexs.helpers.Helper; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; @@ -318,4 +319,11 @@ public class ErrorLogFrame extends AppFrame { } log(level, msg, sw.toString()); } + + @Override + public void dispose() { + removeAll(); + Helper.emptyObject(this); + super.dispose(); + } } diff --git a/src/com/jpexs/decompiler/flash/gui/LoadingDialog.java b/src/com/jpexs/decompiler/flash/gui/LoadingDialog.java index 1df41bf1b..57ba99321 100644 --- a/src/com/jpexs/decompiler/flash/gui/LoadingDialog.java +++ b/src/com/jpexs/decompiler/flash/gui/LoadingDialog.java @@ -18,11 +18,13 @@ package com.jpexs.decompiler.flash.gui; import com.jpexs.decompiler.flash.ApplicationInfo; import com.jpexs.helpers.CancellableWorker; +import com.jpexs.helpers.Helper; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; import javax.swing.BorderFactory; import javax.swing.JLabel; import javax.swing.JPanel; @@ -110,4 +112,15 @@ public class LoadingDialog extends AppDialog { setSize(Math.max(300, 150 + getFontMetrics(new JLabel().getFont()).stringWidth(translate("loadingpleasewait"))), siz.height); View.centerScreen(this); } + + @Override + public void dispose() { + removeAll(); + for (WindowListener windowListener : getWindowListeners()) { + removeWindowListener(windowListener); + } + + Helper.emptyObject(this); + super.dispose(); + } } diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameClassic.java b/src/com/jpexs/decompiler/flash/gui/MainFrameClassic.java index 30671750d..2ad636cdf 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainFrameClassic.java +++ b/src/com/jpexs/decompiler/flash/gui/MainFrameClassic.java @@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.gui; import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.gui.player.FlashPlayerPanel; +import com.jpexs.helpers.Helper; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; @@ -126,7 +127,9 @@ public final class MainFrameClassic extends AppFrame implements MainFrame { public void dispose() { removeAll(); mainMenu.dispose(); + Helper.emptyObject(mainMenu); panel.dispose(); + Helper.emptyObject(this); super.dispose(); } } diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameRibbon.java b/src/com/jpexs/decompiler/flash/gui/MainFrameRibbon.java index 86c5d6459..f0ee16ed8 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainFrameRibbon.java +++ b/src/com/jpexs/decompiler/flash/gui/MainFrameRibbon.java @@ -19,6 +19,7 @@ package com.jpexs.decompiler.flash.gui; import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.gui.player.FlashPlayerPanel; import com.jpexs.decompiler.flash.treeitems.SWFList; +import com.jpexs.helpers.Helper; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; @@ -173,7 +174,9 @@ public final class MainFrameRibbon extends AppRibbonFrame { public void dispose() { removeAll(); mainMenu.dispose(); + Helper.emptyObject(mainMenu); panel.dispose(); + Helper.emptyObject(this); super.dispose(); } } diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 1a47b835e..c67fcc61c 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -3112,9 +3112,6 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se @Override public void free() { isFreeing = true; - Helper.emptyObject(mainMenu); - Helper.emptyObject(statusPanel); - Helper.emptyObject(this); } public void setErrorState(ErrorState errorState) { @@ -3220,10 +3217,14 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se container.removeAll(); container.setLayout(null); - Helper.emptyObject(container); + if (container instanceof TagEditorPanel) { + Helper.emptyObject(container); + } } public void dispose() { + setDropTarget(null); disposeInner(this); + Helper.emptyObject(this); } } diff --git a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java index a4ddab6af..219808230 100644 --- a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java @@ -190,20 +190,6 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel this.mainPanel = mainPanel; this.flashPanel = flashPanel; - Runtime.getRuntime().addShutdownHook(new Thread() { - - @Override - public void run() { - if (tempFile != null) { - try { - tempFile.delete(); - } catch (Exception ex) { - } - } - } - - }); - viewerCards = new JPanel(); viewerCards.setLayout(new CardLayout()); @@ -605,6 +591,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel if (tempFile != null) { tempFile.delete(); } + tempFile = File.createTempFile("ffdec_view_", ".swf"); tempFile.deleteOnExit(); diff --git a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java index 0a42fcb18..412b193d6 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java @@ -61,12 +61,10 @@ import com.jpexs.decompiler.flash.gui.abc.tablemodels.UIntTableModel; import com.jpexs.decompiler.flash.gui.controls.JPersistentSplitPane; import com.jpexs.decompiler.flash.gui.editor.LinkHandler; import com.jpexs.decompiler.flash.gui.tagtree.TagTreeModel; -import com.jpexs.decompiler.flash.helpers.Freed; import com.jpexs.decompiler.flash.tags.ABCContainerTag; import com.jpexs.decompiler.flash.treeitems.TreeItem; import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.helpers.CancellableWorker; -import com.jpexs.helpers.Helper; import java.awt.BorderLayout; import java.awt.Cursor; import java.awt.FlowLayout; @@ -114,23 +112,21 @@ import jsyntaxpane.TokenType; * * @author JPEXS */ -public class ABCPanel extends JPanel implements ItemListener, SearchListener, Freed, TagEditorPanel { +public class ABCPanel extends JPanel implements ItemListener, SearchListener, TagEditorPanel { - private MainPanel mainPanel; + private final MainPanel mainPanel; - public TraitsList navigator; + public final TraitsList navigator; public ABC abc; - public JComboBox abcComboBox; + public final DecompiledEditorPane decompiledTextArea; - public DecompiledEditorPane decompiledTextArea; + public final JScrollPane decompiledScrollPane; - public JScrollPane decompiledScrollPane; + private final JPersistentSplitPane splitPane; - public JPersistentSplitPane splitPane; - - private JTable constantTable; + private final JTable constantTable; public JComboBox constantTypeList; @@ -138,25 +134,25 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener searchPanel; + private final SearchPanel searchPanel; private NewTraitDialog newTraitDialog; - public JLabel scriptNameLabel; + public final JLabel scriptNameLabel; - private JLabel experimentalLabel = new JLabel(AppStrings.translate("action.edit.experimental")); + private final JLabel experimentalLabel = new JLabel(AppStrings.translate("action.edit.experimental")); - private JButton editDecompiledButton = new JButton(AppStrings.translate("button.edit"), View.getIcon("edit16")); + private final JButton editDecompiledButton = new JButton(AppStrings.translate("button.edit"), View.getIcon("edit16")); - private JButton saveDecompiledButton = new JButton(AppStrings.translate("button.save"), View.getIcon("save16")); + private final JButton saveDecompiledButton = new JButton(AppStrings.translate("button.save"), View.getIcon("save16")); - private JButton cancelDecompiledButton = new JButton(AppStrings.translate("button.cancel"), View.getIcon("cancel16")); + private final JButton cancelDecompiledButton = new JButton(AppStrings.translate("button.cancel"), View.getIcon("cancel16")); private String lastDecompiled = null; @@ -280,19 +276,6 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener