From 370152ad6c92763df083e3b0e0f629d01ec4bbda Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Fri, 31 Jan 2020 15:06:07 -0500 Subject: [PATCH] GT-3514 - Fixed exception when right-clicking an operation structure field reference in the Listing --- .../codebrowser/ListingHighlightProvider.java | 14 ++++++------ .../LocationReferencesPlugin.java | 3 ++- .../locationreferences/ReferenceUtils.java | 9 +------- .../program/model/listing/VariableOffset.java | 22 +++++++++++++++---- 4 files changed, 28 insertions(+), 20 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/codebrowser/ListingHighlightProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/codebrowser/ListingHighlightProvider.java index b4eb2ad3a8..ec521a8159 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/codebrowser/ListingHighlightProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/codebrowser/ListingHighlightProvider.java @@ -24,6 +24,8 @@ import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.commons.lang3.StringUtils; + import docking.widgets.fieldpanel.field.FieldElement; import docking.widgets.fieldpanel.support.FieldLocation; import docking.widgets.fieldpanel.support.Highlight; @@ -450,16 +452,14 @@ public class ListingHighlightProvider text = StringUtilities.findWord(text, pos, UNDERSCORE_AND_PERIOD_OK); } - if (text != null) { - text = text.trim(); - if (text.length() == 0) { - text = null; - } + if (StringUtils.isBlank(text)) { + text = null; } - - if (text != null) { + else { + text = text.trim(); currentHighlightPattern = Pattern.compile(text, Pattern.LITERAL); } + return text; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/navigation/locationreferences/LocationReferencesPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/navigation/locationreferences/LocationReferencesPlugin.java index 23116c835f..582c26b387 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/navigation/locationreferences/LocationReferencesPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/navigation/locationreferences/LocationReferencesPlugin.java @@ -125,7 +125,8 @@ public class LocationReferencesPlugin extends Plugin private void displayProviderForLocation(ProgramLocation location, Navigatable navigatable) { LocationDescriptor locationDescriptor = getLocationDescriptor(location); if (locationDescriptor == null) { - throw new IllegalArgumentException("Unable to display provider - unknown location"); + throw new IllegalArgumentException( + "Unable to display provider - unknown location: " + location); } LocationReferencesProvider provider = findProvider(locationDescriptor, navigatable); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/navigation/locationreferences/ReferenceUtils.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/navigation/locationreferences/ReferenceUtils.java index eb496abf77..81c306cc02 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/navigation/locationreferences/ReferenceUtils.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/navigation/locationreferences/ReferenceUtils.java @@ -711,16 +711,9 @@ public final class ReferenceUtils { return null; } - List objects = variableOffset.getObjects(); - Object object = objects.get((int) variableOffset.getOffset()); - if (!(object instanceof LabelString)) { - return null; - } - Variable variable = variableOffset.getVariable(); DataType type = variable.getDataType(); - LabelString label = (LabelString) object; - String string = label.toString(); + String string = variableOffset.getDataTypeDisplayText(); GenericDataTypeLocationDescriptor descriptor = createGenericDataTypeLocationDescriptor(program, type, string); return descriptor; diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/VariableOffset.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/VariableOffset.java index 00ec030f64..83c0865d18 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/VariableOffset.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/VariableOffset.java @@ -120,16 +120,22 @@ public class VariableOffset { } /** - * Get list of markup objects - * @return list of markup objects + * Returns the data type access portion of this variable offset as a string + * @return the text */ - public List getObjects() { + public String getDataTypeDisplayText() { + List objects = getObjects(false); + LabelString labelString = (LabelString) objects.get(0); + return labelString.toString(); + } + + private List getObjects(boolean showScalarAdjustment) { DataType dt = variable.getDataType(); StringBuffer name = new StringBuffer(variable.getName()); long scalarAdjustment = 0; - if (includeScalarAdjustment && (replacedElement instanceof Scalar)) { + if (showScalarAdjustment && (replacedElement instanceof Scalar)) { Scalar s = (Scalar) replacedElement; scalarAdjustment = variable.isStackVariable() ? s.getSignedValue() : s.getValue(); scalarAdjustment -= offset; @@ -214,6 +220,14 @@ public class VariableOffset { return list; } + /** + * Get list of markup objects + * @return list of markup objects + */ + public List getObjects() { + return getObjects(includeScalarAdjustment); + } + public Variable getVariable() { return variable; }