mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-06-08 18:46:12 +00:00
Better line start detection
Fixed debug info injection
This commit is contained in:
@@ -386,7 +386,7 @@ public class AdvancedSettingsDialog extends AppDialog {
|
||||
p.setMaximumSize(new Dimension(Integer.MAX_VALUE, tf.getPreferredSize().height));
|
||||
p.add(tf, BorderLayout.CENTER);
|
||||
JButton butSelect = new JButton(View.getIcon("folderopen16"));
|
||||
butSelect.setToolTipText(AppStrings.translate("FileChooser.openButtonText"));
|
||||
butSelect.setToolTipText(ResourceBundle.getBundle(AppStrings.getResourcePath(MainFrame.class)).getString("FileChooser.openButtonText"));
|
||||
butSelect.setMargin(new Insets(2, 2, 2, 2));
|
||||
butSelect.addActionListener((ActionEvent e) -> {
|
||||
tf.setText(selectConfigFile(item, tf.getText(), confFile.value()));
|
||||
|
||||
@@ -21,13 +21,19 @@ import com.jpexs.debugger.flash.DebugMessageListener;
|
||||
import com.jpexs.debugger.flash.Debugger;
|
||||
import com.jpexs.debugger.flash.DebuggerCommands;
|
||||
import com.jpexs.debugger.flash.DebuggerConnection;
|
||||
import com.jpexs.debugger.flash.Variable;
|
||||
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.InContinue;
|
||||
import com.jpexs.debugger.flash.messages.in.InFrame;
|
||||
import com.jpexs.debugger.flash.messages.in.InNumScript;
|
||||
import com.jpexs.debugger.flash.messages.in.InScript;
|
||||
import com.jpexs.debugger.flash.messages.in.InSetBreakpoint;
|
||||
import com.jpexs.debugger.flash.messages.in.InSwfInfo;
|
||||
import com.jpexs.debugger.flash.messages.in.InVersion;
|
||||
import com.jpexs.debugger.flash.messages.out.OutGetBreakReason;
|
||||
import com.jpexs.decompiler.flash.abc.ClassPath;
|
||||
import com.jpexs.decompiler.flash.abc.ScriptPack;
|
||||
import com.jpexs.decompiler.graph.DottedChain;
|
||||
@@ -55,6 +61,61 @@ public class DebuggerHandler implements DebugConnectionListener {
|
||||
private Map<Integer, ClassPath> modulePaths = new HashMap<>();
|
||||
private Map<ClassPath, Integer> classToModule = new HashMap<>();
|
||||
|
||||
private InFrame frame;
|
||||
|
||||
public static interface VariableChangedListener {
|
||||
|
||||
public void variablesChanged();
|
||||
|
||||
}
|
||||
|
||||
private List<VariableChangedListener> listeners = new ArrayList<>();
|
||||
|
||||
public void addVariableChangedListener(VariableChangedListener l) {
|
||||
listeners.add(l);
|
||||
}
|
||||
|
||||
public void removeVariableChangedListener(VariableChangedListener l) {
|
||||
listeners.remove(l);
|
||||
}
|
||||
|
||||
public void setVariableValue(int index, String value) {
|
||||
//variables.get(index).value = value
|
||||
//TODO:
|
||||
}
|
||||
|
||||
public int getNumVariables() {
|
||||
if (frame == null) {
|
||||
return 0;
|
||||
}
|
||||
return frame.variables.size();
|
||||
}
|
||||
|
||||
public Variable getFrameVariable() {
|
||||
if (frame == null) {
|
||||
return null;
|
||||
}
|
||||
return frame.frame;
|
||||
}
|
||||
|
||||
public Variable getVariable(int index) {
|
||||
if (frame == null) {
|
||||
return null;
|
||||
}
|
||||
return frame.variables.get(index);
|
||||
}
|
||||
|
||||
public int getNumRegisters() {
|
||||
if (frame == null) {
|
||||
return 0;
|
||||
}
|
||||
return frame.registers.size();
|
||||
}
|
||||
|
||||
public Variable getRegister(int index) {
|
||||
return frame.registers.get(index);
|
||||
}
|
||||
|
||||
public int moduleIdOf(ScriptPack pack) {
|
||||
if (classToModule.containsKey(pack.getClassPath())) {
|
||||
return classToModule.get(pack.getClassPath());
|
||||
@@ -89,6 +150,16 @@ public class DebuggerHandler implements DebugConnectionListener {
|
||||
return commands;
|
||||
}
|
||||
|
||||
private static void enlog(Class<?> cls) {
|
||||
Level level = Level.FINEST;
|
||||
|
||||
Logger mylog = Logger.getLogger(cls.getName());
|
||||
mylog.setLevel(level);
|
||||
ConsoleHandler ch = new ConsoleHandler();
|
||||
ch.setLevel(level);
|
||||
mylog.addHandler(ch);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void connected(DebuggerConnection con) {
|
||||
|
||||
@@ -98,15 +169,14 @@ public class DebuggerHandler implements DebugConnectionListener {
|
||||
|
||||
Main.getMainFrame().getPanel().updateMenu();
|
||||
|
||||
Level level = Level.FINER;
|
||||
|
||||
Logger rootLog = Logger.getLogger(Debugger.class.getName());
|
||||
rootLog.setLevel(level);
|
||||
ConsoleHandler ch = new ConsoleHandler();
|
||||
ch.setLevel(level);
|
||||
rootLog.addHandler(ch);
|
||||
//rootLog.getHandlers()[0].setLevel(level);
|
||||
|
||||
//enlog(DebuggerConnection.class);
|
||||
//enlog(DebuggerCommands.class);
|
||||
try {
|
||||
//rootLog.getHandlers()[0].setLevel(level);
|
||||
con.getMessage(InVersion.class);
|
||||
} catch (IOException ex) {
|
||||
Logger.getLogger(DebuggerHandler.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
commands = new DebuggerCommands(con);
|
||||
try {
|
||||
commands.stopWarning();
|
||||
@@ -163,13 +233,33 @@ public class DebuggerHandler implements DebugConnectionListener {
|
||||
synchronized (DebuggerHandler.this) {
|
||||
paused = true;
|
||||
}
|
||||
Main.getMainFrame().getPanel().updateMenu();
|
||||
Logger.getLogger(DebuggerHandler.class.getName()).log(Level.INFO, "break at {0}:{1}", new Object[]{moduleNames.get(message.file), message.line});
|
||||
if (!modulePaths.containsKey(message.file)) {
|
||||
return;
|
||||
View.execInEventDispatchLater(new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
Main.getMainFrame().getPanel().updateMenu();
|
||||
Logger.getLogger(DebuggerHandler.class.getName()).log(Level.INFO, "break at {0}:{1}", new Object[]{moduleNames.get(message.file), message.line});
|
||||
if (!modulePaths.containsKey(message.file)) {
|
||||
return;
|
||||
}
|
||||
String cls = modulePaths.get(message.file).toString();
|
||||
try {
|
||||
InBreakAtExt bex = con.getMessage(InBreakAtExt.class);
|
||||
InBreakReason ibr = con.sendMessage(new OutGetBreakReason(con), InBreakReason.class);
|
||||
frame = commands.getFrame(0);
|
||||
|
||||
for (VariableChangedListener l : listeners) {
|
||||
l.variablesChanged();
|
||||
}
|
||||
|
||||
} catch (IOException ex) {
|
||||
//ignore
|
||||
}
|
||||
Main.getMainFrame().getPanel().debuggerBreakAt(Main.getMainFrame().getPanel().getCurrentSwf(), cls, message.line);
|
||||
}
|
||||
}
|
||||
String cls = modulePaths.get(message.file).toString();
|
||||
Main.getMainFrame().getPanel().debuggerBreakAt(Main.getMainFrame().getPanel().getCurrentSwf(), cls, message.line);
|
||||
);
|
||||
//dc.sendContinue();
|
||||
}
|
||||
});
|
||||
@@ -187,7 +277,9 @@ public class DebuggerHandler implements DebugConnectionListener {
|
||||
}
|
||||
}
|
||||
}
|
||||
Main.getMainFrame().getPanel().refreshBreakPoints();
|
||||
|
||||
Main.getMainFrame()
|
||||
.getPanel().refreshBreakPoints();
|
||||
connected = true;
|
||||
} catch (IOException ex) {
|
||||
connected = false;
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
*/
|
||||
package com.jpexs.decompiler.flash.gui.abc;
|
||||
|
||||
import com.jpexs.debugger.flash.Variable;
|
||||
import com.jpexs.decompiler.flash.SWF;
|
||||
import com.jpexs.decompiler.flash.abc.ABC;
|
||||
import com.jpexs.decompiler.flash.abc.ClassPath;
|
||||
@@ -40,6 +41,7 @@ import com.jpexs.decompiler.flash.abc.usages.TraitMultinameUsage;
|
||||
import com.jpexs.decompiler.flash.configuration.Configuration;
|
||||
import com.jpexs.decompiler.flash.gui.AppDialog;
|
||||
import com.jpexs.decompiler.flash.gui.AppStrings;
|
||||
import com.jpexs.decompiler.flash.gui.DebuggerHandler;
|
||||
import com.jpexs.decompiler.flash.gui.HeaderLabel;
|
||||
import com.jpexs.decompiler.flash.gui.Main;
|
||||
import com.jpexs.decompiler.flash.gui.MainPanel;
|
||||
@@ -81,6 +83,7 @@ import java.awt.event.MouseMotionListener;
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.regex.Pattern;
|
||||
@@ -98,7 +101,10 @@ import javax.swing.JTable;
|
||||
import javax.swing.JToggleButton;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.border.BevelBorder;
|
||||
import javax.swing.event.TableModelEvent;
|
||||
import javax.swing.event.TableModelListener;
|
||||
import javax.swing.table.DefaultTableModel;
|
||||
import javax.swing.table.TableModel;
|
||||
import javax.swing.text.Highlighter;
|
||||
import javax.swing.tree.TreePath;
|
||||
import jsyntaxpane.SyntaxDocument;
|
||||
@@ -143,6 +149,8 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<ABC
|
||||
|
||||
public final JLabel scriptNameLabel;
|
||||
|
||||
private JTable debugVariablesTable;
|
||||
|
||||
private final JLabel experimentalLabel = new JLabel(AppStrings.translate("action.edit.experimental"));
|
||||
|
||||
private final JButton editDecompiledButton = new JButton(AppStrings.translate("button.edit"), View.getIcon("edit16"));
|
||||
@@ -256,6 +264,114 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<ABC
|
||||
decompiledTextArea.clearScript();
|
||||
}
|
||||
|
||||
public static class VariablesTableModel implements TableModel {
|
||||
|
||||
DebuggerHandler.VariableChangedListener varChangeListener;
|
||||
|
||||
List<TableModelListener> tableListeners = new ArrayList<>();
|
||||
|
||||
public VariablesTableModel() {
|
||||
varChangeListener = new DebuggerHandler.VariableChangedListener() {
|
||||
private int oldNum = 0;
|
||||
|
||||
@Override
|
||||
public void variablesChanged() {
|
||||
for (int i = 0; i < oldNum; i++) {
|
||||
for (TableModelListener l : tableListeners) {
|
||||
l.tableChanged(new TableModelEvent(VariablesTableModel.this, i, i, 0, TableModelEvent.DELETE));
|
||||
}
|
||||
}
|
||||
oldNum = 1 + Main.getDebugHandler().getNumVariables() + Main.getDebugHandler().getNumRegisters();
|
||||
for (TableModelListener l : tableListeners) {
|
||||
l.tableChanged(new TableModelEvent(VariablesTableModel.this, 0, oldNum - 1, 0, TableModelEvent.INSERT));
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
Main.getDebugHandler().addVariableChangedListener(varChangeListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRowCount() {
|
||||
return (Main.getDebugHandler().getFrameVariable() == null ? 0 : 1) + Main.getDebugHandler().getNumRegisters() + Main.getDebugHandler().getNumVariables();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColumnCount() {
|
||||
return 3;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getColumnName(int columnIndex) {
|
||||
switch (columnIndex) {
|
||||
case 0:
|
||||
return "Name";
|
||||
case 1:
|
||||
return "Type";
|
||||
case 2:
|
||||
return "Value";
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<?> getColumnClass(int columnIndex) {
|
||||
return String.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCellEditable(int rowIndex, int columnIndex) {
|
||||
return columnIndex == 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getValueAt(int rowIndex, int columnIndex) {
|
||||
int numReg = Main.getDebugHandler().getNumRegisters();
|
||||
Variable v;
|
||||
if (rowIndex == 0) {
|
||||
v = Main.getDebugHandler().getFrameVariable();
|
||||
} else if (rowIndex >= numReg + 1) {
|
||||
v = Main.getDebugHandler().getVariable(rowIndex - 1 - numReg);
|
||||
} else {
|
||||
v = Main.getDebugHandler().getRegister(rowIndex - 1);
|
||||
}
|
||||
|
||||
switch (columnIndex) {
|
||||
case 0:
|
||||
return v.name;
|
||||
case 1:
|
||||
String typeStr = v.getTypeAsStr();
|
||||
if ("Object".equals(typeStr)) {
|
||||
typeStr = v.className;
|
||||
}
|
||||
if ("Object".equals(typeStr)) {
|
||||
typeStr = v.typeName;
|
||||
}
|
||||
return typeStr;
|
||||
case 2:
|
||||
return v.getValueAsStr();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
|
||||
Main.getDebugHandler().setVariableValue(rowIndex, "" + aValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addTableModelListener(TableModelListener l) {
|
||||
tableListeners.add(l);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeTableModelListener(TableModelListener l) {
|
||||
tableListeners.remove(l);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public ABCPanel(MainPanel mainPanel) {
|
||||
|
||||
this.mainPanel = mainPanel;
|
||||
@@ -331,8 +447,11 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<ABC
|
||||
detailPanel = new DetailPanel(this);
|
||||
JPanel panB = new JPanel();
|
||||
panB.setLayout(new BorderLayout());
|
||||
panB.add(decPanel, BorderLayout.CENTER);
|
||||
panB.add(decLabel, BorderLayout.NORTH);
|
||||
panB.add(decPanel, BorderLayout.CENTER);
|
||||
debugVariablesTable = new JTable(new VariablesTableModel());
|
||||
|
||||
panB.add(debugVariablesTable, BorderLayout.SOUTH);
|
||||
decLabel.setHorizontalAlignment(SwingConstants.CENTER);
|
||||
//decLabel.setBorder(new BevelBorder(BevelBorder.RAISED));
|
||||
splitPane = new JPersistentSplitPane(JSplitPane.HORIZONTAL_SPLIT, panB, detailPanel, Configuration.guiAvm2SplitPaneDividerLocationPercent);
|
||||
|
||||
@@ -53,7 +53,6 @@ import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
import javax.swing.event.CaretEvent;
|
||||
import javax.swing.event.CaretListener;
|
||||
import jsyntaxpane.DefaultSyntaxKit;
|
||||
import jsyntaxpane.SyntaxDocument;
|
||||
import jsyntaxpane.Token;
|
||||
import jsyntaxpane.TokenType;
|
||||
|
||||
Reference in New Issue
Block a user