mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 18:29:37 +02:00
GP-5654 - Data Type Manager - Speed improvements for deleting data types
This commit is contained in:
parent
0ebc4c9608
commit
404191cdaa
41 changed files with 381 additions and 233 deletions
|
@ -132,7 +132,7 @@ public class DBTraceDataTypeManagerTest extends AbstractGhidraHeadlessIntegratio
|
||||||
assertEquals(mine.toString(), got.toString()); // TODO: Eww
|
assertEquals(mine.toString(), got.toString()); // TODO: Eww
|
||||||
|
|
||||||
try (Transaction tx = trace.openTransaction("To Undo")) {
|
try (Transaction tx = trace.openTransaction("To Undo")) {
|
||||||
dtm.remove(got, new ConsoleTaskMonitor());
|
dtm.remove(got);
|
||||||
}
|
}
|
||||||
|
|
||||||
assertNull(got = dtm.getDataType(minePath));
|
assertNull(got = dtm.getDataType(minePath));
|
||||||
|
|
|
@ -688,7 +688,7 @@ public class DataTypeMergeManager implements MergeResolver {
|
||||||
// remove the Latest that was added.
|
// remove the Latest that was added.
|
||||||
DataType latestDt3 = dtms[RESULT].getDataType(sourceArchive, dataTypeID);
|
DataType latestDt3 = dtms[RESULT].getDataType(sourceArchive, dataTypeID);
|
||||||
long resultId3 = dtms[RESULT].getID(latestDt3);
|
long resultId3 = dtms[RESULT].getID(latestDt3);
|
||||||
if (dtms[RESULT].remove(latestDt3, currentMonitor)) {
|
if (dtms[RESULT].remove(latestDt3)) {
|
||||||
latestResolvedDts.put(resultId3, null);
|
latestResolvedDts.put(resultId3, null);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -807,7 +807,7 @@ public class DataTypeMergeManager implements MergeResolver {
|
||||||
// remove the data type if it was already added
|
// remove the data type if it was already added
|
||||||
DataType dt = myResolvedDts.get(id);
|
DataType dt = myResolvedDts.get(id);
|
||||||
if (dt != null) {
|
if (dt != null) {
|
||||||
dtms[RESULT].remove(dt, currentMonitor);
|
dtms[RESULT].remove(dt);
|
||||||
origResolvedDts.remove(id);
|
origResolvedDts.remove(id);
|
||||||
myResolvedDts.remove(id);
|
myResolvedDts.remove(id);
|
||||||
}
|
}
|
||||||
|
@ -818,7 +818,7 @@ public class DataTypeMergeManager implements MergeResolver {
|
||||||
case OPTION_MY:
|
case OPTION_MY:
|
||||||
if (myDt == null) {
|
if (myDt == null) {
|
||||||
if (latestDt != null) {
|
if (latestDt != null) {
|
||||||
dtms[RESULT].remove(latestDt, currentMonitor);
|
dtms[RESULT].remove(latestDt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -3003,7 +3003,7 @@ public class DataTypeMergeManager implements MergeResolver {
|
||||||
// My deleted data types will be in the result unless the latest already deleted it.
|
// My deleted data types will be in the result unless the latest already deleted it.
|
||||||
if (myDt != null) {
|
if (myDt != null) {
|
||||||
// If it's still in the result remove it.
|
// If it's still in the result remove it.
|
||||||
dtms[RESULT].remove(myDt, currentMonitor);
|
dtms[RESULT].remove(myDt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -88,13 +88,13 @@ public class ClearCmd extends BackgroundCommand<Program> {
|
||||||
public boolean applyTo(Program p, TaskMonitor taskMonitor) {
|
public boolean applyTo(Program p, TaskMonitor taskMonitor) {
|
||||||
this.monitor = taskMonitor;
|
this.monitor = taskMonitor;
|
||||||
this.program = p;
|
this.program = p;
|
||||||
boolean wasEabled = program.isSendingEvents();
|
boolean wasEnabled = program.isSendingEvents();
|
||||||
try {
|
try {
|
||||||
program.setEventsEnabled(sendIndividualEvents);
|
program.setEventsEnabled(sendIndividualEvents);
|
||||||
return doApplyTo();
|
return doApplyTo();
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
program.setEventsEnabled(wasEabled);
|
program.setEventsEnabled(wasEnabled);
|
||||||
program = null;
|
program = null;
|
||||||
monitor = null;
|
monitor = null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1329,7 +1329,7 @@ public abstract class CompEditorModel<T extends Composite> extends CompositeEdit
|
||||||
}
|
}
|
||||||
viewDTM.withTransaction("Removed Dependency", () -> {
|
viewDTM.withTransaction("Removed Dependency", () -> {
|
||||||
viewDTM.clearUndoOnChange();
|
viewDTM.clearUndoOnChange();
|
||||||
viewDTM.remove(dataType, TaskMonitor.DUMMY);
|
viewDTM.remove(dataType);
|
||||||
});
|
});
|
||||||
fireTableDataChanged();
|
fireTableDataChanged();
|
||||||
componentDataChanged();
|
componentDataChanged();
|
||||||
|
|
|
@ -265,7 +265,7 @@ public class CompositeViewerDataTypeManager<T extends Composite> extends StandAl
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean remove(DataType existingViewDt, TaskMonitor monitor) {
|
public boolean remove(DataType existingViewDt) {
|
||||||
|
|
||||||
if (existingViewDt.getDataTypeManager() != this) {
|
if (existingViewDt.getDataTypeManager() != this) {
|
||||||
throw new IllegalArgumentException("datatype is not from this manager");
|
throw new IllegalArgumentException("datatype is not from this manager");
|
||||||
|
@ -275,7 +275,7 @@ public class CompositeViewerDataTypeManager<T extends Composite> extends StandAl
|
||||||
dataTypeIDMap.remove(getID(existingViewDt));
|
dataTypeIDMap.remove(getID(existingViewDt));
|
||||||
}
|
}
|
||||||
|
|
||||||
return super.remove(existingViewDt, monitor);
|
return super.remove(existingViewDt);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -311,7 +311,7 @@ public class CompositeViewerDataTypeManager<T extends Composite> extends StandAl
|
||||||
DataType originalDt = originalDTM.getDataType(originalId);
|
DataType originalDt = originalDTM.getDataType(originalId);
|
||||||
if (originalDt == null) {
|
if (originalDt == null) {
|
||||||
changed = true;
|
changed = true;
|
||||||
remove(dt, TaskMonitor.DUMMY);
|
remove(dt);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -406,7 +406,7 @@ public class CompositeViewerDataTypeManager<T extends Composite> extends StandAl
|
||||||
orphanIds.addAll(getChildIds(id));
|
orphanIds.addAll(getChildIds(id));
|
||||||
|
|
||||||
// Remove orphan DB datatype
|
// Remove orphan DB datatype
|
||||||
remove(dt, TaskMonitor.DUMMY);
|
remove(dt);
|
||||||
|
|
||||||
if (cleanupIdMaps) {
|
if (cleanupIdMaps) {
|
||||||
dataTypeIDMap.remove(id);
|
dataTypeIDMap.remove(id);
|
||||||
|
|
|
@ -309,6 +309,10 @@ public class ArchiveNode extends CategoryNode {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void categoryAdded(DataTypeManager dtm, CategoryPath path) {
|
public void categoryAdded(DataTypeManager dtm, CategoryPath path) {
|
||||||
|
if (!isLoaded()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Category newCategory = dtm.getCategory(path);
|
Category newCategory = dtm.getCategory(path);
|
||||||
if (newCategory == null) {
|
if (newCategory == null) {
|
||||||
return;
|
return;
|
||||||
|
@ -326,6 +330,10 @@ public class ArchiveNode extends CategoryNode {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void categoryMoved(DataTypeManager dtm, CategoryPath oldPath, CategoryPath newPath) {
|
public void categoryMoved(DataTypeManager dtm, CategoryPath oldPath, CategoryPath newPath) {
|
||||||
|
if (!isLoaded()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Category newCategory = dtm.getCategory(newPath);
|
Category newCategory = dtm.getCategory(newPath);
|
||||||
Category oldParent = dtm.getCategory(oldPath.getParent());
|
Category oldParent = dtm.getCategory(oldPath.getParent());
|
||||||
CategoryNode categoryNode = findCategoryNode(oldParent);
|
CategoryNode categoryNode = findCategoryNode(oldParent);
|
||||||
|
@ -340,6 +348,10 @@ public class ArchiveNode extends CategoryNode {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void categoryRemoved(DataTypeManager dtm, CategoryPath path) {
|
public void categoryRemoved(DataTypeManager dtm, CategoryPath path) {
|
||||||
|
if (!isLoaded()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Category parentCategory = dtm.getCategory(path.getParent());
|
Category parentCategory = dtm.getCategory(path.getParent());
|
||||||
CategoryNode categoryNode = findCategoryNode(parentCategory);
|
CategoryNode categoryNode = findCategoryNode(parentCategory);
|
||||||
if (categoryNode != null) {
|
if (categoryNode != null) {
|
||||||
|
@ -350,6 +362,10 @@ public class ArchiveNode extends CategoryNode {
|
||||||
@Override
|
@Override
|
||||||
public void categoryRenamed(DataTypeManager dtm, CategoryPath oldPath,
|
public void categoryRenamed(DataTypeManager dtm, CategoryPath oldPath,
|
||||||
CategoryPath newPath) {
|
CategoryPath newPath) {
|
||||||
|
if (!isLoaded()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (oldPath.getParent() == null) { // root has no parent
|
if (oldPath.getParent() == null) { // root has no parent
|
||||||
ArchiveNode.this.fireNodeChanged(); // fire that the root changed
|
ArchiveNode.this.fireNodeChanged(); // fire that the root changed
|
||||||
return;
|
return;
|
||||||
|
@ -365,6 +381,10 @@ public class ArchiveNode extends CategoryNode {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void dataTypeAdded(DataTypeManager dtm, DataTypePath path) {
|
public void dataTypeAdded(DataTypeManager dtm, DataTypePath path) {
|
||||||
|
if (!isLoaded()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Category parentCategory = dtm.getCategory(path.getCategoryPath());
|
Category parentCategory = dtm.getCategory(path.getCategoryPath());
|
||||||
CategoryNode categoryNode = findCategoryNode(parentCategory);
|
CategoryNode categoryNode = findCategoryNode(parentCategory);
|
||||||
if (categoryNode != null) {
|
if (categoryNode != null) {
|
||||||
|
@ -379,6 +399,10 @@ public class ArchiveNode extends CategoryNode {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void favoritesChanged(DataTypeManager dtm, DataTypePath path, boolean isFavorite) {
|
public void favoritesChanged(DataTypeManager dtm, DataTypePath path, boolean isFavorite) {
|
||||||
|
if (!isLoaded()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
DataType dataType = dtm.getDataType(path);
|
DataType dataType = dtm.getDataType(path);
|
||||||
Category category = dtm.getCategory(path.getCategoryPath());
|
Category category = dtm.getCategory(path.getCategoryPath());
|
||||||
CategoryNode categoryNode = findCategoryNode(category);
|
CategoryNode categoryNode = findCategoryNode(category);
|
||||||
|
@ -399,6 +423,10 @@ public class ArchiveNode extends CategoryNode {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void dataTypeChanged(DataTypeManager dtm, DataTypePath path) {
|
public void dataTypeChanged(DataTypeManager dtm, DataTypePath path) {
|
||||||
|
if (!isLoaded()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Category dtmCategory = dtm.getCategory(path.getCategoryPath());
|
Category dtmCategory = dtm.getCategory(path.getCategoryPath());
|
||||||
CategoryNode categoryNode = findCategoryNode(dtmCategory);
|
CategoryNode categoryNode = findCategoryNode(dtmCategory);
|
||||||
if (categoryNode != null) {
|
if (categoryNode != null) {
|
||||||
|
@ -413,6 +441,10 @@ public class ArchiveNode extends CategoryNode {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void dataTypeMoved(DataTypeManager dtm, DataTypePath oldPath, DataTypePath newPath) {
|
public void dataTypeMoved(DataTypeManager dtm, DataTypePath oldPath, DataTypePath newPath) {
|
||||||
|
if (!isLoaded()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Category oldParent = dtm.getCategory(oldPath.getCategoryPath());
|
Category oldParent = dtm.getCategory(oldPath.getCategoryPath());
|
||||||
CategoryNode categoryNode = findCategoryNode(oldParent);
|
CategoryNode categoryNode = findCategoryNode(oldParent);
|
||||||
if (categoryNode != null) {
|
if (categoryNode != null) {
|
||||||
|
@ -433,6 +465,10 @@ public class ArchiveNode extends CategoryNode {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void dataTypeRemoved(DataTypeManager dtm, DataTypePath path) {
|
public void dataTypeRemoved(DataTypeManager dtm, DataTypePath path) {
|
||||||
|
if (!isLoaded()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Category oldParent = dtm.getCategory(path.getCategoryPath());
|
Category oldParent = dtm.getCategory(path.getCategoryPath());
|
||||||
CategoryNode categoryNode = findCategoryNode(oldParent);
|
CategoryNode categoryNode = findCategoryNode(oldParent);
|
||||||
if (categoryNode != null) {
|
if (categoryNode != null) {
|
||||||
|
@ -443,6 +479,10 @@ public class ArchiveNode extends CategoryNode {
|
||||||
@Override
|
@Override
|
||||||
public void dataTypeRenamed(DataTypeManager dtm, DataTypePath oldPath,
|
public void dataTypeRenamed(DataTypeManager dtm, DataTypePath oldPath,
|
||||||
DataTypePath newPath) {
|
DataTypePath newPath) {
|
||||||
|
if (!isLoaded()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Category dtmCategory = dtm.getCategory(newPath.getCategoryPath());
|
Category dtmCategory = dtm.getCategory(newPath.getCategoryPath());
|
||||||
CategoryNode categoryNode = findCategoryNode(dtmCategory);
|
CategoryNode categoryNode = findCategoryNode(dtmCategory);
|
||||||
if (categoryNode != null) {
|
if (categoryNode != null) {
|
||||||
|
|
|
@ -51,6 +51,7 @@ public class CategoryNode extends DataTypeTreeNode {
|
||||||
if (category == null) {
|
if (category == null) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
Category[] subCategories = category.getCategories();
|
Category[] subCategories = category.getCategories();
|
||||||
DataType[] dataTypes = category.getDataTypes();
|
DataType[] dataTypes = category.getDataTypes();
|
||||||
List<GTreeNode> list = new ArrayList<>(subCategories.length + dataTypes.length);
|
List<GTreeNode> list = new ArrayList<>(subCategories.length + dataTypes.length);
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
@ -156,6 +156,10 @@ public class DataTypeTreeCopyMoveTask extends Task {
|
||||||
int n = errors.size();
|
int n = errors.size();
|
||||||
if (n > 1) {
|
if (n > 1) {
|
||||||
message = "Encountered " + n + " errors copying/moving. See the log for details";
|
message = "Encountered " + n + " errors copying/moving. See the log for details";
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
Msg.error(this, errors.get(i));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Msg.showError(this, gTree, "Encountered Errors Copying/Moving", message);
|
Msg.showError(this, gTree, "Encountered Errors Copying/Moving", message);
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
@ -25,6 +25,8 @@ import ghidra.app.plugin.core.datamgr.DataTypesProvider;
|
||||||
import ghidra.app.plugin.core.datamgr.archive.Archive;
|
import ghidra.app.plugin.core.datamgr.archive.Archive;
|
||||||
import ghidra.app.plugin.core.datamgr.tree.*;
|
import ghidra.app.plugin.core.datamgr.tree.*;
|
||||||
import ghidra.program.model.data.*;
|
import ghidra.program.model.data.*;
|
||||||
|
import ghidra.program.model.listing.Program;
|
||||||
|
import ghidra.util.Swing;
|
||||||
import ghidra.util.exception.CancelledException;
|
import ghidra.util.exception.CancelledException;
|
||||||
import ghidra.util.task.Task;
|
import ghidra.util.task.Task;
|
||||||
import ghidra.util.task.TaskMonitor;
|
import ghidra.util.task.TaskMonitor;
|
||||||
|
@ -38,6 +40,8 @@ public class DataTypeTreeDeleteTask extends Task {
|
||||||
private DataTypeManagerPlugin plugin;
|
private DataTypeManagerPlugin plugin;
|
||||||
private int nodeCount;
|
private int nodeCount;
|
||||||
|
|
||||||
|
private boolean hasClosedCategories = false;
|
||||||
|
|
||||||
public DataTypeTreeDeleteTask(DataTypeManagerPlugin plugin, List<GTreeNode> nodes) {
|
public DataTypeTreeDeleteTask(DataTypeManagerPlugin plugin, List<GTreeNode> nodes) {
|
||||||
super("Delete Nodes", true, true, true);
|
super("Delete Nodes", true, true, true);
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
|
@ -48,15 +52,19 @@ public class DataTypeTreeDeleteTask extends Task {
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<ArchiveNode, List<GTreeNode>> groupNodeByArchive(List<GTreeNode> nodes) {
|
private Map<ArchiveNode, List<GTreeNode>> groupNodeByArchive(List<GTreeNode> nodes) {
|
||||||
Map<ArchiveNode, List<GTreeNode>> archiveNodeMap = new HashMap<>();
|
|
||||||
|
|
||||||
|
Map<ArchiveNode, List<GTreeNode>> archiveNodeMap = new HashMap<>();
|
||||||
for (GTreeNode node : nodes) {
|
for (GTreeNode node : nodes) {
|
||||||
ArchiveNode archiveNode = ((DataTypeTreeNode) node).getArchiveNode();
|
ArchiveNode archiveNode = ((DataTypeTreeNode) node).getArchiveNode();
|
||||||
List<GTreeNode> archiveNodeList = archiveNodeMap.get(archiveNode);
|
List<GTreeNode> archiveNodeList = archiveNodeMap.computeIfAbsent(archiveNode,
|
||||||
if (archiveNodeList == null) {
|
n -> new ArrayList<>());
|
||||||
archiveNodeList = new ArrayList<>();
|
|
||||||
archiveNodeMap.put(archiveNode, archiveNodeList);
|
if (node instanceof CategoryNode) {
|
||||||
|
if (!node.isLoaded()) {
|
||||||
|
hasClosedCategories = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
archiveNodeList.add(node);
|
archiveNodeList.add(node);
|
||||||
}
|
}
|
||||||
return archiveNodeMap;
|
return archiveNodeMap;
|
||||||
|
@ -95,6 +103,7 @@ public class DataTypeTreeDeleteTask extends Task {
|
||||||
for (List<GTreeNode> list : nodesByArchive.values()) {
|
for (List<GTreeNode> list : nodesByArchive.values()) {
|
||||||
total += list.size();
|
total += list.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
monitor.initialize(total);
|
monitor.initialize(total);
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -108,8 +117,14 @@ public class DataTypeTreeDeleteTask extends Task {
|
||||||
DataTypesProvider provider = plugin.getProvider();
|
DataTypesProvider provider = plugin.getProvider();
|
||||||
DataTypeArchiveGTree tree = provider.getGTree();
|
DataTypeArchiveGTree tree = provider.getGTree();
|
||||||
GTreeState treeState = tree.getTreeState();
|
GTreeState treeState = tree.getTreeState();
|
||||||
|
boolean collapseTree = nodeCount > NODE_COUNT_FOR_COLLAPSING_TREE || hasClosedCategories;
|
||||||
|
Program program = plugin.getProgram();
|
||||||
|
boolean wereEventsEnabled = program.isSendingEvents();
|
||||||
try {
|
try {
|
||||||
if (nodeCount > NODE_COUNT_FOR_COLLAPSING_TREE) {
|
program.setEventsEnabled(false);
|
||||||
|
|
||||||
|
if (collapseTree) {
|
||||||
|
monitor.setIndeterminate(true);
|
||||||
collapseArchives(tree);
|
collapseArchives(tree);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,7 +139,16 @@ public class DataTypeTreeDeleteTask extends Task {
|
||||||
// nothing to report
|
// nothing to report
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
tree.restoreTreeState(treeState);
|
|
||||||
|
// Allow any events to go out before we restore the tree state so that the tree does
|
||||||
|
// not have to process any events it is not concerned with.
|
||||||
|
program.flushEvents();
|
||||||
|
program.getDataTypeManager().flushEvents();
|
||||||
|
program.setEventsEnabled(wereEventsEnabled);
|
||||||
|
if (collapseTree) {
|
||||||
|
Swing.allowSwingToProcessEvents();
|
||||||
|
tree.restoreTreeState(treeState);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,18 +164,14 @@ public class DataTypeTreeDeleteTask extends Task {
|
||||||
throws CancelledException {
|
throws CancelledException {
|
||||||
|
|
||||||
Archive archive = archiveNode.getArchive();
|
Archive archive = archiveNode.getArchive();
|
||||||
DataTypeManager dataTypeManager = archive.getDataTypeManager();
|
DataTypeManager dtm = archive.getDataTypeManager();
|
||||||
int transactionID = dataTypeManager.startTransaction("Delete Category/DataType");
|
dtm.withTransaction("Delete Category/DataType", () -> {
|
||||||
try {
|
|
||||||
for (GTreeNode node : list) {
|
for (GTreeNode node : list) {
|
||||||
monitor.checkCancelled();
|
monitor.checkCancelled();
|
||||||
removeNode(node, monitor);
|
removeNode(node, monitor);
|
||||||
monitor.incrementProgress(1);
|
monitor.incrementProgress(1);
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
finally {
|
|
||||||
dataTypeManager.endTransaction(transactionID, true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void removeNode(GTreeNode node, TaskMonitor monitor) {
|
private void removeNode(GTreeNode node, TaskMonitor monitor) {
|
||||||
|
@ -159,7 +179,7 @@ public class DataTypeTreeDeleteTask extends Task {
|
||||||
DataTypeNode dataTypeNode = (DataTypeNode) node;
|
DataTypeNode dataTypeNode = (DataTypeNode) node;
|
||||||
DataType dataType = dataTypeNode.getDataType();
|
DataType dataType = dataTypeNode.getDataType();
|
||||||
DataTypeManager dataTypeManager = dataType.getDataTypeManager();
|
DataTypeManager dataTypeManager = dataType.getDataTypeManager();
|
||||||
dataTypeManager.remove(dataType, monitor);
|
dataTypeManager.remove(dataType);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
CategoryNode categoryNode = (CategoryNode) node;
|
CategoryNode categoryNode = (CategoryNode) node;
|
||||||
|
|
|
@ -1099,7 +1099,7 @@ public class StackEditorModel extends CompositeEditorModel<StackFrameDataType> {
|
||||||
}
|
}
|
||||||
|
|
||||||
OffsetPairs offsetSelection = getRelOffsetSelection();
|
OffsetPairs offsetSelection = getRelOffsetSelection();
|
||||||
viewDTM.remove(dataType, TaskMonitor.DUMMY);
|
viewDTM.remove(dataType);
|
||||||
fireTableDataChanged();
|
fireTableDataChanged();
|
||||||
componentDataChanged();
|
componentDataChanged();
|
||||||
setRelOffsetSelection(offsetSelection);
|
setRelOffsetSelection(offsetSelection);
|
||||||
|
|
|
@ -379,7 +379,7 @@ public class DataTypeMerge1Test extends AbstractDataTypeMergeTest {
|
||||||
// /Category1/Category2/Category3
|
// /Category1/Category2/Category3
|
||||||
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
|
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
|
||||||
"IntStruct");
|
"IntStruct");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
executeMerge(-1);
|
executeMerge(-1);
|
||||||
|
@ -409,7 +409,7 @@ public class DataTypeMerge1Test extends AbstractDataTypeMergeTest {
|
||||||
CategoryPath path = new CategoryPath("/Category1/Category2/Category3");
|
CategoryPath path = new CategoryPath("/Category1/Category2/Category3");
|
||||||
Structure s = new StructureDataType(path, "my_struct", 5);
|
Structure s = new StructureDataType(path, "my_struct", 5);
|
||||||
DataType dt = dtm.addDataType(s, DataTypeConflictHandler.DEFAULT_HANDLER);
|
DataType dt = dtm.addDataType(s, DataTypeConflictHandler.DEFAULT_HANDLER);
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
executeMerge(-1);
|
executeMerge(-1);
|
||||||
|
@ -442,7 +442,7 @@ public class DataTypeMerge1Test extends AbstractDataTypeMergeTest {
|
||||||
// /Category1/Category2/Category3
|
// /Category1/Category2/Category3
|
||||||
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
|
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
|
||||||
"IntStruct");
|
"IntStruct");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
executeMerge(DataTypeMergeManager.OPTION_MY);
|
executeMerge(DataTypeMergeManager.OPTION_MY);
|
||||||
|
@ -475,7 +475,7 @@ public class DataTypeMerge1Test extends AbstractDataTypeMergeTest {
|
||||||
// /Category1/Category2/Category3
|
// /Category1/Category2/Category3
|
||||||
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category5"),
|
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category5"),
|
||||||
"FloatStruct");
|
"FloatStruct");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
executeMerge(DataTypeMergeManager.OPTION_LATEST);
|
executeMerge(DataTypeMergeManager.OPTION_LATEST);
|
||||||
|
@ -496,7 +496,7 @@ public class DataTypeMerge1Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
|
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
|
||||||
"IntStruct");
|
"IntStruct");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -526,7 +526,7 @@ public class DataTypeMerge1Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
DataType dt =
|
DataType dt =
|
||||||
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -578,7 +578,7 @@ public class DataTypeMerge1Test extends AbstractDataTypeMergeTest {
|
||||||
// /Category1/Category2/Category3
|
// /Category1/Category2/Category3
|
||||||
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
|
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
|
||||||
"IntStruct");
|
"IntStruct");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -588,7 +588,7 @@ public class DataTypeMerge1Test extends AbstractDataTypeMergeTest {
|
||||||
// /Category1/Category2/Category3
|
// /Category1/Category2/Category3
|
||||||
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
|
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
|
||||||
"IntStruct");
|
"IntStruct");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
executeMerge(-1);
|
executeMerge(-1);
|
||||||
|
@ -772,7 +772,7 @@ public class DataTypeMerge1Test extends AbstractDataTypeMergeTest {
|
||||||
// /Category1/Category2/Category3
|
// /Category1/Category2/Category3
|
||||||
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
|
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
|
||||||
"IntStruct");
|
"IntStruct");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
executeMerge(DataTypeMergeManager.OPTION_MY);
|
executeMerge(DataTypeMergeManager.OPTION_MY);
|
||||||
|
@ -792,7 +792,7 @@ public class DataTypeMerge1Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
|
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
|
||||||
"IntStruct");
|
"IntStruct");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -32,7 +32,6 @@ import ghidra.program.model.symbol.SourceType;
|
||||||
import ghidra.program.model.symbol.Symbol;
|
import ghidra.program.model.symbol.Symbol;
|
||||||
import ghidra.util.InvalidNameException;
|
import ghidra.util.InvalidNameException;
|
||||||
import ghidra.util.exception.DuplicateNameException;
|
import ghidra.util.exception.DuplicateNameException;
|
||||||
import ghidra.util.task.TaskMonitor;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests for merging data types.
|
* Tests for merging data types.
|
||||||
|
@ -1010,7 +1009,7 @@ public class DataTypeMerge2Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
||||||
// remove Bar from the data type manager
|
// remove Bar from the data type manager
|
||||||
dtm.remove(bar, TaskMonitor.DUMMY);
|
dtm.remove(bar);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1105,11 +1104,11 @@ public class DataTypeMerge2Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
||||||
// remove Bar from the data type manager
|
// remove Bar from the data type manager
|
||||||
dtm.remove(bar, TaskMonitor.DUMMY);
|
dtm.remove(bar);
|
||||||
DataType word = dtm.getDataType(new CategoryPath("/"), "word");
|
DataType word = dtm.getDataType(new CategoryPath("/"), "word");
|
||||||
// remove Bar and word from the data type manager
|
// remove Bar and word from the data type manager
|
||||||
dtm.remove(bar, TaskMonitor.DUMMY);
|
dtm.remove(bar);
|
||||||
dtm.remove(word, TaskMonitor.DUMMY);
|
dtm.remove(word);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1220,7 +1219,7 @@ public class DataTypeMerge2Test extends AbstractDataTypeMergeTest {
|
||||||
.getDataType(new CategoryPath("/MISC"), "MyFunctionDef");
|
.getDataType(new CategoryPath("/MISC"), "MyFunctionDef");
|
||||||
fd.setReturnType(bar);
|
fd.setReturnType(bar);
|
||||||
Structure foo = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Foo");
|
Structure foo = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Foo");
|
||||||
dtm.remove(foo, TaskMonitor.DUMMY);
|
dtm.remove(foo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1273,7 +1272,7 @@ public class DataTypeMerge2Test extends AbstractDataTypeMergeTest {
|
||||||
fd.setVarArgs(true);
|
fd.setVarArgs(true);
|
||||||
fd.setNoReturn(true);
|
fd.setNoReturn(true);
|
||||||
Structure foo = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Foo");
|
Structure foo = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Foo");
|
||||||
dtm.remove(foo, TaskMonitor.DUMMY);
|
dtm.remove(foo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1328,7 +1327,7 @@ public class DataTypeMerge2Test extends AbstractDataTypeMergeTest {
|
||||||
fd.setVarArgs(true);
|
fd.setVarArgs(true);
|
||||||
fd.setNoReturn(true);
|
fd.setNoReturn(true);
|
||||||
Structure foo = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Foo");
|
Structure foo = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Foo");
|
||||||
dtm.remove(foo, TaskMonitor.DUMMY);
|
dtm.remove(foo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -24,7 +24,6 @@ import ghidra.program.database.*;
|
||||||
import ghidra.program.model.data.*;
|
import ghidra.program.model.data.*;
|
||||||
import ghidra.program.model.data.Enum;
|
import ghidra.program.model.data.Enum;
|
||||||
import ghidra.util.exception.DuplicateNameException;
|
import ghidra.util.exception.DuplicateNameException;
|
||||||
import ghidra.util.task.TaskMonitor;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* More data type merge tests.
|
* More data type merge tests.
|
||||||
|
@ -41,7 +40,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
|
||||||
public void modifyLatest(ProgramDB program) {
|
public void modifyLatest(ProgramDB program) {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
||||||
dtm.remove(s, TaskMonitor.DUMMY);
|
dtm.remove(s);
|
||||||
// 2 components should get removed from CoolUnion
|
// 2 components should get removed from CoolUnion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,7 +112,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
|
||||||
public void modifyLatest(ProgramDB program) {
|
public void modifyLatest(ProgramDB program) {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
||||||
dtm.remove(s, TaskMonitor.DUMMY);
|
dtm.remove(s);
|
||||||
// 2 components should be bad in CoolUnion
|
// 2 components should be bad in CoolUnion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -181,7 +180,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
|
||||||
public void modifyLatest(ProgramDB program) {
|
public void modifyLatest(ProgramDB program) {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
||||||
dtm.remove(s, TaskMonitor.DUMMY);
|
dtm.remove(s);
|
||||||
// 2 components should get removed from CoolUnion
|
// 2 components should get removed from CoolUnion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -502,7 +501,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
DataType dt =
|
DataType dt =
|
||||||
dtm.getDataType(new CategoryPath("/Category1/Category2"), "Structure_1");
|
dtm.getDataType(new CategoryPath("/Category1/Category2"), "Structure_1");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -562,7 +561,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
DataType dt =
|
DataType dt =
|
||||||
dtm.getDataType(new CategoryPath("/Category1/Category2"), "Structure_1");
|
dtm.getDataType(new CategoryPath("/Category1/Category2"), "Structure_1");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
// causes Bar to be marked as changed
|
// causes Bar to be marked as changed
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -621,7 +620,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
|
||||||
|
|
||||||
DataType dt =
|
DataType dt =
|
||||||
dtm.getDataType(new CategoryPath("/Category1/Category2"), "Structure_1");
|
dtm.getDataType(new CategoryPath("/Category1/Category2"), "Structure_1");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
// causes Bar to be marked as changed
|
// causes Bar to be marked as changed
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -700,7 +699,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
|
||||||
Structure a = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "ArrayStruct");
|
Structure a = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "ArrayStruct");
|
||||||
Structure ms = (Structure) dtm.getDataType(new CategoryPath("/Category1/Category2"),
|
Structure ms = (Structure) dtm.getDataType(new CategoryPath("/Category1/Category2"),
|
||||||
"MyStruct");
|
"MyStruct");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
Structure s1 = new StructureDataType(
|
Structure s1 = new StructureDataType(
|
||||||
new CategoryPath("/Category1/Category2/Category5"), "s1", 0);
|
new CategoryPath("/Category1/Category2/Category5"), "s1", 0);
|
||||||
s1.add(ms);
|
s1.add(ms);
|
||||||
|
@ -811,7 +810,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
|
||||||
public void modifyLatest(ProgramDB program) {
|
public void modifyLatest(ProgramDB program) {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2"), "BF");
|
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2"), "BF");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1127,7 +1126,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
|
||||||
dtm.replaceDataType(td, new TypedefDataType("NewBF", IntegerDataType.dataType),
|
dtm.replaceDataType(td, new TypedefDataType("NewBF", IntegerDataType.dataType),
|
||||||
true);
|
true);
|
||||||
DataType dt = dtm.getDataType("/MISC/FooTypedef");
|
DataType dt = dtm.getDataType("/MISC/FooTypedef");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
|
|
||||||
DataType dt1 = dtm.getDataType("/BF");
|
DataType dt1 = dtm.getDataType("/BF");
|
||||||
assertNull(dt1);
|
assertNull(dt1);
|
||||||
|
@ -1200,7 +1199,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
|
||||||
public void modifyLatest(ProgramDB program) {
|
public void modifyLatest(ProgramDB program) {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
||||||
dtm.remove(s, TaskMonitor.DUMMY);
|
dtm.remove(s);
|
||||||
// 2 components should get removed from CoolUnion
|
// 2 components should get removed from CoolUnion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1278,7 +1277,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
|
||||||
public void modifyLatest(ProgramDB program) {
|
public void modifyLatest(ProgramDB program) {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
||||||
dtm.remove(s, TaskMonitor.DUMMY);
|
dtm.remove(s);
|
||||||
// 2 components should get removed from CoolUnion
|
// 2 components should get removed from CoolUnion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1364,10 +1363,10 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
|
|
||||||
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
||||||
dtm.remove(s, TaskMonitor.DUMMY);
|
dtm.remove(s);
|
||||||
DataType dt =
|
DataType dt =
|
||||||
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1436,10 +1435,10 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
|
||||||
public void modifyLatest(ProgramDB program) {
|
public void modifyLatest(ProgramDB program) {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
||||||
dtm.remove(s, TaskMonitor.DUMMY);
|
dtm.remove(s);
|
||||||
DataType dt =
|
DataType dt =
|
||||||
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1518,10 +1517,10 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
|
|
||||||
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
||||||
dtm.remove(s, TaskMonitor.DUMMY);
|
dtm.remove(s);
|
||||||
DataType dt =
|
DataType dt =
|
||||||
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1590,10 +1589,10 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
|
||||||
public void modifyLatest(ProgramDB program) {
|
public void modifyLatest(ProgramDB program) {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
||||||
dtm.remove(s, TaskMonitor.DUMMY);
|
dtm.remove(s);
|
||||||
DataType dt =
|
DataType dt =
|
||||||
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1693,10 +1692,10 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
|
||||||
public void modifyLatest(ProgramDB program) {
|
public void modifyLatest(ProgramDB program) {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
||||||
dtm.remove(s, TaskMonitor.DUMMY);
|
dtm.remove(s);
|
||||||
DataType dt =
|
DataType dt =
|
||||||
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1779,10 +1778,10 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
|
||||||
public void modifyLatest(ProgramDB program) {
|
public void modifyLatest(ProgramDB program) {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
||||||
dtm.remove(s, TaskMonitor.DUMMY);
|
dtm.remove(s);
|
||||||
DataType dt =
|
DataType dt =
|
||||||
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1888,7 +1887,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
DataType enumm = dtm.getDataType(new CategoryPath("/Category1"), "XYZ");
|
DataType enumm = dtm.getDataType(new CategoryPath("/Category1"), "XYZ");
|
||||||
dtm.remove(enumm, TaskMonitor.DUMMY);
|
dtm.remove(enumm);
|
||||||
|
|
||||||
Union union = (Union) dtm.getDataType(new CategoryPath("/Category1/Category2"),
|
Union union = (Union) dtm.getDataType(new CategoryPath("/Category1/Category2"),
|
||||||
"CoolUnion");
|
"CoolUnion");
|
||||||
|
|
|
@ -29,7 +29,6 @@ import ghidra.program.database.ProgramModifierListener;
|
||||||
import ghidra.program.model.data.*;
|
import ghidra.program.model.data.*;
|
||||||
import ghidra.util.InvalidNameException;
|
import ghidra.util.InvalidNameException;
|
||||||
import ghidra.util.exception.DuplicateNameException;
|
import ghidra.util.exception.DuplicateNameException;
|
||||||
import ghidra.util.task.TaskMonitor;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* More data type merge tests.
|
* More data type merge tests.
|
||||||
|
@ -425,7 +424,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
|
||||||
// change ArrayStruct
|
// change ArrayStruct
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure foo = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Foo");
|
Structure foo = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Foo");
|
||||||
dtm.remove(foo, TaskMonitor.DUMMY);
|
dtm.remove(foo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -617,7 +616,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
|
||||||
// delete Bar from Foo
|
// delete Bar from Foo
|
||||||
fs.delete(3);
|
fs.delete(3);
|
||||||
// add Foo to Bar
|
// add Foo to Bar
|
||||||
dtm.remove(bs, TaskMonitor.DUMMY);
|
dtm.remove(bs);
|
||||||
|
|
||||||
// Add s1, s2, s3
|
// Add s1, s2, s3
|
||||||
Structure s1 = new StructureDataType(new CategoryPath("/MISC"), "S1", 0);
|
Structure s1 = new StructureDataType(new CategoryPath("/MISC"), "S1", 0);
|
||||||
|
@ -705,7 +704,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
|
||||||
// delete Bar from Foo
|
// delete Bar from Foo
|
||||||
foo.delete(3);
|
foo.delete(3);
|
||||||
// remove Bar from the data type manager
|
// remove Bar from the data type manager
|
||||||
dtm.remove(bar, TaskMonitor.DUMMY);
|
dtm.remove(bar);
|
||||||
|
|
||||||
// Add s1, s2, s3
|
// Add s1, s2, s3
|
||||||
Structure s1 = new StructureDataType(new CategoryPath("/MISC"), "S1", 0);
|
Structure s1 = new StructureDataType(new CategoryPath("/MISC"), "S1", 0);
|
||||||
|
@ -801,7 +800,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
|
||||||
// delete Bar from Foo
|
// delete Bar from Foo
|
||||||
fs.delete(3);
|
fs.delete(3);
|
||||||
// remove Bar from the data type manager
|
// remove Bar from the data type manager
|
||||||
dtm.remove(bs, TaskMonitor.DUMMY);
|
dtm.remove(bs);
|
||||||
|
|
||||||
// Add s1, s2, s3
|
// Add s1, s2, s3
|
||||||
Structure s1 = new StructureDataType(new CategoryPath("/MISC"), "S1", 0);
|
Structure s1 = new StructureDataType(new CategoryPath("/MISC"), "S1", 0);
|
||||||
|
@ -945,7 +944,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure fs = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Foo");
|
Structure fs = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Foo");
|
||||||
// delete Foo from the data type manager
|
// delete Foo from the data type manager
|
||||||
dtm.remove(fs, TaskMonitor.DUMMY);
|
dtm.remove(fs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -954,7 +953,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
|
||||||
Structure foo = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Foo");
|
Structure foo = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Foo");
|
||||||
dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
||||||
// delete Foo from the data type manager
|
// delete Foo from the data type manager
|
||||||
dtm.remove(foo, TaskMonitor.DUMMY);
|
dtm.remove(foo);
|
||||||
|
|
||||||
// Add s1, s2, s3
|
// Add s1, s2, s3
|
||||||
Structure s1 = new StructureDataType(new CategoryPath("/MISC"), "S1", 0);
|
Structure s1 = new StructureDataType(new CategoryPath("/MISC"), "S1", 0);
|
||||||
|
@ -1023,7 +1022,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure fs = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Foo");
|
Structure fs = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Foo");
|
||||||
// delete Foo from the data type manager
|
// delete Foo from the data type manager
|
||||||
dtm.remove(fs, TaskMonitor.DUMMY);
|
dtm.remove(fs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1033,7 +1032,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
|
||||||
dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
||||||
|
|
||||||
// delete Foo from the data type manager
|
// delete Foo from the data type manager
|
||||||
dtm.remove(foo, TaskMonitor.DUMMY);
|
dtm.remove(foo);
|
||||||
|
|
||||||
// Add s1, s2, s3
|
// Add s1, s2, s3
|
||||||
Structure s1 = new StructureDataType(new CategoryPath("/MISC"), "S1", 0);
|
Structure s1 = new StructureDataType(new CategoryPath("/MISC"), "S1", 0);
|
||||||
|
@ -1181,7 +1180,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
||||||
// remove Bar from the data type manager
|
// remove Bar from the data type manager
|
||||||
dtm.remove(bar, TaskMonitor.DUMMY);
|
dtm.remove(bar);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1296,7 +1295,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
||||||
// remove Bar from the data type manager
|
// remove Bar from the data type manager
|
||||||
dtm.remove(bar, TaskMonitor.DUMMY);
|
dtm.remove(bar);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1409,7 +1408,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
||||||
// remove Bar from the data type manager
|
// remove Bar from the data type manager
|
||||||
dtm.remove(bar, TaskMonitor.DUMMY);
|
dtm.remove(bar);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1482,7 +1481,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
||||||
// remove Bar from the data type manager
|
// remove Bar from the data type manager
|
||||||
dtm.remove(bar, TaskMonitor.DUMMY);
|
dtm.remove(bar);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1579,7 +1578,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
||||||
// remove Bar from the data type manager
|
// remove Bar from the data type manager
|
||||||
dtm.remove(bar, TaskMonitor.DUMMY);
|
dtm.remove(bar);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1670,7 +1669,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
|
||||||
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
||||||
|
|
||||||
// remove Bar from the data type manager
|
// remove Bar from the data type manager
|
||||||
dtm.remove(bar, TaskMonitor.DUMMY);
|
dtm.remove(bar);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1756,7 +1755,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
|
||||||
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
||||||
|
|
||||||
// remove Bar from the data type manager
|
// remove Bar from the data type manager
|
||||||
dtm.remove(bar, TaskMonitor.DUMMY);
|
dtm.remove(bar);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1838,7 +1837,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
|
||||||
// remove Bar from the data type manager
|
// remove Bar from the data type manager
|
||||||
dtm.remove(bar, TaskMonitor.DUMMY);
|
dtm.remove(bar);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -29,7 +29,6 @@ import ghidra.program.model.data.*;
|
||||||
import ghidra.program.model.data.Enum;
|
import ghidra.program.model.data.Enum;
|
||||||
import ghidra.util.InvalidNameException;
|
import ghidra.util.InvalidNameException;
|
||||||
import ghidra.util.exception.DuplicateNameException;
|
import ghidra.util.exception.DuplicateNameException;
|
||||||
import ghidra.util.task.TaskMonitor;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -48,10 +47,10 @@ public class DataTypeMerge5Test extends AbstractDataTypeMergeTest {
|
||||||
public void modifyLatest(ProgramDB program) {
|
public void modifyLatest(ProgramDB program) {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
||||||
dtm.remove(s, TaskMonitor.DUMMY);
|
dtm.remove(s);
|
||||||
DataType dt =
|
DataType dt =
|
||||||
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -126,10 +125,10 @@ public class DataTypeMerge5Test extends AbstractDataTypeMergeTest {
|
||||||
public void modifyLatest(ProgramDB program) {
|
public void modifyLatest(ProgramDB program) {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
||||||
dtm.remove(s, TaskMonitor.DUMMY);
|
dtm.remove(s);
|
||||||
DataType dt =
|
DataType dt =
|
||||||
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -227,10 +226,10 @@ public class DataTypeMerge5Test extends AbstractDataTypeMergeTest {
|
||||||
public void modifyLatest(ProgramDB program) {
|
public void modifyLatest(ProgramDB program) {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
||||||
dtm.remove(s, TaskMonitor.DUMMY);
|
dtm.remove(s);
|
||||||
DataType dt =
|
DataType dt =
|
||||||
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -336,10 +335,10 @@ public class DataTypeMerge5Test extends AbstractDataTypeMergeTest {
|
||||||
public void modifyLatest(ProgramDB program) {
|
public void modifyLatest(ProgramDB program) {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
||||||
dtm.remove(s, TaskMonitor.DUMMY);
|
dtm.remove(s);
|
||||||
DataType dt =
|
DataType dt =
|
||||||
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
|
|
||||||
// edit FavoriteColors
|
// edit FavoriteColors
|
||||||
Enum enumm = (Enum) dtm.getDataType(new CategoryPath("/MISC"), "FavoriteColors");
|
Enum enumm = (Enum) dtm.getDataType(new CategoryPath("/MISC"), "FavoriteColors");
|
||||||
|
@ -459,14 +458,14 @@ public class DataTypeMerge5Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
|
|
||||||
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
||||||
dtm.remove(s, TaskMonitor.DUMMY);
|
dtm.remove(s);
|
||||||
DataType dt =
|
DataType dt =
|
||||||
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
|
|
||||||
// delete FavoriteColors
|
// delete FavoriteColors
|
||||||
Enum enumm = (Enum) dtm.getDataType(new CategoryPath("/MISC"), "FavoriteColors");
|
Enum enumm = (Enum) dtm.getDataType(new CategoryPath("/MISC"), "FavoriteColors");
|
||||||
dtm.remove(enumm, TaskMonitor.DUMMY);
|
dtm.remove(enumm);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -579,14 +578,14 @@ public class DataTypeMerge5Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
|
|
||||||
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
||||||
dtm.remove(s, TaskMonitor.DUMMY);
|
dtm.remove(s);
|
||||||
DataType dt =
|
DataType dt =
|
||||||
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
|
|
||||||
// delete FavoriteColors
|
// delete FavoriteColors
|
||||||
Enum enumm = (Enum) dtm.getDataType(new CategoryPath("/MISC"), "FavoriteColors");
|
Enum enumm = (Enum) dtm.getDataType(new CategoryPath("/MISC"), "FavoriteColors");
|
||||||
dtm.remove(enumm, TaskMonitor.DUMMY);
|
dtm.remove(enumm);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -710,10 +709,10 @@ public class DataTypeMerge5Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
|
|
||||||
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
||||||
dtm.remove(s, TaskMonitor.DUMMY);
|
dtm.remove(s);
|
||||||
DataType dt =
|
DataType dt =
|
||||||
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
|
|
||||||
// edit FavoriteColors
|
// edit FavoriteColors
|
||||||
Enum enumm = (Enum) dtm.getDataType(new CategoryPath("/MISC"), "FavoriteColors");
|
Enum enumm = (Enum) dtm.getDataType(new CategoryPath("/MISC"), "FavoriteColors");
|
||||||
|
@ -834,10 +833,10 @@ public class DataTypeMerge5Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
|
|
||||||
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
||||||
dtm.remove(s, TaskMonitor.DUMMY);
|
dtm.remove(s);
|
||||||
DataType dt =
|
DataType dt =
|
||||||
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
|
|
||||||
// edit FavoriteColors
|
// edit FavoriteColors
|
||||||
Enum enumm = (Enum) dtm.getDataType(new CategoryPath("/MISC"), "FavoriteColors");
|
Enum enumm = (Enum) dtm.getDataType(new CategoryPath("/MISC"), "FavoriteColors");
|
||||||
|
@ -968,10 +967,10 @@ public class DataTypeMerge5Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
|
|
||||||
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
||||||
dtm.remove(s, TaskMonitor.DUMMY);
|
dtm.remove(s);
|
||||||
DataType dt =
|
DataType dt =
|
||||||
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
|
|
||||||
// edit FavoriteColors
|
// edit FavoriteColors
|
||||||
Enum enumm = (Enum) dtm.getDataType(new CategoryPath("/MISC"), "FavoriteColors");
|
Enum enumm = (Enum) dtm.getDataType(new CategoryPath("/MISC"), "FavoriteColors");
|
||||||
|
@ -1479,10 +1478,10 @@ public class DataTypeMerge5Test extends AbstractDataTypeMergeTest {
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
|
|
||||||
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
|
||||||
dtm.remove(s, TaskMonitor.DUMMY);
|
dtm.remove(s);
|
||||||
DataType dt =
|
DataType dt =
|
||||||
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
|
||||||
dtm.remove(dt, TaskMonitor.DUMMY);
|
dtm.remove(dt);
|
||||||
|
|
||||||
// edit FavoriteColors
|
// edit FavoriteColors
|
||||||
Enum enumm = (Enum) dtm.getDataType(new CategoryPath("/MISC"), "FavoriteColors");
|
Enum enumm = (Enum) dtm.getDataType(new CategoryPath("/MISC"), "FavoriteColors");
|
||||||
|
|
|
@ -21,7 +21,6 @@ import org.junit.Test;
|
||||||
|
|
||||||
import ghidra.program.database.*;
|
import ghidra.program.database.*;
|
||||||
import ghidra.program.model.data.*;
|
import ghidra.program.model.data.*;
|
||||||
import ghidra.util.task.TaskMonitor;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Data type merge tests for aligned data types.
|
* Data type merge tests for aligned data types.
|
||||||
|
@ -654,7 +653,7 @@ public class DataTypeMerge6Test extends AbstractDataTypeMergeTest {
|
||||||
Structure s =
|
Structure s =
|
||||||
(Structure) dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
|
(Structure) dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
|
||||||
"IntStruct");
|
"IntStruct");
|
||||||
dtm.remove(s, TaskMonitor.DUMMY);
|
dtm.remove(s);
|
||||||
|
|
||||||
// Offsets change to 0,2,4,8.
|
// Offsets change to 0,2,4,8.
|
||||||
Structure intStruct =
|
Structure intStruct =
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
@ -26,7 +26,6 @@ import ghidra.framework.main.*;
|
||||||
import ghidra.program.database.OriginalProgramModifierListener;
|
import ghidra.program.database.OriginalProgramModifierListener;
|
||||||
import ghidra.program.database.ProgramDB;
|
import ghidra.program.database.ProgramDB;
|
||||||
import ghidra.program.model.data.*;
|
import ghidra.program.model.data.*;
|
||||||
import ghidra.util.task.TaskMonitor;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* More data type merge tests.
|
* More data type merge tests.
|
||||||
|
@ -90,7 +89,7 @@ public class DataTypeMerge8Test extends AbstractDataTypeMergeTest {
|
||||||
abc.replace(0, new CharDataType(), 1);
|
abc.replace(0, new CharDataType(), 1);
|
||||||
|
|
||||||
// Remove the XYZ data type.
|
// Remove the XYZ data type.
|
||||||
dtm.remove(xyz, TaskMonitor.DUMMY);
|
dtm.remove(xyz);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -22,7 +22,6 @@ import org.junit.Test;
|
||||||
import ghidra.program.database.OriginalProgramModifierListener;
|
import ghidra.program.database.OriginalProgramModifierListener;
|
||||||
import ghidra.program.database.ProgramDB;
|
import ghidra.program.database.ProgramDB;
|
||||||
import ghidra.program.model.data.*;
|
import ghidra.program.model.data.*;
|
||||||
import ghidra.util.task.TaskMonitor;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Data type merge tests with fixup for data types added in My program.
|
* Data type merge tests with fixup for data types added in My program.
|
||||||
|
@ -73,7 +72,7 @@ public class DataTypeMergeFixupTest extends AbstractDataTypeMergeTest {
|
||||||
Structure inner = (Structure) dtm.getDataType(rootPath, "inner");
|
Structure inner = (Structure) dtm.getDataType(rootPath, "inner");
|
||||||
|
|
||||||
// Remove inner struct
|
// Remove inner struct
|
||||||
dtm.remove(inner, TaskMonitor.DUMMY);
|
dtm.remove(inner);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -211,7 +210,7 @@ public class DataTypeMergeFixupTest extends AbstractDataTypeMergeTest {
|
||||||
Structure inner = (Structure) dtm.getDataType(rootPath, "inner");
|
Structure inner = (Structure) dtm.getDataType(rootPath, "inner");
|
||||||
|
|
||||||
// Remove inner struct
|
// Remove inner struct
|
||||||
dtm.remove(inner, TaskMonitor.DUMMY);
|
dtm.remove(inner);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -303,7 +302,7 @@ public class DataTypeMergeFixupTest extends AbstractDataTypeMergeTest {
|
||||||
Structure inner = (Structure) dtm.getDataType(rootPath, "inner");
|
Structure inner = (Structure) dtm.getDataType(rootPath, "inner");
|
||||||
|
|
||||||
// Remove inner struct
|
// Remove inner struct
|
||||||
dtm.remove(inner, TaskMonitor.DUMMY);
|
dtm.remove(inner);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
@ -22,7 +22,6 @@ import org.junit.Test;
|
||||||
import ghidra.program.database.ProgramDB;
|
import ghidra.program.database.ProgramDB;
|
||||||
import ghidra.program.database.ProgramModifierListener;
|
import ghidra.program.database.ProgramModifierListener;
|
||||||
import ghidra.program.model.data.*;
|
import ghidra.program.model.data.*;
|
||||||
import ghidra.util.task.TaskMonitor;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests for merging data types.
|
* Tests for merging data types.
|
||||||
|
@ -88,7 +87,7 @@ public class DataTypeMergeUseForAllTest extends AbstractDataTypeMergeTest {
|
||||||
"CharStruct");
|
"CharStruct");
|
||||||
|
|
||||||
intStruct.add(new ByteDataType());// Change data type.
|
intStruct.add(new ByteDataType());// Change data type.
|
||||||
dtm.remove(coolUnion, TaskMonitor.DUMMY);// Remove the data type.
|
dtm.remove(coolUnion);// Remove the data type.
|
||||||
charStruct.add(new FloatDataType());
|
charStruct.add(new FloatDataType());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,7 +105,7 @@ public class DataTypeMergeUseForAllTest extends AbstractDataTypeMergeTest {
|
||||||
(Structure) dtm.getDataType(new CategoryPath("/Category1/Category2/Category4"),
|
(Structure) dtm.getDataType(new CategoryPath("/Category1/Category2/Category4"),
|
||||||
"CharStruct");
|
"CharStruct");
|
||||||
|
|
||||||
dtm.remove(intStruct, TaskMonitor.DUMMY);// Remove the data type.
|
dtm.remove(intStruct);// Remove the data type.
|
||||||
coolUnion.delete(2);
|
coolUnion.delete(2);
|
||||||
charStruct.add(new CharDataType());
|
charStruct.add(new CharDataType());
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,6 @@ import org.junit.Test;
|
||||||
import ghidra.program.model.data.DataTypeManager;
|
import ghidra.program.model.data.DataTypeManager;
|
||||||
import ghidra.program.model.data.Structure;
|
import ghidra.program.model.data.Structure;
|
||||||
import ghidra.util.exception.DuplicateNameException;
|
import ghidra.util.exception.DuplicateNameException;
|
||||||
import ghidra.util.task.TaskMonitor;
|
|
||||||
|
|
||||||
public class StructureEditorLockedEnablementTest extends AbstractStructureEditorTest {
|
public class StructureEditorLockedEnablementTest extends AbstractStructureEditorTest {
|
||||||
|
|
||||||
|
@ -33,7 +32,7 @@ public class StructureEditorLockedEnablementTest extends AbstractStructureEditor
|
||||||
Structure desiredEmptyStructure = emptyStructure;
|
Structure desiredEmptyStructure = emptyStructure;
|
||||||
int txID = program.startTransaction("Removing emptyStruct from DTM.");
|
int txID = program.startTransaction("Removing emptyStruct from DTM.");
|
||||||
try {
|
try {
|
||||||
programDTM.remove(emptyStructure, TaskMonitor.DUMMY);
|
programDTM.remove(emptyStructure);
|
||||||
if (emptyStructure.getDataTypeManager() != catDTM) {
|
if (emptyStructure.getDataTypeManager() != catDTM) {
|
||||||
desiredEmptyStructure = (Structure) emptyStructure.copy(catDTM);
|
desiredEmptyStructure = (Structure) emptyStructure.copy(catDTM);
|
||||||
desiredEmptyStructure.setCategoryPath(pgmTestCat.getCategoryPath());
|
desiredEmptyStructure.setCategoryPath(pgmTestCat.getCategoryPath());
|
||||||
|
|
|
@ -36,7 +36,7 @@ public class StructureEditorNotifiedTest extends AbstractStructureEditorTest {
|
||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
super.setUp();
|
super.setUp();
|
||||||
|
|
||||||
// Create overlapping trasnaction to handle all changes
|
// Create overlapping transaction to handle all changes
|
||||||
persistentTxId = program.startTransaction("Modify Program");
|
persistentTxId = program.startTransaction("Modify Program");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ public class StructureEditorNotifiedTest extends AbstractStructureEditorTest {
|
||||||
assertEquals("complexStructure *", dataType10.getDisplayName());
|
assertEquals("complexStructure *", dataType10.getDisplayName());
|
||||||
assertEquals(4, getLength(10));
|
assertEquals(4, getLength(10));
|
||||||
|
|
||||||
programDTM.remove(complexStructure, TaskMonitor.DUMMY);
|
programDTM.remove(complexStructure);
|
||||||
programDTM.getCategory(pgmRootCat.getCategoryPath())
|
programDTM.getCategory(pgmRootCat.getCategoryPath())
|
||||||
.removeCategory("Temp", TaskMonitor.DUMMY);
|
.removeCategory("Temp", TaskMonitor.DUMMY);
|
||||||
|
|
||||||
|
@ -505,7 +505,7 @@ public class StructureEditorNotifiedTest extends AbstractStructureEditorTest {
|
||||||
assertEquals(0x145, model.getLength());
|
assertEquals(0x145, model.getLength());
|
||||||
|
|
||||||
runSwing(
|
runSwing(
|
||||||
() -> complexStructure.getDataTypeManager().remove(simpleUnion, TaskMonitor.DUMMY));
|
() -> complexStructure.getDataTypeManager().remove(simpleUnion));
|
||||||
waitForSwing();
|
waitForSwing();
|
||||||
assertEquals(23, model.getNumComponents());
|
assertEquals(23, model.getNumComponents());
|
||||||
assertTrue(dt3.isEquivalent(getDataType(3)));
|
assertTrue(dt3.isEquivalent(getDataType(3)));
|
||||||
|
@ -536,7 +536,7 @@ public class StructureEditorNotifiedTest extends AbstractStructureEditorTest {
|
||||||
assertTrue(simpleStructure.isEquivalent(getDataType(0)));
|
assertTrue(simpleStructure.isEquivalent(getDataType(0)));
|
||||||
|
|
||||||
runSwing(
|
runSwing(
|
||||||
() -> simpleStructure.getDataTypeManager().remove(simpleStructure, TaskMonitor.DUMMY));
|
() -> simpleStructure.getDataTypeManager().remove(simpleStructure));
|
||||||
waitForSwing();
|
waitForSwing();
|
||||||
|
|
||||||
assertEquals(1, model.getNumComponents());// component becomes BadDataType
|
assertEquals(1, model.getNumComponents());// component becomes BadDataType
|
||||||
|
|
|
@ -115,7 +115,7 @@ public class UnionEditorNotifiedTest extends AbstractUnionEditorTest {
|
||||||
DataType dt18 = getDataType(18).clone(programDTM);
|
DataType dt18 = getDataType(18).clone(programDTM);
|
||||||
DataType dt20 = getDataType(20).clone(programDTM);
|
DataType dt20 = getDataType(20).clone(programDTM);
|
||||||
SwingUtilities.invokeLater(() -> {
|
SwingUtilities.invokeLater(() -> {
|
||||||
programDTM.remove(complexUnion, TaskMonitor.DUMMY);
|
programDTM.remove(complexUnion);
|
||||||
programDTM.getCategory(pgmRootCat.getCategoryPath())
|
programDTM.getCategory(pgmRootCat.getCategoryPath())
|
||||||
.removeCategory("Temp", TaskMonitor.DUMMY);
|
.removeCategory("Temp", TaskMonitor.DUMMY);
|
||||||
});
|
});
|
||||||
|
@ -319,7 +319,7 @@ public class UnionEditorNotifiedTest extends AbstractUnionEditorTest {
|
||||||
assertEquals(0x57, model.getLength());
|
assertEquals(0x57, model.getLength());
|
||||||
|
|
||||||
SwingUtilities.invokeLater(
|
SwingUtilities.invokeLater(
|
||||||
() -> complexUnion.getDataTypeManager().remove(simpleStructure, TaskMonitor.DUMMY));
|
() -> complexUnion.getDataTypeManager().remove(simpleStructure));
|
||||||
waitForSwing();
|
waitForSwing();
|
||||||
|
|
||||||
assertEquals(21, model.getNumComponents());
|
assertEquals(21, model.getNumComponents());
|
||||||
|
@ -362,7 +362,7 @@ public class UnionEditorNotifiedTest extends AbstractUnionEditorTest {
|
||||||
assertEquals(8, model.getLength());
|
assertEquals(8, model.getLength());
|
||||||
|
|
||||||
SwingUtilities.invokeLater(
|
SwingUtilities.invokeLater(
|
||||||
() -> simpleUnion.getDataTypeManager().remove(simpleUnion, TaskMonitor.DUMMY));
|
() -> simpleUnion.getDataTypeManager().remove(simpleUnion));
|
||||||
waitForSwing();
|
waitForSwing();
|
||||||
|
|
||||||
assertEquals(1, model.getNumComponents());
|
assertEquals(1, model.getNumComponents());
|
||||||
|
@ -387,7 +387,7 @@ public class UnionEditorNotifiedTest extends AbstractUnionEditorTest {
|
||||||
Union refUnion = (Union) dtm.getDataType("/testCat/refUnion");
|
Union refUnion = (Union) dtm.getDataType("/testCat/refUnion");
|
||||||
assertNotNull(refUnion);
|
assertNotNull(refUnion);
|
||||||
|
|
||||||
SwingUtilities.invokeLater(() -> dtm.remove(refUnion, TaskMonitor.DUMMY)); // remove refUnion
|
SwingUtilities.invokeLater(() -> dtm.remove(refUnion)); // remove refUnion
|
||||||
waitForSwing();
|
waitForSwing();
|
||||||
|
|
||||||
// refUnion* gets removed
|
// refUnion* gets removed
|
||||||
|
@ -403,7 +403,7 @@ public class UnionEditorNotifiedTest extends AbstractUnionEditorTest {
|
||||||
assertTrue(dt20.isEquivalent(getDataType(20)));
|
assertTrue(dt20.isEquivalent(getDataType(20)));
|
||||||
|
|
||||||
SwingUtilities.invokeLater(
|
SwingUtilities.invokeLater(
|
||||||
() -> simpleUnion.getDataTypeManager().remove(simpleUnion, TaskMonitor.DUMMY));
|
() -> simpleUnion.getDataTypeManager().remove(simpleUnion));
|
||||||
waitForSwing();
|
waitForSwing();
|
||||||
|
|
||||||
assertEquals(len, model.getLength());
|
assertEquals(len, model.getLength());
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
@ -607,7 +607,7 @@ public class EnumEditor1Test extends AbstractGhidraHeadedIntegrationTest {
|
||||||
|
|
||||||
DataTypeManager dtm = program.getDataTypeManager();
|
DataTypeManager dtm = program.getDataTypeManager();
|
||||||
int transactionID = program.startTransaction("Test");
|
int transactionID = program.startTransaction("Test");
|
||||||
dtm.remove(enummDt, TaskMonitor.DUMMY);
|
dtm.remove(enummDt);
|
||||||
program.endTransaction(transactionID, true);
|
program.endTransaction(transactionID, true);
|
||||||
program.flushEvents();
|
program.flushEvents();
|
||||||
waitForSwing();
|
waitForSwing();
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
@ -117,7 +117,7 @@ public class ArrayTest extends AbstractGhidraHeadedIntegrationTest {
|
||||||
listing.getDataAt(addr(0x100));
|
listing.getDataAt(addr(0x100));
|
||||||
CategoryPath path = dt.getCategoryPath();
|
CategoryPath path = dt.getCategoryPath();
|
||||||
assertNotNull(path);
|
assertNotNull(path);
|
||||||
dt.getDataTypeManager().remove(dt, TaskMonitor.DUMMY);
|
dt.getDataTypeManager().remove(dt);
|
||||||
|
|
||||||
assertTrue(array.isDeleted());
|
assertTrue(array.isDeleted());
|
||||||
assertNull(dt.getDataTypeManager().getDataType(path, name));
|
assertNull(dt.getDataTypeManager().getDataType(path, name));
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
@ -17,8 +17,7 @@ package ghidra.program.database.data;
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Iterator;
|
|
||||||
|
|
||||||
import org.junit.*;
|
import org.junit.*;
|
||||||
|
|
||||||
|
@ -28,7 +27,6 @@ import ghidra.program.model.data.*;
|
||||||
import ghidra.test.AbstractGhidraHeadedIntegrationTest;
|
import ghidra.test.AbstractGhidraHeadedIntegrationTest;
|
||||||
import ghidra.util.InvalidNameException;
|
import ghidra.util.InvalidNameException;
|
||||||
import ghidra.util.task.TaskMonitor;
|
import ghidra.util.task.TaskMonitor;
|
||||||
import ghidra.util.task.TaskMonitorAdapter;
|
|
||||||
|
|
||||||
public class DataManagerTest extends AbstractGhidraHeadedIntegrationTest {
|
public class DataManagerTest extends AbstractGhidraHeadedIntegrationTest {
|
||||||
private ProgramDB program;
|
private ProgramDB program;
|
||||||
|
@ -274,7 +272,7 @@ public class DataManagerTest extends AbstractGhidraHeadedIntegrationTest {
|
||||||
assertTrue(p.isEquivalent(dataMgr.getDataType("/ByteTypedef *32")));
|
assertTrue(p.isEquivalent(dataMgr.getDataType("/ByteTypedef *32")));
|
||||||
assertTrue(ptr.isEquivalent(dataMgr.getDataType("/ByteTypedef *32 *32")));
|
assertTrue(ptr.isEquivalent(dataMgr.getDataType("/ByteTypedef *32 *32")));
|
||||||
DataType bdt = dataMgr.getDataType("/byte");
|
DataType bdt = dataMgr.getDataType("/byte");
|
||||||
dataMgr.remove(bdt, new TaskMonitorAdapter());
|
dataMgr.remove(bdt);
|
||||||
assertNull(dataMgr.getDataType("/byte"));
|
assertNull(dataMgr.getDataType("/byte"));
|
||||||
assertNull(dataMgr.getDataType("/byte[5]"));
|
assertNull(dataMgr.getDataType("/byte[5]"));
|
||||||
assertNull(dataMgr.getDataType("/ByteTypedef"));
|
assertNull(dataMgr.getDataType("/ByteTypedef"));
|
||||||
|
@ -294,11 +292,31 @@ public class DataManagerTest extends AbstractGhidraHeadedIntegrationTest {
|
||||||
DataType bdt = td.getDataType();
|
DataType bdt = td.getDataType();
|
||||||
long byteID = dataMgr.getResolvedID(bdt);
|
long byteID = dataMgr.getResolvedID(bdt);
|
||||||
|
|
||||||
dataMgr.remove(td, new TaskMonitorAdapter());
|
dataMgr.remove(td);
|
||||||
assertNull(ptr.getDataType());
|
assertNull(ptr.getDataType());
|
||||||
assertNotNull(dataMgr.getDataType(byteID));
|
assertNotNull(dataMgr.getDataType(byteID));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRemoveDataTypes() throws Exception {
|
||||||
|
Array array = new ArrayDataType(new ByteDataType(), 5, 1);
|
||||||
|
|
||||||
|
List<DataType> toDelete = new ArrayList<>();
|
||||||
|
|
||||||
|
// Use a number that will trigger the 'chunking' behavior of the DataTypeManagerDB
|
||||||
|
for (int i = 0; i < 2500; i++) {
|
||||||
|
TypeDef td = new TypedefDataType("ByteTypedef" + (i + 1), array);
|
||||||
|
DataType dt = dataMgr.resolve(td, null);
|
||||||
|
toDelete.add(dt);
|
||||||
|
}
|
||||||
|
|
||||||
|
dataMgr.remove(toDelete, TaskMonitor.DUMMY);
|
||||||
|
|
||||||
|
for (DataType dt : toDelete) {
|
||||||
|
assertFalse(dataMgr.contains(dt));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// public void testSave() throws Exception {
|
// public void testSave() throws Exception {
|
||||||
//
|
//
|
||||||
// Array array = new ArrayDataType(new ByteDataType(), 5);
|
// Array array = new ArrayDataType(new ByteDataType(), 5);
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
@ -517,7 +517,7 @@ public class SettingsTest extends AbstractGhidraHeadedIntegrationTest {
|
||||||
endTransaction();
|
endTransaction();
|
||||||
|
|
||||||
startTransaction();
|
startTransaction();
|
||||||
dataMgr.remove(td, TaskMonitor.DUMMY);
|
dataMgr.remove(td);
|
||||||
endTransaction();
|
endTransaction();
|
||||||
// make sure accessing the settings does not blow up
|
// make sure accessing the settings does not blow up
|
||||||
assertTrue(td.isDeleted());
|
assertTrue(td.isDeleted());
|
||||||
|
|
|
@ -1296,7 +1296,7 @@ public class FunctionDBTest extends AbstractGhidraHeadedIntegrationTest
|
||||||
// delete the typedef data type
|
// delete the typedef data type
|
||||||
localTransactionID = program.startTransaction("test");
|
localTransactionID = program.startTransaction("test");
|
||||||
try {
|
try {
|
||||||
program.getDataTypeManager().remove(td, TaskMonitor.DUMMY);
|
program.getDataTypeManager().remove(td);
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
program.endTransaction(localTransactionID, true);
|
program.endTransaction(localTransactionID, true);
|
||||||
|
|
|
@ -4251,7 +4251,7 @@ public class RecoveredClassHelper {
|
||||||
DataType dataType = dataTypeManager.getDataType(folderPath, structureName);
|
DataType dataType = dataTypeManager.getDataType(folderPath, structureName);
|
||||||
if (extendedFlatAPI.isEmptyStructure(dataType)) {
|
if (extendedFlatAPI.isEmptyStructure(dataType)) {
|
||||||
|
|
||||||
dataTypeManager.remove(dataType, monitor);
|
dataTypeManager.remove(dataType);
|
||||||
Category classCategory = dataTypeManager.getCategory(folderPath);
|
Category classCategory = dataTypeManager.getCategory(folderPath);
|
||||||
Category parentCategory = classCategory.getParent();
|
Category parentCategory = classCategory.getParent();
|
||||||
boolean tryToRemove = true;
|
boolean tryToRemove = true;
|
||||||
|
|
|
@ -314,7 +314,7 @@ public class ProjectDataTypeManager extends StandAloneDataTypeManager
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void close() {
|
public synchronized void close() {
|
||||||
// do nothing - cannot close a project data type manager
|
// do nothing - cannot close a project data type manager
|
||||||
// dispose should be invoked by the owner of the instance
|
// dispose should be invoked by the owner of the instance
|
||||||
}
|
}
|
||||||
|
|
|
@ -2707,20 +2707,18 @@ public class CodeManager implements ErrorHandler, ManagerDB {
|
||||||
public void clearData(Set<Long> dataTypeIDs, TaskMonitor monitor) throws CancelledException {
|
public void clearData(Set<Long> dataTypeIDs, TaskMonitor monitor) throws CancelledException {
|
||||||
lock.acquire();
|
lock.acquire();
|
||||||
try {
|
try {
|
||||||
List<Address> addrs = new ArrayList<>();
|
List<Address> toClear = new ArrayList<>();
|
||||||
RecordIterator it = dataAdapter.getRecords();
|
RecordIterator it = dataAdapter.getRecords();
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
monitor.checkCancelled();
|
monitor.checkCancelled();
|
||||||
DBRecord rec = it.next();
|
DBRecord rec = it.next();
|
||||||
long id = rec.getLongValue(DataDBAdapter.DATA_TYPE_ID_COL);
|
long id = rec.getLongValue(DataDBAdapter.DATA_TYPE_ID_COL);
|
||||||
for (long dataTypeID : dataTypeIDs) {
|
if (dataTypeIDs.contains(id)) {
|
||||||
if (id == dataTypeID) {
|
toClear.add(addrMap.decodeAddress(rec.getKey()));
|
||||||
addrs.add(addrMap.decodeAddress(rec.getKey()));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (Address addr : addrs) {
|
|
||||||
|
for (Address addr : toClear) {
|
||||||
monitor.checkCancelled();
|
monitor.checkCancelled();
|
||||||
clearCodeUnits(addr, addr, false, monitor);
|
clearCodeUnits(addr, addr, false, monitor);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
@ -27,8 +27,7 @@ import ghidra.program.model.data.*;
|
||||||
import ghidra.program.model.data.DataTypeConflictHandler.ConflictResult;
|
import ghidra.program.model.data.DataTypeConflictHandler.ConflictResult;
|
||||||
import ghidra.util.InvalidNameException;
|
import ghidra.util.InvalidNameException;
|
||||||
import ghidra.util.Lock;
|
import ghidra.util.Lock;
|
||||||
import ghidra.util.exception.AssertException;
|
import ghidra.util.exception.*;
|
||||||
import ghidra.util.exception.DuplicateNameException;
|
|
||||||
import ghidra.util.task.TaskMonitor;
|
import ghidra.util.task.TaskMonitor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -308,9 +307,6 @@ class CategoryDB extends DatabaseObject implements Category {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @see ghidra.program.model.data.Category#removeCategory(java.lang.String, ghidra.util.task.TaskMonitor)
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public boolean removeCategory(String categoryName, TaskMonitor monitor) {
|
public boolean removeCategory(String categoryName, TaskMonitor monitor) {
|
||||||
mgr.lock.acquire();
|
mgr.lock.acquire();
|
||||||
|
@ -320,6 +316,7 @@ class CategoryDB extends DatabaseObject implements Category {
|
||||||
if (c == null) {
|
if (c == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Category[] cats = c.getCategories();
|
Category[] cats = c.getCategories();
|
||||||
for (Category cat : cats) {
|
for (Category cat : cats) {
|
||||||
if (monitor.isCancelled()) {
|
if (monitor.isCancelled()) {
|
||||||
|
@ -327,13 +324,16 @@ class CategoryDB extends DatabaseObject implements Category {
|
||||||
}
|
}
|
||||||
c.removeCategory(cat.getName(), monitor);
|
c.removeCategory(cat.getName(), monitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
DataType[] dts = c.getDataTypes();
|
DataType[] dts = c.getDataTypes();
|
||||||
for (DataType dt : dts) {
|
List<DataType> dtList = Arrays.asList(dts);
|
||||||
if (monitor.isCancelled()) {
|
try {
|
||||||
return false;
|
mgr.remove(dtList, monitor);
|
||||||
}
|
|
||||||
mgr.remove(dt, monitor);
|
|
||||||
}
|
}
|
||||||
|
catch (CancelledException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
mgr.getCategoryDBAdapter().removeCategory(c.getKey());
|
mgr.getCategoryDBAdapter().removeCategory(c.getKey());
|
||||||
subcategoryMap.remove(categoryName);
|
subcategoryMap.remove(categoryName);
|
||||||
|
@ -565,7 +565,7 @@ class CategoryDB extends DatabaseObject implements Category {
|
||||||
throw new IllegalArgumentException(
|
throw new IllegalArgumentException(
|
||||||
"can't remove dataType from category that its not a member of!");
|
"can't remove dataType from category that its not a member of!");
|
||||||
}
|
}
|
||||||
return mgr.remove(type, monitor);
|
return mgr.remove(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -164,7 +164,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
|
||||||
*/
|
*/
|
||||||
private Set<Long> blockedRemovalsByID;
|
private Set<Long> blockedRemovalsByID;
|
||||||
|
|
||||||
// TODO: idsToDataTypeMap may have issue since there could be a one to many mapping
|
// Note: idsToDataTypeMap may have issue since there could be a one to many mapping
|
||||||
// (e.g., type with same UniversalID could be in multiple categories unless specifically
|
// (e.g., type with same UniversalID could be in multiple categories unless specifically
|
||||||
// prevented during resolve)
|
// prevented during resolve)
|
||||||
private IdsToDataTypeMap idsToDataTypeMap = new IdsToDataTypeMap();
|
private IdsToDataTypeMap idsToDataTypeMap = new IdsToDataTypeMap();
|
||||||
|
@ -172,7 +172,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
|
||||||
private ThreadLocal<EquivalenceCache> equivalenceCache = new ThreadLocal<>();
|
private ThreadLocal<EquivalenceCache> equivalenceCache = new ThreadLocal<>();
|
||||||
|
|
||||||
private IdentityHashMap<DataType, DataType> resolveCache;
|
private IdentityHashMap<DataType, DataType> resolveCache;
|
||||||
private TreeSet<ResolvePair> resolveQueue; // TODO: is TreeSet really needed?
|
private TreeSet<ResolvePair> resolveQueue; // Note: is TreeSet really needed?
|
||||||
private LinkedList<DataType> conflictQueue = new LinkedList<>();
|
private LinkedList<DataType> conflictQueue = new LinkedList<>();
|
||||||
|
|
||||||
private boolean isBulkRemoving;
|
private boolean isBulkRemoving;
|
||||||
|
@ -1421,14 +1421,14 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
|
||||||
if (!(dataType instanceof Enum)) {
|
if (!(dataType instanceof Enum)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// TODO: implement doReplaceWith
|
// DT: implement doReplaceWith
|
||||||
existingDataType.replaceWith(dataType);
|
existingDataType.replaceWith(dataType);
|
||||||
}
|
}
|
||||||
else if (existingDataType instanceof TypedefDB) {
|
else if (existingDataType instanceof TypedefDB) {
|
||||||
if (!(dataType instanceof TypeDef)) {
|
if (!(dataType instanceof TypeDef)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// TODO: implement doReplaceWith
|
// DT: implement doReplaceWith
|
||||||
existingDataType.replaceWith(dataType);
|
existingDataType.replaceWith(dataType);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1733,7 +1733,6 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
|
||||||
}
|
}
|
||||||
catch (DataTypeDependencyException e) {
|
catch (DataTypeDependencyException e) {
|
||||||
// new type refers to old type - fallthrough to RENAME_AND_ADD
|
// new type refers to old type - fallthrough to RENAME_AND_ADD
|
||||||
// TODO: alternatively we could throw an exception
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case RENAME_AND_ADD: // default handler behavior
|
case RENAME_AND_ADD: // default handler behavior
|
||||||
|
@ -1760,7 +1759,6 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
|
||||||
private void replaceEquivalentLocalWithSourceDataType(DataType dataType,
|
private void replaceEquivalentLocalWithSourceDataType(DataType dataType,
|
||||||
SourceArchive sourceArchive, DataType existingDataType) {
|
SourceArchive sourceArchive, DataType existingDataType) {
|
||||||
// Since it's equivalent, set its source, ID, and replace its components.
|
// Since it's equivalent, set its source, ID, and replace its components.
|
||||||
// TODO: Need a better way to do this.
|
|
||||||
existingDataType.setSourceArchive(sourceArchive);
|
existingDataType.setSourceArchive(sourceArchive);
|
||||||
((DataTypeDB) existingDataType).setUniversalID(dataType.getUniversalID());
|
((DataTypeDB) existingDataType).setUniversalID(dataType.getUniversalID());
|
||||||
existingDataType.replaceWith(dataType);
|
existingDataType.replaceWith(dataType);
|
||||||
|
@ -1786,9 +1784,9 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
|
||||||
lock.acquire();
|
lock.acquire();
|
||||||
boolean isEquivalenceCacheOwner = activateEquivalenceCache();
|
boolean isEquivalenceCacheOwner = activateEquivalenceCache();
|
||||||
boolean isResolveCacheOwner = activateResolveCache();
|
boolean isResolveCacheOwner = activateResolveCache();
|
||||||
// TODO: extended hold time on lock may cause the GUI to become
|
// Note: extended hold time on lock may cause the GUI to become unresponsive. Consider
|
||||||
// unresponsive. Consider releasing lock between resolves, although
|
// releasing lock between resolves, although this exposes risk of having active resolve
|
||||||
// this exposes risk of having active resolve queue/cache without lock
|
// queue/cache without lock.
|
||||||
try {
|
try {
|
||||||
monitor.setMessage("Adding datatypes...");
|
monitor.setMessage("Adding datatypes...");
|
||||||
monitor.setMaximum(dataTypes.size());
|
monitor.setMaximum(dataTypes.size());
|
||||||
|
@ -1879,7 +1877,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
|
||||||
@Override
|
@Override
|
||||||
public DataType replaceDataType(DataType existingDt, DataType replacementDt,
|
public DataType replaceDataType(DataType existingDt, DataType replacementDt,
|
||||||
boolean updateCategoryPath) throws DataTypeDependencyException {
|
boolean updateCategoryPath) throws DataTypeDependencyException {
|
||||||
// TODO: we should probably disallow replacementDt to be an instanceof
|
// Note: we should probably disallow replacementDt to be an instanceof
|
||||||
// Dynamic or FactoryDataType
|
// Dynamic or FactoryDataType
|
||||||
lock.acquire();
|
lock.acquire();
|
||||||
try {
|
try {
|
||||||
|
@ -2342,11 +2340,30 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
|
||||||
if (id <= 0) { // removal of certain special types not permitted
|
if (id <= 0) { // removal of certain special types not permitted
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
idsToDelete.add(id);
|
idsToDelete.add(id);
|
||||||
removeQueuedDataTypes();
|
removeQueuedDataTypes();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void removeInternal(List<DataType> dataTypes) {
|
||||||
|
for (DataType dt : dataTypes) {
|
||||||
|
|
||||||
|
if (!contains(dt)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
long id = getID(dt);
|
||||||
|
if (id <= 0) { // removal of certain special types not permitted
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
idsToDelete.add(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
removeQueuedDataTypes();
|
||||||
|
}
|
||||||
|
|
||||||
private void removeQueuedDataTypes() {
|
private void removeQueuedDataTypes() {
|
||||||
|
|
||||||
// collect all datatype to be removed and notify children which may also get queued
|
// collect all datatype to be removed and notify children which may also get queued
|
||||||
|
@ -2358,7 +2375,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
|
||||||
deletedIds.add(id);
|
deletedIds.add(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// perform any neccessary external use removals
|
// perform any necessary external use removals
|
||||||
deleteDataTypesUsed(deletedIds);
|
deleteDataTypesUsed(deletedIds);
|
||||||
|
|
||||||
// perform actual database updates (e.g., record removal, change notifications, etc.)
|
// perform actual database updates (e.g., record removal, change notifications, etc.)
|
||||||
|
@ -2375,7 +2392,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allow extensions to perform any neccessary fixups for all datatype removals listed.
|
* Allow extensions to perform any necessary fixups for all datatype removals listed.
|
||||||
* @param deletedIds list of IDs for all datatypes which are getting removed.
|
* @param deletedIds list of IDs for all datatypes which are getting removed.
|
||||||
*/
|
*/
|
||||||
protected abstract void deleteDataTypesUsed(Set<Long> deletedIds);
|
protected abstract void deleteDataTypesUsed(Set<Long> deletedIds);
|
||||||
|
@ -2399,7 +2416,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean remove(DataType dataType, TaskMonitor monitor) {
|
public boolean remove(DataType dataType) {
|
||||||
lock.acquire();
|
lock.acquire();
|
||||||
try {
|
try {
|
||||||
return removeInternal(dataType);
|
return removeInternal(dataType);
|
||||||
|
@ -2409,6 +2426,32 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void remove(List<DataType> dataTypes, TaskMonitor monitor) throws CancelledException {
|
||||||
|
|
||||||
|
lock.acquire();
|
||||||
|
try {
|
||||||
|
|
||||||
|
// perform the delete in chunks so an excessively large list will still be cancellable
|
||||||
|
int n = dataTypes.size();
|
||||||
|
int chunk = 1000;
|
||||||
|
int chunkEnd = n < chunk ? n : chunk;
|
||||||
|
int start = 0;
|
||||||
|
while (start < chunkEnd) {
|
||||||
|
monitor.checkCancelled();
|
||||||
|
List<DataType> subList = dataTypes.subList(start, chunkEnd);
|
||||||
|
removeInternal(subList);
|
||||||
|
|
||||||
|
start = chunkEnd;
|
||||||
|
int nextChunk = chunkEnd + chunk;
|
||||||
|
chunkEnd = n < nextChunk ? n : nextChunk;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
lock.release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void associateDataTypeWithArchive(DataType datatype, SourceArchive archive) {
|
public void associateDataTypeWithArchive(DataType datatype, SourceArchive archive) {
|
||||||
if (!contains(datatype)) {
|
if (!contains(datatype)) {
|
||||||
|
@ -2846,7 +2889,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
|
||||||
CategoryPath catPath = catDB.getCategoryPath();
|
CategoryPath catPath = catDB.getCategoryPath();
|
||||||
String classPath = record.getString(BuiltinDBAdapter.BUILT_IN_CLASSNAME_COL);
|
String classPath = record.getString(BuiltinDBAdapter.BUILT_IN_CLASSNAME_COL);
|
||||||
String name = record.getString(BuiltinDBAdapter.BUILT_IN_NAME_COL);
|
String name = record.getString(BuiltinDBAdapter.BUILT_IN_NAME_COL);
|
||||||
try { // TODO: !! Can we look for alternate constructor which takes DTM argument
|
try {
|
||||||
Class<?> c;
|
Class<?> c;
|
||||||
try {
|
try {
|
||||||
c = Class.forName(classPath);
|
c = Class.forName(classPath);
|
||||||
|
@ -4110,7 +4153,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
|
||||||
try {
|
try {
|
||||||
// Initialization of dataOrganization may never have been established
|
// Initialization of dataOrganization may never have been established
|
||||||
// if either an architecture has never been specified or a language
|
// if either an architecture has never been specified or a language
|
||||||
// error occured during initializtion. In such cases the stored
|
// error occurred during initialization. In such cases the stored
|
||||||
// data organization should be used if available.
|
// data organization should be used if available.
|
||||||
dataOrganization = readDataOrganization();
|
dataOrganization = readDataOrganization();
|
||||||
}
|
}
|
||||||
|
@ -4212,7 +4255,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
|
||||||
|
|
||||||
private TreeSet<String> buildDefinedCallingConventionSet() {
|
private TreeSet<String> buildDefinedCallingConventionSet() {
|
||||||
|
|
||||||
// Include all calling conventions defined by associated architecure compiler spec
|
// Include all calling conventions defined by associated architecture compiler spec
|
||||||
TreeSet<String> nameSet = new TreeSet<>();
|
TreeSet<String> nameSet = new TreeSet<>();
|
||||||
ProgramArchitecture arch = getProgramArchitecture();
|
ProgramArchitecture arch = getProgramArchitecture();
|
||||||
if (arch != null) {
|
if (arch != null) {
|
||||||
|
@ -4536,8 +4579,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private record DedupedConflicts(int processCnt, int replaceCnt) {
|
private record DedupedConflicts(int processCnt, int replaceCnt) {}
|
||||||
}
|
|
||||||
|
|
||||||
private DedupedConflicts doDedupeConflicts(DataType dataType) {
|
private DedupedConflicts doDedupeConflicts(DataType dataType) {
|
||||||
|
|
||||||
|
@ -4761,7 +4803,6 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
|
||||||
resolvedDt.postPointerResolve(resolvePair.definitionDt, handler);
|
resolvedDt.postPointerResolve(resolvePair.definitionDt, handler);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// TODO: catch exceptions if needed
|
|
||||||
finally {
|
finally {
|
||||||
resolvedDt.resolving = false;
|
resolvedDt.resolving = false;
|
||||||
resolvedDt.pointerPostResolveRequired = false;
|
resolvedDt.pointerPostResolveRequired = false;
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
@ -435,7 +435,7 @@ public abstract class ProgramBasedDataTypeManagerDB extends DataTypeManagerDB
|
||||||
Address addr = data.getAddress();
|
Address addr = data.getAddress();
|
||||||
for (Data parent = data.getParent(); parent != null; parent = parent.getParent()) {
|
for (Data parent = data.getParent(); parent != null; parent = parent.getParent()) {
|
||||||
DataType dataType = parent.getDataType();
|
DataType dataType = parent.getDataType();
|
||||||
if (!(dataType instanceof Array a)) {
|
if (!(dataType instanceof Array)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
addr = parent.getAddress();
|
addr = parent.getAddress();
|
||||||
|
|
|
@ -266,6 +266,10 @@ public class ProgramDataTypeManager extends ProgramBasedDataTypeManagerDB implem
|
||||||
// use could be an issue.
|
// use could be an issue.
|
||||||
try {
|
try {
|
||||||
// TODO: Should use replacement type instead of clearing
|
// TODO: Should use replacement type instead of clearing
|
||||||
|
|
||||||
|
// Note: use of DUMMY here is intentional, since we do not want to interrupt the
|
||||||
|
// deleting of these types, as they may have a relationship that we wish to preserve.
|
||||||
|
// All need to be deleted to remain in a consistent state.
|
||||||
program.getCodeManager().clearData(deletedIds, TaskMonitor.DUMMY);
|
program.getCodeManager().clearData(deletedIds, TaskMonitor.DUMMY);
|
||||||
}
|
}
|
||||||
catch (CancelledException e) {
|
catch (CancelledException e) {
|
||||||
|
|
|
@ -210,7 +210,7 @@ public final class BuiltInDataTypeManager extends StandAloneDataTypeManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean remove(DataType dataType, TaskMonitor monitor) {
|
public boolean remove(DataType dataType) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -75,7 +75,7 @@ public interface DataTypeManager {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the program architecture information which has been associated with this
|
* Get the program architecture information which has been associated with this
|
||||||
* datatype manager. If {@link #getProgramArchitecture()} returns null this method
|
* data type manager. If {@link #getProgramArchitecture()} returns null this method
|
||||||
* may still return information if the program architecture was set on an archive but unable
|
* may still return information if the program architecture was set on an archive but unable
|
||||||
* to properly instantiate.
|
* to properly instantiate.
|
||||||
* @return program architecture summary if it has been set
|
* @return program architecture summary if it has been set
|
||||||
|
@ -83,16 +83,16 @@ public interface DataTypeManager {
|
||||||
public String getProgramArchitectureSummary();
|
public String getProgramArchitectureSummary();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the given category path exists in this datatype manager
|
* Returns true if the given category path exists in this data type manager
|
||||||
* @param path the path
|
* @param path the path
|
||||||
* @return true if the given category path exists in this datatype manager
|
* @return true if the given category path exists in this data type manager
|
||||||
*/
|
*/
|
||||||
public boolean containsCategory(CategoryPath path);
|
public boolean containsCategory(CategoryPath path);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a unique name not currently used by any other dataType or category
|
* Returns a unique name not currently used by any other data type or category
|
||||||
* with the same baseName. This does not produce a conflict name and is intended
|
* with the same baseName. This does not produce a conflict name and is intended
|
||||||
* to be used when generating an artifical datatype name only (e.g., {@code temp_1},
|
* to be used when generating an artificial data type name only (e.g., {@code temp_1},
|
||||||
* {@code temp_2}; for {@code baseName="temp"}.
|
* {@code temp_2}; for {@code baseName="temp"}.
|
||||||
*
|
*
|
||||||
* @param path the path of the name
|
* @param path the path of the name
|
||||||
|
@ -102,12 +102,11 @@ public interface DataTypeManager {
|
||||||
public String getUniqueName(CategoryPath path, String baseName);
|
public String getUniqueName(CategoryPath path, String baseName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a dataType that is "in" (ie suitable implementation) this
|
* Returns a data type that is "in" this Manager, creating a new one if necessary. Also the
|
||||||
* Manager, creating a new one if necessary. Also the returned dataType
|
* returned data type will be in a category in this manager that is equivalent to the
|
||||||
* will be in a category in this dataTypeManager that is equivalent to the
|
* category of the passed in data type.
|
||||||
* category of the passed in dataType.
|
|
||||||
* @param dataType the dataType to be resolved.
|
* @param dataType the dataType to be resolved.
|
||||||
* @param handler used to resolve conflicts with existing dataTypes.
|
* @param handler used to resolve conflicts with existing data types.
|
||||||
* @return an equivalent dataType that "belongs" to this dataTypeManager.
|
* @return an equivalent dataType that "belongs" to this dataTypeManager.
|
||||||
*/
|
*/
|
||||||
public DataType resolve(DataType dataType, DataTypeConflictHandler handler);
|
public DataType resolve(DataType dataType, DataTypeConflictHandler handler);
|
||||||
|
@ -309,22 +308,48 @@ public interface DataTypeManager {
|
||||||
public void removeInvalidatedListener(InvalidatedListener listener);
|
public void removeInvalidatedListener(InvalidatedListener listener);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove the given datatype from this manager.
|
* Remove the given data type from this manager.
|
||||||
* <br>
|
* <br>
|
||||||
* NOTE: Any use of the specified datatype within a {@link FunctionDefinition} will be
|
* NOTE: Any use of the specified datatype within a {@link FunctionDefinition} will be
|
||||||
* converted to the {@link DataType#DEFAULT default 'undefined' datatype}. Any use within
|
* converted to the {@link DataType#DEFAULT default 'undefined' datatype}. Any use within
|
||||||
* a {@link Structure} or {@link Union} will be converted to the {@link BadDataType} as
|
* a {@link Structure} or {@link Union} will be converted to the {@link BadDataType} as
|
||||||
* a placeholder to retain the component's field name and length (the comment will be prefixed
|
* a placeholder to retain the component's field name and length (the comment will be prefixed
|
||||||
* with a message indicating the remval of the old datatype.
|
* with a message indicating the removal of the old datatype.
|
||||||
*
|
*
|
||||||
* @param dataType the dataType to be removed
|
* @param dataType the data type to be removed
|
||||||
* @param monitor the task monitor
|
|
||||||
* @return true if the data type existed and was removed
|
* @return true if the data type existed and was removed
|
||||||
*/
|
*/
|
||||||
public boolean remove(DataType dataType, TaskMonitor monitor);
|
public boolean remove(DataType dataType);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return true if the given dataType exists in this data type manager
|
* Deprecated. Use {@link #remove(DataType)}.
|
||||||
|
* @param dataType the data type
|
||||||
|
* @param monitor the monitor
|
||||||
|
* @return true if the data type existed and was removed
|
||||||
|
* @deprecated use {@link #remove(DataType)}
|
||||||
|
*/
|
||||||
|
@Deprecated(since = "10.4", forRemoval = true)
|
||||||
|
public default boolean remove(DataType dataType, TaskMonitor monitor) {
|
||||||
|
return remove(dataType);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the given data types from this manager.
|
||||||
|
* <br>
|
||||||
|
* NOTE: Any use of the specified data types within a {@link FunctionDefinition} will be
|
||||||
|
* converted to the {@link DataType#DEFAULT default 'undefined' datatype}. Any use within
|
||||||
|
* a {@link Structure} or {@link Union} will be converted to the {@link BadDataType} as
|
||||||
|
* a placeholder to retain the component's field name and length (the comment will be prefixed
|
||||||
|
* with a message indicating the removal of the old datatype.
|
||||||
|
*
|
||||||
|
* @param dataTypes the data types to be removed
|
||||||
|
* @param monitor the monitor
|
||||||
|
* @throws CancelledException if the user cancels
|
||||||
|
*/
|
||||||
|
public void remove(List<DataType> dataTypes, TaskMonitor monitor) throws CancelledException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true if the given data type exists in this data type manager
|
||||||
*
|
*
|
||||||
* @param dataType the type
|
* @param dataType the type
|
||||||
* @return true if the type is in this manager
|
* @return true if the type is in this manager
|
||||||
|
@ -727,7 +752,7 @@ public interface DataTypeManager {
|
||||||
public Collection<String> getDefinedCallingConventionNames();
|
public Collection<String> getDefinedCallingConventionNames();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the default calling convention's prototype model in this datatype manager if known.
|
* Get the default calling convention's prototype model in this data type manager if known.
|
||||||
*
|
*
|
||||||
* @return the default calling convention prototype model or null.
|
* @return the default calling convention prototype model or null.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -26,7 +26,6 @@ import ghidra.program.model.symbol.*;
|
||||||
import ghidra.util.InvalidNameException;
|
import ghidra.util.InvalidNameException;
|
||||||
import ghidra.util.exception.DuplicateNameException;
|
import ghidra.util.exception.DuplicateNameException;
|
||||||
import ghidra.util.exception.InvalidInputException;
|
import ghidra.util.exception.InvalidInputException;
|
||||||
import ghidra.util.task.TaskMonitor;
|
|
||||||
|
|
||||||
public class DataTypeSymbol {
|
public class DataTypeSymbol {
|
||||||
private Symbol sym; // Traditional symbol object
|
private Symbol sym; // Traditional symbol object
|
||||||
|
@ -151,7 +150,7 @@ public class DataTypeSymbol {
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove unused override signature
|
// remove unused override signature
|
||||||
program.getDataTypeManager().remove(getDataType(), TaskMonitor.DUMMY);
|
program.getDataTypeManager().remove(getDataType());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static DataTypeSymbol readSymbol(String cat, Symbol s) {
|
public static DataTypeSymbol readSymbol(String cat, Symbol s) {
|
||||||
|
|
|
@ -27,8 +27,6 @@ import generic.test.AbstractGenericTest;
|
||||||
import ghidra.program.model.data.*;
|
import ghidra.program.model.data.*;
|
||||||
import ghidra.util.InvalidNameException;
|
import ghidra.util.InvalidNameException;
|
||||||
import ghidra.util.exception.DuplicateNameException;
|
import ghidra.util.exception.DuplicateNameException;
|
||||||
import ghidra.util.task.TaskMonitor;
|
|
||||||
import ghidra.util.task.TaskMonitorAdapter;
|
|
||||||
|
|
||||||
public class StructureDBTest extends AbstractGenericTest {
|
public class StructureDBTest extends AbstractGenericTest {
|
||||||
|
|
||||||
|
@ -65,7 +63,7 @@ public class StructureDBTest extends AbstractGenericTest {
|
||||||
private void transitionToBigEndian() {
|
private void transitionToBigEndian() {
|
||||||
|
|
||||||
Structure structClone = struct.clone(null);
|
Structure structClone = struct.clone(null);
|
||||||
dataMgr.remove(struct, TaskMonitor.DUMMY);
|
dataMgr.remove(struct);
|
||||||
|
|
||||||
DataOrganizationImpl dataOrg = (DataOrganizationImpl) dataMgr.getDataOrganization();
|
DataOrganizationImpl dataOrg = (DataOrganizationImpl) dataMgr.getDataOrganization();
|
||||||
dataOrg.setBigEndian(true);
|
dataOrg.setBigEndian(true);
|
||||||
|
@ -1167,7 +1165,7 @@ public class StructureDBTest extends AbstractGenericTest {
|
||||||
"Length: 8 Alignment: 1", struct);
|
"Length: 8 Alignment: 1", struct);
|
||||||
//@formatter:on
|
//@formatter:on
|
||||||
|
|
||||||
dataMgr.remove(dataMgr.resolve(IntegerDataType.dataType, null), TaskMonitor.DUMMY);
|
dataMgr.remove(dataMgr.resolve(IntegerDataType.dataType, null));
|
||||||
|
|
||||||
//@formatter:off
|
//@formatter:off
|
||||||
CompositeTestUtils.assertExpectedComposite(this, "/Test\n" +
|
CompositeTestUtils.assertExpectedComposite(this, "/Test\n" +
|
||||||
|
@ -1208,7 +1206,7 @@ public class StructureDBTest extends AbstractGenericTest {
|
||||||
"Length: 11 Alignment: 1", struct);
|
"Length: 11 Alignment: 1", struct);
|
||||||
//@formatter:on
|
//@formatter:on
|
||||||
|
|
||||||
dataMgr.remove(td, TaskMonitor.DUMMY);
|
dataMgr.remove(td);
|
||||||
|
|
||||||
//@formatter:off
|
//@formatter:off
|
||||||
CompositeTestUtils.assertExpectedComposite(this, "/Test\n" +
|
CompositeTestUtils.assertExpectedComposite(this, "/Test\n" +
|
||||||
|
@ -1841,7 +1839,7 @@ public class StructureDBTest extends AbstractGenericTest {
|
||||||
"Length: 13 Alignment: 1", struct);
|
"Length: 13 Alignment: 1", struct);
|
||||||
//@formatter:on
|
//@formatter:on
|
||||||
|
|
||||||
dt.getDataTypeManager().remove(dt, new TaskMonitorAdapter());
|
dt.getDataTypeManager().remove(dt);
|
||||||
|
|
||||||
//@formatter:off
|
//@formatter:off
|
||||||
CompositeTestUtils.assertExpectedComposite(this, "/Test\n" +
|
CompositeTestUtils.assertExpectedComposite(this, "/Test\n" +
|
||||||
|
|
|
@ -23,7 +23,6 @@ import com.google.common.collect.Sets;
|
||||||
|
|
||||||
import generic.test.AbstractGenericTest;
|
import generic.test.AbstractGenericTest;
|
||||||
import ghidra.program.model.data.*;
|
import ghidra.program.model.data.*;
|
||||||
import ghidra.util.task.TaskMonitor;
|
|
||||||
|
|
||||||
public class UnionDBTest extends AbstractGenericTest {
|
public class UnionDBTest extends AbstractGenericTest {
|
||||||
|
|
||||||
|
@ -59,7 +58,7 @@ public class UnionDBTest extends AbstractGenericTest {
|
||||||
private void transitionToBigEndian() {
|
private void transitionToBigEndian() {
|
||||||
|
|
||||||
Union unionClone = union.clone(null);
|
Union unionClone = union.clone(null);
|
||||||
dataMgr.remove(union, TaskMonitor.DUMMY);
|
dataMgr.remove(union);
|
||||||
|
|
||||||
DataOrganizationImpl dataOrg = (DataOrganizationImpl) dataMgr.getDataOrganization();
|
DataOrganizationImpl dataOrg = (DataOrganizationImpl) dataMgr.getDataOrganization();
|
||||||
dataOrg.setBigEndian(true);
|
dataOrg.setBigEndian(true);
|
||||||
|
@ -272,7 +271,7 @@ public class UnionDBTest extends AbstractGenericTest {
|
||||||
"Length: 4 Alignment: 1", union);
|
"Length: 4 Alignment: 1", union);
|
||||||
//@formatter:on
|
//@formatter:on
|
||||||
|
|
||||||
dataMgr.remove(td, TaskMonitor.DUMMY);
|
dataMgr.remove(td);
|
||||||
|
|
||||||
//@formatter:off
|
//@formatter:off
|
||||||
CompositeTestUtils.assertExpectedComposite(this, "/TestUnion\n" +
|
CompositeTestUtils.assertExpectedComposite(this, "/TestUnion\n" +
|
||||||
|
|
|
@ -191,7 +191,12 @@ public class TestDoubleDataTypeManager implements DataTypeManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean remove(DataType dataType, TaskMonitor monitor) {
|
public boolean remove(DataType dataType) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void remove(List<DataType> dataTypes, TaskMonitor monitor) throws CancelledException {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -190,11 +190,16 @@ public class TestDummyDataTypeManager implements DataTypeManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean remove(DataType dataType, TaskMonitor monitor) {
|
public boolean remove(DataType dataType) {
|
||||||
// stub
|
// stub
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void remove(List<DataType> dataTypes, TaskMonitor monitor) throws CancelledException {
|
||||||
|
// stub
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean contains(DataType dataType) {
|
public boolean contains(DataType dataType) {
|
||||||
// stub
|
// stub
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue