diff --git a/lib/flashdebugger.jar b/lib/flashdebugger.jar index 6f2c726d5..125c3fd26 100644 Binary files a/lib/flashdebugger.jar and b/lib/flashdebugger.jar differ diff --git a/src/com/jpexs/decompiler/flash/gui/DebugPanel.java b/src/com/jpexs/decompiler/flash/gui/DebugPanel.java index b23c9ac94..62427a7c2 100644 --- a/src/com/jpexs/decompiler/flash/gui/DebugPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/DebugPanel.java @@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.gui; import com.jpexs.debugger.flash.Variable; import com.jpexs.debugger.flash.messages.in.InBreakAtExt; +import com.jpexs.debugger.flash.messages.in.InConstantPool; import com.jpexs.debugger.flash.messages.in.InFrame; import com.jpexs.decompiler.flash.gui.DebuggerHandler.BreakListener; import com.jpexs.decompiler.flash.gui.abc.ABCPanel; @@ -74,6 +75,8 @@ public class DebugPanel extends JPanel { private JTable stackTable; + private JTable constantPoolTable; + private JTabbedPane varTabs; private BreakListener listener; @@ -88,7 +91,7 @@ public class DebugPanel extends JPanel { public static enum SelectedTab { - LOG, STACK, SCOPECHAIN, LOCALS, REGISTERS, CALLSTACK + LOG, STACK, SCOPECHAIN, LOCALS, REGISTERS, CALLSTACK, CONSTANTPOOL } public synchronized boolean isLoading() { @@ -202,6 +205,7 @@ public class DebugPanel extends JPanel { callStackTable = new JTable(); stackTable = new JTable(); + constantPoolTable = new JTable(); traceLogTextarea = new JTextArea(); traceLogTextarea.setEditable(false); traceLogTextarea.setOpaque(false); @@ -381,18 +385,48 @@ public class DebugPanel extends JPanel { DefaultTableModel tm = new DefaultTableModel(data, new Object[]{ AppStrings.translate("callStack.header.file"), AppStrings.translate("callStack.header.line") - }); + }) { + @Override + public boolean isCellEditable(int row, int column) { + return false; + } + + }; callStackTable.setModel(tm); Object[][] data2 = new Object[info.stacks.size()][1]; for (int i = 0; i < info.stacks.size(); i++) { data2[i][0] = info.stacks.get(i); } - stackTable.setModel(new DefaultTableModel(data2, new Object[]{AppStrings.translate("stack.header.item")})); + stackTable.setModel(new DefaultTableModel(data2, new Object[]{AppStrings.translate("stack.header.item")}) { + @Override + public boolean isCellEditable(int row, int column) { + return false; + } + + }); } else { callStackTable.setModel(new DefaultTableModel()); stackTable.setModel(new DefaultTableModel()); } + InConstantPool cpool = Main.getDebugHandler().getConstantPool(); + if (cpool != null) { + Object[][] data2 = new Object[cpool.vars.size()][2]; + for (int i = 0; i < cpool.vars.size(); i++) { + data2[i][0] = cpool.ids.get(i); + data2[i][1] = cpool.vars.get(i).value; + } + constantPoolTable.setModel(new DefaultTableModel(data2, new Object[]{ + AppStrings.translate("constantpool.header.id"), + AppStrings.translate("constantpool.header.value") + }) { + @Override + public boolean isCellEditable(int row, int column) { + return false; + } + + }); + } varTabs.removeAll(); tabTypes.clear(); @@ -419,6 +453,14 @@ public class DebugPanel extends JPanel { varTabs.addTab(AppStrings.translate("variables.header.scopeChain"), pa); } + if (constantPoolTable.getRowCount() > 0) { + tabTypes.add(SelectedTab.CONSTANTPOOL); + + pa = new JPanel(new BorderLayout()); + pa.add(new JScrollPane(constantPoolTable), BorderLayout.CENTER); + varTabs.addTab(AppStrings.translate("constantpool.header"), pa); + } + if (callStackTable.getRowCount() > 0) { tabTypes.add(SelectedTab.CALLSTACK); diff --git a/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java b/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java index 5869e2ecb..899703ea9 100644 --- a/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java +++ b/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java @@ -27,6 +27,7 @@ import com.jpexs.debugger.flash.messages.in.InAskBreakpoints; import com.jpexs.debugger.flash.messages.in.InBreakAt; import com.jpexs.debugger.flash.messages.in.InBreakAtExt; import com.jpexs.debugger.flash.messages.in.InBreakReason; +import com.jpexs.debugger.flash.messages.in.InConstantPool; import com.jpexs.debugger.flash.messages.in.InContinue; import com.jpexs.debugger.flash.messages.in.InFrame; import com.jpexs.debugger.flash.messages.in.InGetSwd; @@ -292,6 +293,7 @@ public class DebuggerHandler implements DebugConnectionListener { } private InFrame frame; + private InConstantPool pool; private InBreakAtExt breakInfo; @@ -373,6 +375,7 @@ public class DebuggerHandler implements DebugConnectionListener { } try { frame = commands.getFrame(0); + pool = commands.getConstantPool(0); } catch (IOException ex) { //ignore } @@ -407,6 +410,7 @@ public class DebuggerHandler implements DebugConnectionListener { public void disconnect() { frame = null; + pool = null; breakInfo = null; breakReason = null; connected = false; @@ -659,6 +663,7 @@ public class DebuggerHandler implements DebugConnectionListener { Main.startWork(AppStrings.translate("work.breakat") + newBreakScriptName + ":" + message.line + " " + AppStrings.translate("debug.break.reason." + reason), null); } frame = commands.getFrame(0); + pool = commands.getConstantPool(0); for (BreakListener l : breakListeners) { l.breakAt(newBreakScriptName, message.line, @@ -754,4 +759,11 @@ public class DebuggerHandler implements DebugConnectionListener { Logger.getLogger(DebuggerHandler.class.getName()).log(Level.FINEST, "sending bps finished"); } + + public synchronized InConstantPool getConstantPool() { + if (!paused) { + return null; + } + return pool; + } } diff --git a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java index 5513d3bd2..1dca60caa 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java @@ -507,6 +507,13 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener