diff --git a/trunk/src/com/jpexs/asdec/abc/ABC.java b/trunk/src/com/jpexs/asdec/abc/ABC.java index e33980ba8..a72ed8ca6 100644 --- a/trunk/src/com/jpexs/asdec/abc/ABC.java +++ b/trunk/src/com/jpexs/asdec/abc/ABC.java @@ -70,6 +70,14 @@ public class ABC { } } + public int removeDeadCode() { + int rem=0; + for(MethodBody body:bodies){ + rem+=body.removeDeadCode(); + } + return rem; + } + public int deobfuscateIdentifiers() { int ret = 0; for (int i = 1; i < instance_info.length; i++) { diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/AVM2Code.java b/trunk/src/com/jpexs/asdec/abc/avm2/AVM2Code.java index 0aac7b888..e88662a63 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/AVM2Code.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/AVM2Code.java @@ -2463,4 +2463,70 @@ public class AVM2Code { } return stats; } + + private void visitCode(int ip, boolean visited[]) { + while ((ip < visited.length) && (!visited[ip])) { + visited[ip] = true; + AVM2Instruction ins = code.get(ip); + if (ins.definition instanceof LookupSwitchIns) { + try { + for(int i=2;i= 0; i--) { + if (!visited[i]) { + removeInstruction(i, body); + cnt++; + } + } + for (int i = code.size() - 1; i >= 0; i--) { + AVM2Instruction ins = code.get(i); + if (ins.definition instanceof JumpIns) { + if (ins.operands[0] == 0) { + removeInstruction(i, body); + cnt++; + } + } + } + return cnt; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/gui/DetailPanel.java b/trunk/src/com/jpexs/asdec/abc/gui/DetailPanel.java index 6bda0ee5d..01c905830 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/DetailPanel.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/DetailPanel.java @@ -117,6 +117,7 @@ public class DetailPanel extends JPanel implements ActionListener { public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("EDITDETAIL")) { setEditMode(true); + methodTraitPanel.methodCodePanel.focusEditor(); } if (e.getActionCommand().equals("CANCELDETAIL")) { setEditMode(false); diff --git a/trunk/src/com/jpexs/asdec/abc/gui/MethodCodePanel.java b/trunk/src/com/jpexs/asdec/abc/gui/MethodCodePanel.java index e31ca8b73..8e94d6c6c 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/MethodCodePanel.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/MethodCodePanel.java @@ -36,6 +36,10 @@ public class MethodCodePanel extends JPanel implements ActionListener { private ASMSourceEditorPane sourceTextArea; public JPanel buttonsPanel; + public void focusEditor(){ + sourceTextArea.requestFocusInWindow(); + } + public void setIgnoreCarret(boolean ignoreCarret) { sourceTextArea.setIgnoreCarret(ignoreCarret); } diff --git a/trunk/src/com/jpexs/asdec/abc/types/MethodBody.java b/trunk/src/com/jpexs/asdec/abc/types/MethodBody.java index d3d0b4244..f4ffacc71 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/MethodBody.java +++ b/trunk/src/com/jpexs/asdec/abc/types/MethodBody.java @@ -47,6 +47,10 @@ public class MethodBody implements Cloneable { s += "\r\nCode:\r\n" + code.toString(); return s; } + + public int removeDeadCode(){ + return code.removeDeadCode(this); + } public HashMap getLocalRegNames(ABC abc) { HashMap ret = new HashMap(); diff --git a/trunk/src/com/jpexs/asdec/gui/MainFrame.java b/trunk/src/com/jpexs/asdec/gui/MainFrame.java index 139e6aebe..be13fe36b 100644 --- a/trunk/src/com/jpexs/asdec/gui/MainFrame.java +++ b/trunk/src/com/jpexs/asdec/gui/MainFrame.java @@ -228,9 +228,19 @@ public class MainFrame extends JFrame implements ActionListener { miRenameIdentifiers.setActionCommand("RENAMEIDENTIFIERS"); miRenameIdentifiers.addActionListener(this); + JMenuItem miRemoveDeadCode = new JMenuItem("Remove dead code"); + miRemoveDeadCode.setActionCommand("REMOVEDEADCODE"); + miRemoveDeadCode.addActionListener(this); + + JMenuItem miRemoveDeadCodeAll = new JMenuItem("Remove all dead code"); + miRemoveDeadCodeAll.setActionCommand("REMOVEDEADCODEALL"); + miRemoveDeadCodeAll.addActionListener(this); + menuDeobfuscation.add(miSubLimiter); menuDeobfuscation.add(miRenameIdentifiers); + menuDeobfuscation.add(miRemoveDeadCode); + menuDeobfuscation.add(miRemoveDeadCodeAll); JMenu menuTools = new JMenu("Tools"); @@ -713,6 +723,33 @@ public class MainFrame extends JFrame implements ActionListener { JOptionPane.showMessageDialog(null, "No new version available."); } } + + if (e.getActionCommand().startsWith("REMOVEDEADCODE")) { + Main.startWork("Removing dead code..."); + final boolean all = e.getActionCommand().endsWith("ALL"); + new SwingWorker() { + @Override + protected Object doInBackground() throws Exception { + int cnt = 0; + if (all) { + for (DoABCTag tag : abcPanel.list) { + cnt += tag.abc.removeDeadCode(); + } + }else{ + int bi=abcPanel.detailPanel.methodTraitPanel.methodCodePanel.getBodyIndex(); + if(bi!=-1){ + cnt += abcPanel.abc.bodies[bi].removeDeadCode(); + } + abcPanel.detailPanel.methodTraitPanel.methodCodePanel.setBodyIndex(bi, abcPanel.abc); + } + Main.stopWork(); + JOptionPane.showMessageDialog(null, "Instructions removed: " + cnt); + abcPanel.reload(); + return true; + } + }.execute(); + } + if (e.getActionCommand().equals("RENAMEIDENTIFIERS")) { if (JOptionPane.showConfirmDialog(null, "Following procedure can damage SWF file which can be then unplayable.\r\nUSE IT ON YOUR OWN RISK. Do you want to continue?", "Warning", JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.OK_OPTION) {