diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/StoredAnalyzerTimes.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/StoredAnalyzerTimes.java index b32cff7388..8072ec72d5 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/StoredAnalyzerTimes.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/StoredAnalyzerTimes.java @@ -39,6 +39,9 @@ public class StoredAnalyzerTimes implements CustomOption { public void readState(SaveState saveState) { taskTimes.clear(); for (String taskName : saveState.getNames()) { + if (CustomOption.CUSTOM_OPTION_CLASS_NAME_KEY.equals(taskName)) { + continue; // skip this reserved key + } taskTimes.put(taskName, saveState.getLong(taskName, 0)); } names = null; diff --git a/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/CustomOption.java b/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/CustomOption.java index 531691d803..d5fe87f61e 100644 --- a/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/CustomOption.java +++ b/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/CustomOption.java @@ -17,6 +17,15 @@ package ghidra.framework.options; public interface CustomOption { + /** + * SaveState key which corresponds to custom option + * implementation class. The use of this key/value within the stored + * state information is reserved for use by the option storage + * implementation and should be ignored by {@link #readState(SaveState)} + * implementation + */ + public final String CUSTOM_OPTION_CLASS_NAME_KEY = "CUSTOM_OPTION_CLASS"; + /** * Concrete subclass of WrappedOption should read all of its * state from the given saveState object. diff --git a/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/OptionType.java b/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/OptionType.java index 9be0fc9bfc..060c11f852 100644 --- a/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/OptionType.java +++ b/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/OptionType.java @@ -100,14 +100,14 @@ public enum OptionType { static class IntStringAdapter extends StringAdapter { @Override Object stringToObject(String string) { - return new Integer(string); + return Integer.valueOf(string); } } static class LongStringAdapter extends StringAdapter { @Override Object stringToObject(String string) { - return new Long(string); + return Long.valueOf(string); } } @@ -121,7 +121,7 @@ public enum OptionType { static class DoubleStringAdapter extends StringAdapter { @Override Object stringToObject(String string) { - return new Double(string); + return Double.valueOf(string); } } @@ -155,7 +155,7 @@ public enum OptionType { static class FloatStringAdapter extends StringAdapter { @Override Object stringToObject(String string) { - return new Float(string); + return Float.valueOf(string); } } @@ -216,10 +216,11 @@ public enum OptionType { @Override Object stringToObject(String string) { SaveState saveState = getSaveStateFromXmlString(string); - String customOptionClassName = saveState.getString("CUSTOM_OPTION_CLASS", null); + String customOptionClassName = + saveState.getString(CustomOption.CUSTOM_OPTION_CLASS_NAME_KEY, null); try { Class c = Class.forName(customOptionClassName); - CustomOption option = (CustomOption) c.newInstance(); + CustomOption option = (CustomOption) c.getConstructor().newInstance(); option.readState(saveState); return option; } @@ -239,7 +240,8 @@ public enum OptionType { String objectToString(Object object) { CustomOption customOption = (CustomOption) object; SaveState saveState = new SaveState(); - saveState.putString("CUSTOM_OPTION_CLASS", object.getClass().getName()); + saveState.putString(CustomOption.CUSTOM_OPTION_CLASS_NAME_KEY, + object.getClass().getName()); customOption.writeState(saveState); return saveToXmlString(saveState); }