Merge remote-tracking branch 'origin/patch'

This commit is contained in:
Ryan Kurtz 2023-08-04 16:29:16 -04:00
commit d8f61fc7b2
7 changed files with 75 additions and 27 deletions

View file

@ -199,5 +199,6 @@ public class DebuggerLocationLabel extends JLabel {
public void updateLabel() { public void updateLabel() {
String label = computeLocationString(); String label = computeLocationString();
setText(label); setText(label);
setToolTipText(label);
} }
} }

View file

@ -17,8 +17,8 @@ package ghidra.app.plugin.core.debug.gui.listing;
import static ghidra.app.plugin.core.debug.gui.DebuggerResources.ICON_REGISTER_MARKER; import static ghidra.app.plugin.core.debug.gui.DebuggerResources.ICON_REGISTER_MARKER;
import java.awt.BorderLayout;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles;
@ -26,8 +26,8 @@ import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import javax.swing.Box;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
@ -210,6 +210,7 @@ public class DebuggerListingProvider extends CodeViewerProvider {
protected void specChanged(LocationTrackingSpec spec) { protected void specChanged(LocationTrackingSpec spec) {
updateTitle(); updateTitle();
trackingLabel.setText(""); trackingLabel.setText("");
trackingLabel.setToolTipText("");
trackingLabel.setForeground(Colors.FOREGROUND); trackingLabel.setForeground(Colors.FOREGROUND);
trackingSpecChangeListeners.fire.locationTrackingSpecChanged(spec); trackingSpecChangeListeners.fire.locationTrackingSpecChanged(spec);
} }
@ -335,9 +336,11 @@ public class DebuggerListingProvider extends CodeViewerProvider {
addDisplayListener(readsMemTrait.getDisplayListener()); addDisplayListener(readsMemTrait.getDisplayListener());
JPanel northPanel = new JPanel(new BorderLayout()); Box northPanel = Box.createHorizontalBox();
northPanel.add(locationLabel, BorderLayout.WEST); northPanel.add(locationLabel);
northPanel.add(trackingLabel, BorderLayout.EAST); locationLabel.setMinimumSize(new Dimension(0, 0));
northPanel.add(Box.createGlue());
northPanel.add(trackingLabel);
this.setNorthComponent(northPanel); this.setNorthComponent(northPanel);
if (isConnected) { if (isConnected) {
setTitle(DebuggerResources.TITLE_PROVIDER_LISTING); setTitle(DebuggerResources.TITLE_PROVIDER_LISTING);
@ -1066,7 +1069,9 @@ public class DebuggerListingProvider extends CodeViewerProvider {
} }
protected void goToAndUpdateTrackingLabel(TraceProgramView curView, ProgramLocation loc) { protected void goToAndUpdateTrackingLabel(TraceProgramView curView, ProgramLocation loc) {
trackingLabel.setText(trackingTrait.computeLabelText()); String labelText = trackingTrait.computeLabelText();
trackingLabel.setText(labelText);
trackingLabel.setToolTipText(labelText);
if (goTo(curView, loc)) { if (goTo(curView, loc)) {
trackingLabel.setForeground(Colors.FOREGROUND); trackingLabel.setForeground(Colors.FOREGROUND);
} }

View file

@ -16,14 +16,14 @@
package ghidra.app.plugin.core.debug.gui.memory; package ghidra.app.plugin.core.debug.gui.memory;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.*; import java.util.*;
import javax.swing.JLabel; import javax.swing.*;
import javax.swing.JPanel;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -133,6 +133,7 @@ public class DebuggerMemoryBytesProvider extends ProgramByteViewerComponentProvi
protected void specChanged(LocationTrackingSpec spec) { protected void specChanged(LocationTrackingSpec spec) {
updateTitle(); updateTitle();
trackingLabel.setText(""); trackingLabel.setText("");
trackingLabel.setToolTipText("");
trackingLabel.setForeground(Colors.FOREGROUND); trackingLabel.setForeground(Colors.FOREGROUND);
} }
} }
@ -206,9 +207,11 @@ public class DebuggerMemoryBytesProvider extends ProgramByteViewerComponentProvi
createActions(); createActions();
addDisplayListener(readsMemTrait.getDisplayListener()); addDisplayListener(readsMemTrait.getDisplayListener());
JPanel northPanel = new JPanel(new BorderLayout()); Box northPanel = Box.createHorizontalBox();
northPanel.add(locationLabel, BorderLayout.WEST); northPanel.add(locationLabel);
northPanel.add(trackingLabel, BorderLayout.EAST); locationLabel.setMinimumSize(new Dimension(0, 0));
northPanel.add(Box.createGlue());
northPanel.add(trackingLabel);
decorationComponent.add(northPanel, BorderLayout.NORTH); decorationComponent.add(northPanel, BorderLayout.NORTH);
goToTrait.goToCoordinates(current); goToTrait.goToCoordinates(current);
@ -479,7 +482,9 @@ public class DebuggerMemoryBytesProvider extends ProgramByteViewerComponentProvi
} }
protected void goToAndUpdateTrackingLabel(TraceProgramView curView, ProgramLocation loc) { protected void goToAndUpdateTrackingLabel(TraceProgramView curView, ProgramLocation loc) {
trackingLabel.setText(trackingTrait.computeLabelText()); String labelText = trackingTrait.computeLabelText();
trackingLabel.setText(labelText);
trackingLabel.setToolTipText(labelText);
if (goTo(curView, loc)) { if (goTo(curView, loc)) {
trackingLabel.setForeground(Colors.FOREGROUND); trackingLabel.setForeground(Colors.FOREGROUND);
} }

View file

@ -112,12 +112,16 @@ class EnumDB extends DataTypeDB implements Enum {
long minValue = valueMap.firstKey(); long minValue = valueMap.firstKey();
long maxValue = valueMap.lastKey(); long maxValue = valueMap.lastKey();
if (maxValue > getMaxPossibleValue(length, true)) {
if (minValue < 0) {
return INVALID;
}
return UNSIGNED;
}
if (minValue < 0) { if (minValue < 0) {
return SIGNED; return SIGNED;
} }
if (maxValue > getMaxPossibleValue(length, true)) {
return UNSIGNED;
}
return NONE; // we have no negatives and no large unsigned values return NONE; // we have no negatives and no large unsigned values
} }
@ -874,6 +878,19 @@ class EnumDB extends DataTypeDB implements Enum {
} }
} }
@Override
public EnumSignedState getSignedState() {
lock.acquire();
try {
checkIsValid();
initializeIfNeeded();
return signedState;
}
finally {
lock.release();
}
}
@Override @Override
public int getMinimumPossibleLength() { public int getMinimumPossibleLength() {
lock.acquire(); lock.acquire();

View file

@ -18,13 +18,14 @@ package ghidra.program.database.data;
/** /**
* Keeps track of the signed state of an enum datatype. Enum are fundamentally either signed or * Keeps track of the signed state of an enum datatype. Enum are fundamentally either signed or
* unsigned, but sometimes you can't tell based on the values they contain. Once a negative value * unsigned, but sometimes you can't tell based on the values they contain. Once a negative value
* is added, then the enum becomes locked as signed, preventing high unsigned values from being * is added, then the enum becomes locked as signed, preventing high unsigned values (those values
* added. Once a high value unsigned value is added, then it becomes locked as unsigned value. If * that are too big for signed value of the enum size) from being added. Once a high value unsigned
* neither a negative value or high unsigned value has been added, then the enum is not locked as * value is added, then it becomes locked as unsigned value. If neither a negative value or high
* either signed or unsigned. * unsigned value has been added, then the enum is not locked as either signed or unsigned.
*/ */
public enum EnumSignedState { public enum EnumSignedState {
SIGNED, // Enum contains at least 1 negative value, preventing high unsigned values SIGNED, // Enum contains at least 1 negative value, preventing high unsigned values
UNSIGNED, // Enum contains at least 1 high unsigned value, preventing negative values UNSIGNED, // Enum contains at least 1 high unsigned value, preventing negative values
NONE // Enum contains neither a negative or a high unsigned value, so can go either way NONE, // Enum contains neither a negative or a high unsigned value, so can go either way
INVALID // Enum contains both negative and high unsigned values; can happen with old types
} }

View file

@ -19,6 +19,7 @@ import java.math.BigInteger;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
import ghidra.docking.settings.Settings; import ghidra.docking.settings.Settings;
import ghidra.program.database.data.EnumSignedState;
public interface Enum extends DataType { public interface Enum extends DataType {
@ -133,6 +134,12 @@ public interface Enum extends DataType {
*/ */
public boolean isSigned(); public boolean isSigned();
/**
* Returns the signed state.
* @return the signed state.
*/
public EnumSignedState getSignedState();
/** /**
* Returns the maximum value that this enum can represent based on its size and signedness. * Returns the maximum value that this enum can represent based on its size and signedness.
* @return the maximum value that this enum can represent based on its size and signedness. * @return the maximum value that this enum can represent based on its size and signedness.

View file

@ -148,6 +148,11 @@ public class EnumDataType extends GenericDataType implements Enum {
@Override @Override
public void add(String valueName, long value, String comment) { public void add(String valueName, long value, String comment) {
doAdd(valueName, value, comment);
signedState = computeSignedness();
}
private void doAdd(String valueName, long value, String comment) {
bitGroups = null; bitGroups = null;
checkValue(value); checkValue(value);
if (nameMap.containsKey(valueName)) { if (nameMap.containsKey(valueName)) {
@ -161,8 +166,6 @@ public class EnumDataType extends GenericDataType implements Enum {
if (!StringUtils.isBlank(comment)) { if (!StringUtils.isBlank(comment)) {
commentMap.put(valueName, comment); commentMap.put(valueName, comment);
} }
signedState = computeSignedness();
} }
private EnumSignedState computeSignedness() { private EnumSignedState computeSignedness() {
@ -172,12 +175,16 @@ public class EnumDataType extends GenericDataType implements Enum {
long minValue = valueMap.firstKey(); long minValue = valueMap.firstKey();
long maxValue = valueMap.lastKey(); long maxValue = valueMap.lastKey();
if (maxValue > getMaxPossibleValue(length, true)) {
if (minValue < 0) {
return INVALID;
}
return UNSIGNED;
}
if (minValue < 0) { if (minValue < 0) {
return SIGNED; return SIGNED;
} }
if (maxValue > getMaxPossibleValue(length, true)) {
return UNSIGNED;
}
return NONE; // we have no negatives and no large unsigned values return NONE; // we have no negatives and no large unsigned values
} }
@ -277,6 +284,11 @@ public class EnumDataType extends GenericDataType implements Enum {
return signedState == SIGNED; return signedState == SIGNED;
} }
@Override
public EnumSignedState getSignedState() {
return signedState;
}
@Override @Override
public long getMinPossibleValue() { public long getMinPossibleValue() {
return getMinPossibleValue(length, signedState != UNSIGNED); return getMinPossibleValue(length, signedState != UNSIGNED);
@ -503,10 +515,10 @@ public class EnumDataType extends GenericDataType implements Enum {
commentMap = new HashMap<>(); commentMap = new HashMap<>();
setLength(enumm.getLength()); setLength(enumm.getLength());
String[] names = enumm.getNames(); String[] names = enumm.getNames();
signedState = enumm.getSignedState();
for (String valueName : names) { for (String valueName : names) {
add(valueName, enumm.getValue(valueName), enumm.getComment(valueName)); doAdd(valueName, enumm.getValue(valueName), enumm.getComment(valueName));
} }
computeSignedness();
} }
@Override @Override