GP-1545: De-guava the Debugger

This commit is contained in:
Dan 2023-02-27 12:26:21 -05:00
parent a2ae1f08ce
commit d43b9ead66
142 changed files with 1125 additions and 1889 deletions

View file

@ -15,25 +15,50 @@
*/
package ghidra.framework.data;
import java.util.Map;
import java.util.NoSuchElementException;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.RemovalNotification;
import java.lang.ref.Cleaner;
import java.util.*;
import ghidra.framework.model.*;
import ghidra.util.Lock;
public class DomainObjectEventQueues {
protected static class PrivateQueue {
private static final Cleaner CLEANER = Cleaner.create();
static class State implements Runnable {
final DomainObjectChangeSupport docs;
public State(DomainObjectChangeSupport docs) {
this.docs = docs;
}
@Override
public void run() {
docs.dispose();
}
}
private final State state;
private final Cleaner.Cleanable cleanable;
public PrivateQueue(DomainObjectChangeSupport docs) {
this.state = new State(docs);
this.cleanable = CLEANER.register(this, state);
}
public void flush() {
state.docs.flush();
}
public void fireEvent(DomainObjectChangeRecord ev) {
state.docs.fireEvent(ev);
}
}
protected final DomainObject source;
protected final Lock lock;
protected final DomainObjectChangeSupport eventQueue;
protected final Map<EventQueueID, DomainObjectChangeSupport> privateEventQueues =
CacheBuilder.newBuilder()
.removalListener(this::privateQueueRemoved)
.weakKeys()
.build()
.asMap();
protected final Map<EventQueueID, PrivateQueue> privateEventQueues = new WeakHashMap<>();
protected volatile boolean eventsEnabled = true;
@ -43,14 +68,9 @@ public class DomainObjectEventQueues {
eventQueue = new DomainObjectChangeSupport(source, timeInterval, lock);
}
private void privateQueueRemoved(
RemovalNotification<EventQueueID, DomainObjectChangeSupport> rn) {
rn.getValue().dispose();
}
public void flushEvents() {
eventQueue.flush();
for (DomainObjectChangeSupport privateQueue : privateEventQueues.values()) {
for (PrivateQueue privateQueue : privateEventQueues.values()) {
privateQueue.flush();
}
}
@ -65,20 +85,23 @@ public class DomainObjectEventQueues {
public EventQueueID createPrivateEventQueue(DomainObjectListener listener, int maxDelay) {
EventQueueID id = new EventQueueID();
DomainObjectChangeSupport privateQueue =
new DomainObjectChangeSupport(source, maxDelay, lock);
privateQueue.addListener(listener);
privateEventQueues.put(id, privateQueue);
DomainObjectChangeSupport docs = new DomainObjectChangeSupport(source, maxDelay, lock);
docs.addListener(listener);
privateEventQueues.put(id, new PrivateQueue(docs));
return id;
}
public boolean removePrivateEventQueue(EventQueueID id) {
return privateEventQueues.remove(id) != null;
// NOTE: Removal callback will dispose()
PrivateQueue privateQueue = privateEventQueues.remove(id);
if (privateQueue == null) {
return false;
}
privateQueue.cleanable.clean();
return true;
}
public void flushPrivateEventQueue(EventQueueID id) {
DomainObjectChangeSupport privateQueue = privateEventQueues.get(id);
PrivateQueue privateQueue = privateEventQueues.get(id);
if (privateQueue == null) {
throw new NoSuchElementException("Private queue no longer exists");
}
@ -88,7 +111,7 @@ public class DomainObjectEventQueues {
public void fireEvent(DomainObjectChangeRecord ev) {
if (eventsEnabled) {
eventQueue.fireEvent(ev);
for (DomainObjectChangeSupport privateQueue : privateEventQueues.values()) {
for (PrivateQueue privateQueue : privateEventQueues.values()) {
privateQueue.fireEvent(ev);
}
}
@ -103,7 +126,7 @@ public class DomainObjectEventQueues {
DomainObjectChangeRecord restored =
new DomainObjectChangeRecord(DomainObject.DO_OBJECT_RESTORED);
eventQueue.fireEvent(restored);
for (DomainObjectChangeSupport privateQueue : privateEventQueues.values()) {
for (PrivateQueue privateQueue : privateEventQueues.values()) {
privateQueue.fireEvent(restored);
}
}

View file

@ -16,7 +16,6 @@
package ghidra.pcode.exec.trace;
import ghidra.pcode.exec.AccessPcodeExecutionException;
import ghidra.pcode.exec.PcodeExecutorStatePiece;
import ghidra.pcode.exec.trace.data.PcodeTraceDataAccess;
import ghidra.program.model.address.*;
import ghidra.trace.model.memory.TraceMemorySpace;

View file

@ -21,8 +21,6 @@ import java.util.function.Consumer;
import org.apache.commons.collections4.collection.CompositeCollection;
import com.google.common.cache.RemovalNotification;
import db.DBHandle;
import generic.depends.DependentService;
import generic.depends.err.ServiceConstructionException;
@ -229,10 +227,6 @@ public class DBTrace extends DBCachedDomainObjectAdapter implements Trace, Trace
super.dbError(e);
}
protected void fixedProgramViewRemoved(RemovalNotification<Long, DBTraceProgramView> rn) {
Msg.debug(this, "Dropped cached fixed view at snap=" + rn.getKey());
}
@Internal
public void assertValidAddress(Address pc) {
if (pc == null) {

View file

@ -20,12 +20,10 @@ import java.util.Map.Entry;
import org.apache.commons.lang3.tuple.ImmutablePair;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.RemovalNotification;
import ghidra.program.model.address.*;
import ghidra.trace.database.DBTraceCacheForContainingQueries.GetKey;
import ghidra.trace.model.*;
import ghidra.util.datastruct.FixedSizeHashMap;
public abstract class DBTraceCacheForContainingQueries<K extends GetKey, V, T> {
public static class GetKey {
@ -73,16 +71,7 @@ public abstract class DBTraceCacheForContainingQueries<K extends GetKey, V, T> {
public DBTraceCacheForContainingQueries(int snapBreadth, int addressBreadth, int maxPoints) {
this.snapBreadth = snapBreadth;
this.addressBreadth = addressBreadth;
this.pointCache = CacheBuilder.newBuilder()
.removalListener(this::getContainingRemoved)
.maximumSize(maxPoints)
.concurrencyLevel(2)
.build()
.asMap();
}
private void getContainingRemoved(RemovalNotification<K, V> rn) {
// Nothing
this.pointCache = new FixedSizeHashMap<>(maxPoints);
}
protected abstract void loadRangeCache(TraceAddressSnapRange range);

View file

@ -19,8 +19,6 @@ import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import com.google.common.collect.*;
import ghidra.program.model.address.*;
import ghidra.trace.model.*;
import ghidra.trace.model.Lifespan.DefaultLifeSet;
@ -324,10 +322,10 @@ public class DBTraceTimeViewport implements TraceTimeViewport {
public List<Long> getReversedSnaps() {
try (LockHold hold = trace.lockRead()) {
synchronized (ordered) {
return Lists.reverse(ordered)
.stream()
.map(Lifespan::lmax)
.collect(Collectors.toList());
List<Long> reversed =
ordered.stream().map(Lifespan::lmax).collect(Collectors.toList());
Collections.reverse(reversed);
return reversed;
}
}
}

View file

@ -15,12 +15,9 @@
*/
package ghidra.trace.database.listing;
import java.util.Collection;
import java.util.Collections;
import java.util.concurrent.locks.Lock;
import com.google.common.collect.Collections2;
import generic.NestedIterator;
import ghidra.program.model.address.*;
import ghidra.trace.database.DBTraceUtils;
@ -40,7 +37,6 @@ import ghidra.util.LockHold;
public abstract class AbstractBaseDBTraceCodeUnitsMemoryView<T extends DBTraceCodeUnitAdapter, M extends AbstractBaseDBTraceCodeUnitsView<T>>
implements DBTraceDelegatingManager<M> {
protected final DBTraceCodeManager manager;
protected final Collection<M> activeSpacesView;
/**
* Construct a composite view
@ -49,8 +45,6 @@ public abstract class AbstractBaseDBTraceCodeUnitsMemoryView<T extends DBTraceCo
*/
public AbstractBaseDBTraceCodeUnitsMemoryView(DBTraceCodeManager manager) {
this.manager = manager;
this.activeSpacesView =
Collections2.transform(manager.getActiveMemorySpaces(), this::getView);
}
public AddressSpace getSpace() {
@ -242,8 +236,8 @@ public abstract class AbstractBaseDBTraceCodeUnitsMemoryView<T extends DBTraceCo
*/
public int size() {
int sum = 0;
for (M m : activeSpacesView) {
sum += m.size();
for (DBTraceCodeSpace space : manager.getActiveMemorySpaces()) {
sum += getView(space).size();
}
return sum;
}

View file

@ -17,9 +17,7 @@ package ghidra.trace.database.listing;
import java.util.Collection;
import java.util.Iterator;
import com.google.common.collect.Collections2;
import com.google.common.collect.Iterators;
import java.util.stream.StreamSupport;
import ghidra.program.model.address.*;
import ghidra.trace.model.TraceAddressSnapRange;
@ -83,7 +81,7 @@ public abstract class AbstractComposedDBTraceCodeUnitsView<T extends DBTraceCode
@Override
public Iterable<? extends T> get(long snap, Address min, Address max, boolean forward) {
Collection<? extends Iterator<? extends T>> itCol =
Collections2.transform(parts, p -> p.get(snap, min, max, forward).iterator());
parts.stream().map(p -> p.get(snap, min, max, forward).iterator()).toList();
return () -> new MergeSortingIterator<T>(itCol,
forward ? DBTraceDefinedUnitsView::compareForward
: DBTraceDefinedUnitsView::compareBackward);
@ -91,9 +89,10 @@ public abstract class AbstractComposedDBTraceCodeUnitsView<T extends DBTraceCode
@Override
public Iterable<? extends T> getIntersecting(TraceAddressSnapRange tasr) {
Collection<? extends Iterator<? extends T>> itCol =
Collections2.transform(parts, p -> p.getIntersecting(tasr).iterator());
return () -> Iterators.concat(itCol.iterator());
return () -> parts.stream()
.flatMap(p -> StreamSupport.stream(p.getIntersecting(tasr).spliterator(), false)
.map(t -> (T) t))
.iterator();
}
@Override
@ -165,7 +164,7 @@ public abstract class AbstractComposedDBTraceCodeUnitsView<T extends DBTraceCode
@Override
public AddressSetView getAddressSetView(long snap, AddressRange within) {
return new UnionAddressSetView(
Collections2.transform(parts, p -> p.getAddressSetView(snap, within)));
parts.stream().map(p -> p.getAddressSetView(snap, within)).toList());
}
@Override

View file

@ -16,8 +16,7 @@
package ghidra.trace.database.listing;
import java.util.Iterator;
import com.google.common.collect.Iterators;
import java.util.stream.StreamSupport;
import ghidra.program.model.address.*;
import ghidra.trace.model.TraceAddressSnapRange;
@ -83,9 +82,12 @@ public abstract class AbstractWithUndefinedDBTraceCodeUnitsMemoryView<T extends
@Override
public Iterable<? extends T> emptyOrFullIterableUndefined(TraceAddressSnapRange tasr) {
Iterator<Iterator<? extends T>> itIt =
Iterators.transform(tasr.getLifespan().iterator(),
snap -> emptyOrFullIterableUndefined(snap, tasr.getRange(), true).iterator());
return () -> Iterators.concat(itIt);
return () -> StreamSupport.stream(tasr.getLifespan().spliterator(), false)
.flatMap(snap -> StreamSupport
.stream(emptyOrFullIterableUndefined(snap, tasr.getRange(), true)
.spliterator(),
false)
.map(t -> (T) t))
.iterator();
}
}

View file

@ -23,9 +23,6 @@ import java.util.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.RemovalNotification;
import db.DBHandle;
import db.DBRecord;
import ghidra.lifecycle.Internal;
@ -56,6 +53,7 @@ import ghidra.trace.util.TraceAddressSpace;
import ghidra.util.*;
import ghidra.util.database.*;
import ghidra.util.database.annot.*;
import ghidra.util.datastruct.WeakValueHashMap;
import ghidra.util.exception.CancelledException;
import ghidra.util.exception.VersionException;
import ghidra.util.task.TaskMonitor;
@ -323,11 +321,7 @@ public class DBTraceCodeManager extends AbstractDBTraceSpaceBasedManager<DBTrace
new DBTraceDefinedUnitsMemoryView(this);
protected final Map<AddressSnap, UndefinedDBTraceData> undefinedCache =
CacheBuilder.newBuilder()
.removalListener(this::undefinedRemovedFromCache)
.weakValues()
.build()
.asMap();
new WeakValueHashMap<>();
public DBTraceCodeManager(DBHandle dbh, DBOpenMode openMode, ReadWriteLock lock,
TaskMonitor monitor, Language baseLanguage, DBTrace trace,
@ -349,11 +343,6 @@ public class DBTraceCodeManager extends AbstractDBTraceSpaceBasedManager<DBTrace
loadSpaces();
}
private void undefinedRemovedFromCache(
RemovalNotification<AddressSnap, UndefinedDBTraceData> rn) {
// Do nothing
}
// Internal
public UndefinedDBTraceData doCreateUndefinedUnit(long snap, Address address,
TraceThread thread, int frameLevel) {

View file

@ -21,7 +21,7 @@ import java.nio.ByteBuffer;
import java.util.*;
import java.util.Map.Entry;
import com.google.common.collect.Iterators;
import org.apache.commons.collections4.IteratorUtils;
import ghidra.program.model.address.Address;
import ghidra.program.model.address.AddressRangeImpl;
@ -196,7 +196,7 @@ public interface DBTraceCodeUnitAdapter extends TraceCodeUnit, MemBufferAdapter
@Override
default Iterator<String> propertyNames() {
Lifespan span = Lifespan.at(getStartSnap());
return Iterators.transform(Iterators.filter(
return IteratorUtils.transformedIterator(IteratorUtils.filteredIterator(
getTrace().getInternalAddressPropertyManager().getAllProperties().entrySet().iterator(),
e -> e.getValue().getAddressSetView(span).contains(getAddress())), Entry::getKey);
}

View file

@ -17,16 +17,16 @@ package ghidra.trace.database.listing;
import java.util.Iterator;
import java.util.Map;
import java.util.stream.StreamSupport;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.RemovalNotification;
import com.google.common.collect.Iterators;
import org.apache.commons.collections4.IteratorUtils;
import ghidra.program.model.address.*;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.TraceAddressSnapRange;
import ghidra.trace.model.listing.*;
import ghidra.util.*;
import ghidra.util.datastruct.FixedSizeHashMap;
/**
* The implementation of {@link TraceCodeSpace#undefinedData()}
@ -39,11 +39,7 @@ public class DBTraceUndefinedDataView extends
protected final DBTraceCodeManager manager;
protected final Map<Long, CachedAddressSetView> cache = CacheBuilder.newBuilder()
.removalListener(this::cacheEntryRemoved)
.maximumSize(CACHE_MAX_SNAPS)
.build()
.asMap();
protected final Map<Long, CachedAddressSetView> cache = new FixedSizeHashMap<>(CACHE_MAX_SNAPS);
/**
* Construct the view
@ -55,10 +51,6 @@ public class DBTraceUndefinedDataView extends
this.manager = space.manager;
}
private void cacheEntryRemoved(RemovalNotification<Long, CachedAddressSetView> rn) {
// Nothing
}
/**
* Generate an undefined data unit at the given point
*
@ -150,15 +142,16 @@ public class DBTraceUndefinedDataView extends
boolean forward) {
Iterator<Address> ait =
getAddressSetView(snap, new AddressRangeImpl(min, max)).getAddresses(forward);
return () -> Iterators.transform(ait, a -> doCreateUnit(snap, a));
return () -> IteratorUtils.transformedIterator(ait, a -> doCreateUnit(snap, a));
}
@Override
public Iterable<? extends UndefinedDBTraceData> getIntersecting(TraceAddressSnapRange tasr) {
Iterator<Iterator<? extends UndefinedDBTraceData>> itIt =
Iterators.transform(tasr.getLifespan().iterator(),
snap -> get(snap, tasr.getX1(), tasr.getX2(), true).iterator());
return () -> Iterators.concat(itIt);
return () -> StreamSupport.stream(tasr.getLifespan().spliterator(), false)
.flatMap(snap -> StreamSupport
.stream(get(snap, tasr.getX1(), tasr.getX2(), true).spliterator(), false)
.map(u -> (UndefinedDBTraceData) u))
.iterator();
}
@Override

View file

@ -22,8 +22,6 @@ import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.function.Predicate;
import com.google.common.collect.Collections2;
import db.DBHandle;
import db.DBRecord;
import ghidra.program.model.address.AddressSetView;
@ -235,7 +233,7 @@ public class DBTraceAddressSnapRangePropertyMap<T, DR extends AbstractDBTraceAdd
@Override
public AddressSetView getAddressSetView(Lifespan span, Predicate<T> predicate) {
return new UnionAddressSetView(
Collections2.transform(memSpacesView, m -> m.getAddressSetView(span, predicate)));
memSpaces.values().stream().map(m -> m.getAddressSetView(span, predicate)).toList());
}
@Override

View file

@ -21,7 +21,7 @@ import java.util.NoSuchElementException;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.function.Predicate;
import com.google.common.collect.Iterators;
import org.apache.commons.collections4.IteratorUtils;
import ghidra.program.model.address.*;
import ghidra.trace.database.map.DBTraceAddressSnapRangePropertyMapTree.TraceAddressSnapRangeQuery;
@ -171,8 +171,9 @@ public class DBTraceAddressSnapRangePropertyMapAddressSetView<T> extends Abstrac
.orderedEntries()
.iterator();
Iterator<Entry<TraceAddressSnapRange, T>> fltIt =
Iterators.filter(mapIt, e -> predicate.test(e.getValue()));
Iterator<AddressRange> rawIt = Iterators.transform(fltIt, e -> e.getKey().getRange());
IteratorUtils.filteredIterator(mapIt, e -> predicate.test(e.getValue()));
Iterator<AddressRange> rawIt =
IteratorUtils.transformedIterator(fltIt, e -> e.getKey().getRange());
return new UnionAddressRangeIterator(rawIt, forward);
}

View file

@ -24,8 +24,6 @@ import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.function.Predicate;
import com.google.common.collect.Collections2;
import db.DBHandle;
import ghidra.dbg.target.TargetMemoryRegion;
import ghidra.program.model.address.*;
@ -226,8 +224,9 @@ public class DBTraceMemoryManager extends AbstractDBTraceSpaceBasedManager<DBTra
.getObjectsAddressSet(snap, TargetMemoryRegion.RANGE_ATTRIBUTE_NAME,
TraceObjectMemoryRegion.class, r -> true);
}
return new UnionAddressSetView(Collections2.transform(getActiveMemorySpaces(),
m -> m.getRegionsAddressSet(snap)));
return new UnionAddressSetView(getActiveMemorySpaces().stream()
.map(m -> m.getRegionsAddressSet(snap))
.toList());
}
@Override
@ -238,8 +237,9 @@ public class DBTraceMemoryManager extends AbstractDBTraceSpaceBasedManager<DBTra
.getObjectsAddressSet(snap, TargetMemoryRegion.RANGE_ATTRIBUTE_NAME,
TraceObjectMemoryRegion.class, predicate);
}
return new UnionAddressSetView(Collections2.transform(getActiveMemorySpaces(),
m -> m.getRegionsAddressSetWith(snap, predicate)));
return new UnionAddressSetView(getActiveMemorySpaces().stream()
.map(m -> m.getRegionsAddressSetWith(snap, predicate))
.toList());
}
@Override
@ -298,15 +298,17 @@ public class DBTraceMemoryManager extends AbstractDBTraceSpaceBasedManager<DBTra
@Override
public AddressSetView getAddressesWithState(long snap, Predicate<TraceMemoryState> predicate) {
return new UnionAddressSetView(Collections2.transform(getActiveMemorySpaces(),
m -> m.getAddressesWithState(snap, predicate)));
return new UnionAddressSetView(getActiveMemorySpaces().stream()
.map(m -> m.getAddressesWithState(snap, predicate))
.toList());
}
@Override
public AddressSetView getAddressesWithState(Lifespan lifespan,
Predicate<TraceMemoryState> predicate) {
return new UnionAddressSetView(Collections2.transform(getActiveMemorySpaces(),
m -> m.getAddressesWithState(lifespan, predicate)));
return new UnionAddressSetView(getActiveMemorySpaces().stream()
.map(m -> m.getAddressesWithState(lifespan, predicate))
.toList());
}
@Override

View file

@ -23,9 +23,6 @@ import java.util.Map.Entry;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.function.Predicate;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.RemovalNotification;
import db.DBHandle;
import ghidra.program.model.address.*;
import ghidra.program.model.mem.MemBuffer;
@ -47,6 +44,7 @@ import ghidra.util.*;
import ghidra.util.AddressIteratorAdapter;
import ghidra.util.database.*;
import ghidra.util.database.spatial.rect.Rectangle2DDirection;
import ghidra.util.datastruct.FixedSizeHashMap;
import ghidra.util.exception.DuplicateNameException;
import ghidra.util.exception.VersionException;
import ghidra.util.task.TaskMonitor;
@ -74,24 +72,16 @@ public class DBTraceMemorySpace
protected final DBTraceAddressSnapRangePropertyMapSpace<DBTraceMemoryRegion, DBTraceMemoryRegion> regionMapSpace;
protected final DBCachedObjectIndex<String, DBTraceMemoryRegion> regionsByPath;
protected final Collection<TraceMemoryRegion> regionView;
protected final Map<DBTraceMemoryRegion, DBTraceMemoryRegion> regionCache = CacheBuilder
.newBuilder()
.removalListener(this::regionCacheEntryRemoved)
.maximumSize(10)
.build()
.asMap();
protected final Map<DBTraceMemoryRegion, DBTraceMemoryRegion> regionCache =
new FixedSizeHashMap<>(10);
protected final DBTraceAddressSnapRangePropertyMapSpace<TraceMemoryState, DBTraceMemoryStateEntry> stateMapSpace;
protected final DBCachedObjectStore<DBTraceMemoryBufferEntry> bufferStore;
protected final DBCachedObjectStore<DBTraceMemoryBlockEntry> blockStore;
protected final DBCachedObjectIndex<OffsetSnap, DBTraceMemoryBlockEntry> blocksByOffset;
protected final Map<OffsetSnap, DBTraceMemoryBlockEntry> blockCacheMostRecent = CacheBuilder
.newBuilder()
.removalListener(this::blockCacheEntryRemoved)
.maximumSize(10)
.build()
.asMap();
protected final Map<OffsetSnap, DBTraceMemoryBlockEntry> blockCacheMostRecent =
new FixedSizeHashMap<>(10);
protected final DBTraceTimeViewport viewport;
@ -146,16 +136,6 @@ public class DBTraceMemorySpace
return lock;
}
private void regionCacheEntryRemoved(
RemovalNotification<DBTraceMemoryRegion, DBTraceMemoryRegion> rn) {
// Nothing
}
private void blockCacheEntryRemoved(
RemovalNotification<OffsetSnap, DBTraceMemoryBlockEntry> rn) {
// Nothing
}
@Override
public Trace getTrace() {
return trace;

View file

@ -18,9 +18,7 @@ package ghidra.trace.database.program;
import java.nio.ByteBuffer;
import java.util.*;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.RemovalNotification;
import com.google.common.collect.Iterators;
import org.apache.commons.collections4.IteratorUtils;
import generic.NestedIterator;
import ghidra.program.database.ProgramDB;
@ -51,6 +49,7 @@ import ghidra.trace.model.symbol.TraceFunctionSymbol;
import ghidra.trace.util.*;
import ghidra.util.*;
import ghidra.util.AddressIteratorAdapter;
import ghidra.util.datastruct.WeakValueHashMap;
import ghidra.util.exception.*;
import ghidra.util.task.TaskMonitor;
@ -84,12 +83,7 @@ public abstract class AbstractDBTraceProgramViewListing implements TraceProgramV
new HashMap<>();
protected final Map<AddressSnap, UndefinedDBTraceData> undefinedCache =
CacheBuilder.newBuilder()
.removalListener(
this::undefinedRemovedFromCache)
.weakValues()
.build()
.asMap();
new WeakValueHashMap<>();
public AbstractDBTraceProgramViewListing(DBTraceProgramView program,
TraceCodeOperations codeOperations) {
@ -101,11 +95,6 @@ public abstract class AbstractDBTraceProgramViewListing implements TraceProgramV
this.rootModule = new DBTraceProgramViewRootModule(this);
}
private void undefinedRemovedFromCache(
RemovalNotification<AddressSnap, UndefinedDBTraceData> rn) {
// Do nothing
}
@Override
public TraceProgramView getProgram() {
return program;
@ -165,7 +154,7 @@ public abstract class AbstractDBTraceProgramViewListing implements TraceProgramV
protected <T extends TraceCodeUnit> Iterator<T> getTopCodeIterator(
java.util.function.Function<Long, Iterator<T>> iterFunc, boolean forward) {
return Iterators.filter(
return IteratorUtils.filteredIterator(
program.viewport.mergedIterator(iterFunc, getUnitComparator(forward)),
cu -> program.isCodeVisible(cu, cu.getLifespan()));
}
@ -239,16 +228,17 @@ public abstract class AbstractDBTraceProgramViewListing implements TraceProgramV
defStart = defUnit.getMinAddress();
}
}
Iterator<AddressRange> defIter = Iterators.transform(
Iterator<AddressRange> defIter = IteratorUtils.transformedIterator(
getDefinedUnitIterator(defStart, forward), u -> u.getRange());
AddressRangeIterator undefIter =
AddressRangeIterators.subtract(set.iterator(forward), defIter, start, forward);
AddressIteratorAdapter undefAddrIter = new AddressIteratorAdapter(undefIter, forward);
return Iterators.transform(undefAddrIter.iterator(), a -> doCreateUndefinedUnit(a));
return IteratorUtils.transformedIterator(undefAddrIter.iterator(),
a -> doCreateUndefinedUnit(a));
}
protected AddressRangeIterator getUndefinedRangeIterator(AddressSetView set, boolean forward) {
Iterator<AddressRange> defIter = Iterators.transform(
Iterator<AddressRange> defIter = IteratorUtils.transformedIterator(
getDefinedUnitIterator(set, forward), u -> u.getRange());
return AddressRangeIterators.subtract(set.iterator(forward), defIter,
forward ? set.getMinAddress() : set.getMaxAddress(), forward);
@ -274,7 +264,8 @@ public abstract class AbstractDBTraceProgramViewListing implements TraceProgramV
protected Iterator<TraceData> getUndefinedDataIterator(AddressSetView set, boolean forward) {
AddressRangeIterator undefIter = getUndefinedRangeIterator(set, forward);
AddressIteratorAdapter undefAddrIter = new AddressIteratorAdapter(undefIter, forward);
return Iterators.transform(undefAddrIter.iterator(), a -> doCreateUndefinedUnit(a));
return IteratorUtils.transformedIterator(undefAddrIter.iterator(),
a -> doCreateUndefinedUnit(a));
}
protected Iterator<TraceCodeUnit> getCodeUnitIterator(AddressSetView set, boolean forward) {

View file

@ -21,8 +21,6 @@ import java.nio.ByteBuffer;
import java.util.*;
import java.util.function.Consumer;
import com.google.common.cache.RemovalNotification;
import ghidra.framework.store.LockException;
import ghidra.program.database.mem.*;
import ghidra.program.model.address.*;
@ -57,16 +55,6 @@ public abstract class AbstractDBTraceProgramViewMemory
setSnap(program.snap);
}
protected void regionBlockRemoved(
RemovalNotification<TraceMemoryRegion, DBTraceProgramViewMemoryRegionBlock> rn) {
// Nothing
}
protected void spaceBlockRemoved(
RemovalNotification<AddressSpace, DBTraceProgramViewMemorySpaceBlock> rn) {
// Nothing
}
protected abstract void recomputeAddressSet();
protected void forPhysicalSpaces(Consumer<AddressSpace> consumer) {

View file

@ -23,8 +23,6 @@ import javax.swing.Icon;
import org.apache.commons.collections4.IteratorUtils;
import com.google.common.collect.Iterators;
import generic.NestedIterator;
import ghidra.program.model.address.*;
import ghidra.program.model.listing.Bookmark;
@ -283,6 +281,7 @@ public class DBTraceProgramViewBookmarkManager implements TraceProgramViewBookma
* A less restrictive casting of
* {@link IteratorUtils#filteredIterator(Iterator, org.apache.commons.collections4.Predicate)}.
*
* <p>
* This one understands that the predicate will be testing things of the (possibly
* more-specific) type of elements in the original iterator, not that of the returned iterator.
*
@ -293,7 +292,7 @@ public class DBTraceProgramViewBookmarkManager implements TraceProgramViewBookma
@SuppressWarnings("unchecked")
protected static <T, U extends T> Iterator<T> filteredIterator(Iterator<U> it,
Predicate<? super U> predicate) {
return (Iterator<T>) Iterators.filter(it, e -> predicate.test(e));
return (Iterator<T>) IteratorUtils.filteredIterator(it, e -> predicate.test(e));
}
@Override

View file

@ -17,9 +17,7 @@ package ghidra.trace.database.program;
import java.util.*;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.RemovalNotification;
import com.google.common.collect.Iterators;
import org.apache.commons.collections4.IteratorUtils;
import ghidra.program.model.address.*;
import ghidra.program.model.symbol.Equate;
@ -30,6 +28,7 @@ import ghidra.trace.model.Lifespan;
import ghidra.trace.model.listing.TraceCodeUnit;
import ghidra.util.IntersectionAddressSetView;
import ghidra.util.LockHold;
import ghidra.util.datastruct.WeakValueHashMap;
import ghidra.util.exception.*;
import ghidra.util.task.TaskMonitor;
@ -37,18 +36,13 @@ public class DBTraceProgramViewEquateTable implements EquateTable {
protected final DBTraceProgramView program;
protected final DBTraceEquateManager equateManager;
protected final Map<DBTraceEquate, DBTraceProgramViewEquate> cache =
CacheBuilder.newBuilder().removalListener(this::equateRemoved).weakValues().build().asMap();
protected final Map<DBTraceEquate, DBTraceProgramViewEquate> cache = new WeakValueHashMap<>();
public DBTraceProgramViewEquateTable(DBTraceProgramView program) {
this.program = program;
this.equateManager = program.trace.getEquateManager();
}
private void equateRemoved(RemovalNotification<DBTraceEquate, DBTraceProgramViewEquate> rn) {
// Nothing
}
@Override
public Equate createEquate(String name, long value)
throws DuplicateNameException, InvalidInputException {
@ -77,7 +71,8 @@ public class DBTraceProgramViewEquateTable implements EquateTable {
@Override
public void deleteAddressRange(Address start, Address end, TaskMonitor monitor)
throws CancelledException {
equateManager.clearReferences(Lifespan.nowOn(program.snap), new AddressRangeImpl(start, end),
equateManager.clearReferences(Lifespan.nowOn(program.snap),
new AddressRangeImpl(start, end),
monitor);
}
@ -161,7 +156,8 @@ public class DBTraceProgramViewEquateTable implements EquateTable {
@Override
public Iterator<Equate> getEquates() {
return Iterators.transform(equateManager.getAll().iterator(), e -> doGetViewEquate(e));
return IteratorUtils.transformedIterator(equateManager.getAll().iterator(),
e -> doGetViewEquate(e));
}
@Override

View file

@ -19,28 +19,19 @@ import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import com.google.common.cache.CacheBuilder;
import ghidra.program.model.address.*;
import ghidra.program.model.mem.MemoryBlock;
import ghidra.trace.model.memory.TraceMemoryRegion;
import ghidra.util.LockHold;
import ghidra.util.datastruct.WeakValueHashMap;
public class DBTraceProgramViewMemory extends AbstractDBTraceProgramViewMemory {
// NB. Keep both per-region and force-full (per-space) block sets ready
private final Map<TraceMemoryRegion, DBTraceProgramViewMemoryRegionBlock> regionBlocks =
CacheBuilder.newBuilder()
.removalListener(this::regionBlockRemoved)
.weakValues()
.build()
.asMap();
new WeakValueHashMap<>();
private final Map<AddressSpace, DBTraceProgramViewMemorySpaceBlock> spaceBlocks =
CacheBuilder.newBuilder()
.removalListener(this::spaceBlockRemoved)
.weakValues()
.build()
.asMap();
new WeakValueHashMap<>();
public DBTraceProgramViewMemory(DBTraceProgramView program) {
super(program);

View file

@ -16,8 +16,7 @@
package ghidra.trace.database.program;
import java.util.*;
import com.google.common.collect.Iterators;
import java.util.stream.StreamSupport;
import generic.NestedIterator;
import generic.util.PeekableIterator;
@ -393,12 +392,12 @@ public class DBTraceProgramViewSymbolTable implements SymbolTable {
protected Iterator<? extends Symbol> getSymbolIteratorAtMySnap(
TraceSymbolWithLocationView<? extends TraceSymbol> view, AddressSetView asv,
boolean includeDynamicSymbols, boolean forward) {
Iterator<AddressRange> rit = asv.iterator(forward);
Iterator<Iterator<? extends Symbol>> iit = Iterators.transform(rit, range -> {
Spliterator<AddressRange> spliterator =
Spliterators.spliteratorUnknownSize(asv.iterator(forward), 0);
return StreamSupport.stream(spliterator, false).flatMap(range -> {
return view.getIntersecting(Lifespan.at(program.snap), null, range,
includeDynamicSymbols, forward).iterator();
});
return Iterators.concat(iit);
includeDynamicSymbols, forward).stream();
}).iterator();
}
@Override

View file

@ -22,10 +22,7 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import com.google.common.collect.Collections2;
import db.DBRecord;
import generic.CatenatedCollection;
import ghidra.program.model.address.*;
import ghidra.program.model.listing.CircularDependencyException;
import ghidra.program.model.listing.Program;
@ -197,11 +194,14 @@ public abstract class AbstractDBTraceSymbol extends DBAnnotatedObject
return SpecialAddress.NO_ADDRESS;
}
protected Collection<? extends TraceAddressSnapRange> getRanges() {
return new CatenatedCollection<>(Collections2.transform(manager.idMap.getActiveSpaces(),
space -> Collections2.transform(
space.getUserIndex(long.class, DBTraceSymbolIDEntry.ID_COLUMN).get(getID()),
ent -> ent.getShape())));
protected Iterable<? extends TraceAddressSnapRange> getRanges() {
return () -> manager.idMap.getActiveSpaces()
.stream()
.flatMap(space -> space.getUserIndex(long.class, DBTraceSymbolIDEntry.ID_COLUMN)
.get(getID())
.stream())
.map(ent -> ent.getShape())
.iterator();
}
// Internal
@ -399,7 +399,7 @@ public abstract class AbstractDBTraceSymbol extends DBAnnotatedObject
if (dbns == null) {
return false;
}
return MySymbolTypes.values()[this.getSymbolType().getID()].isValidParent(dbns);
return MySymbolTypes.VALUES.get(this.getSymbolType().getID()).isValidParent(dbns);
}
protected DBTraceNamespaceSymbol checkCircular(DBTraceNamespaceSymbol newParent)

View file

@ -17,8 +17,7 @@ package ghidra.trace.database.symbol;
import java.util.*;
import java.util.function.Predicate;
import com.google.common.collect.Collections2;
import java.util.stream.Collectors;
import ghidra.program.model.symbol.Namespace;
import ghidra.trace.model.symbol.TraceNamespaceSymbol;
@ -66,8 +65,10 @@ public abstract class AbstractDBTraceSymbolSingleTypeView<T extends AbstractDBTr
try (LockHold hold = LockHold.lock(manager.lock.readLock())) {
DBTraceNamespaceSymbol dbnsParent =
manager.assertIsMine((Namespace) Objects.requireNonNull(parent));
return Collections.unmodifiableCollection(Collections2.filter(
symbolsByParentID.get(dbnsParent.getID()), s -> name.equals(s.name)));
return symbolsByParentID.get(dbnsParent.getID())
.stream()
.filter(s -> name.equals(s.name))
.collect(Collectors.toUnmodifiableList());
}
}
@ -85,7 +86,7 @@ public abstract class AbstractDBTraceSymbolSingleTypeView<T extends AbstractDBTr
public Collection<? extends T> getWithMatchingName(String glob, boolean caseSensitive) {
Predicate<String> predicate =
UserSearchUtils.createSearchPattern(glob, caseSensitive).asPredicate();
return Collections2.filter(view, s -> predicate.test(s.name));
return view.stream().filter(s -> predicate.test(s.name)).toList();
}
public Iterator<? extends T> scanByName(String startName) {

View file

@ -20,8 +20,6 @@ import java.util.Map.Entry;
import org.apache.commons.lang3.tuple.ImmutablePair;
import com.google.common.collect.Collections2;
import ghidra.program.model.address.*;
import ghidra.program.model.symbol.Namespace;
import ghidra.trace.database.DBTraceCacheForContainingQueries;
@ -35,6 +33,7 @@ import ghidra.trace.model.TraceAddressSnapRange;
import ghidra.trace.model.symbol.TraceNamespaceSymbol;
import ghidra.trace.model.symbol.TraceSymbolManager;
import ghidra.trace.model.thread.TraceThread;
import ghidra.util.LazyCollection;
import ghidra.util.LockHold;
import ghidra.util.database.DBCachedObjectStore;
import ghidra.util.database.spatial.rect.Rectangle2DDirection;
@ -200,12 +199,13 @@ public abstract class AbstractDBTraceSymbolSingleTypeWithLocationView<T extends
if (space == null) {
return Collections.emptyList();
}
Collection<Long> sids =
space.reduce(TraceAddressSnapRangeQuery.intersecting(range, span)).values();
Collection<Long> matchingTid =
Collections2.filter(sids, s -> DBTraceSymbolManager.unpackTypeID(s) == this.typeID);
return Collections2.transform(matchingTid,
s -> store.getObjectAt(DBTraceSymbolManager.unpackKey(s)));
return new LazyCollection<>(() -> {
return space.reduce(TraceAddressSnapRangeQuery.intersecting(range, span))
.values()
.stream()
.filter(s -> DBTraceSymbolManager.unpackTypeID(s) == this.typeID)
.map(s -> store.getObjectAt(DBTraceSymbolManager.unpackKey(s)));
});
}
}
@ -220,16 +220,16 @@ public abstract class AbstractDBTraceSymbolSingleTypeWithLocationView<T extends
if (space == null) {
return Collections.emptyList();
}
Collection<Long> sids = space
.reduce(TraceAddressSnapRangeQuery.intersecting(range, span)
.starting(
forward ? Rectangle2DDirection.LEFTMOST
: Rectangle2DDirection.RIGHTMOST))
.orderedValues();
Collection<Long> matchingTid =
Collections2.filter(sids, s -> DBTraceSymbolManager.unpackTypeID(s) == this.typeID);
return Collections2.transform(matchingTid,
s -> store.getObjectAt(DBTraceSymbolManager.unpackKey(s)));
return new LazyCollection<T>(() -> {
return space.reduce(TraceAddressSnapRangeQuery.intersecting(range, span)
.starting(forward
? Rectangle2DDirection.LEFTMOST
: Rectangle2DDirection.RIGHTMOST))
.orderedValues()
.stream()
.filter(s -> DBTraceSymbolManager.unpackTypeID(s) == this.typeID)
.map(s -> store.getObjectAt(DBTraceSymbolManager.unpackKey(s)));
});
}
}

View file

@ -21,8 +21,6 @@ import java.util.Collections;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import com.google.common.collect.Collections2;
import db.DBHandle;
import ghidra.program.model.address.*;
import ghidra.program.model.lang.Language;
@ -165,7 +163,7 @@ public class DBTraceEquateManager extends AbstractDBTraceSpaceBasedManager<DBTra
@Override
public AddressSetView getReferringAddresses(Lifespan span) {
return new UnionAddressSetView(
Collections2.transform(memSpacesView, m -> m.getReferringAddresses(span)));
memSpacesView.stream().map(m -> m.getReferringAddresses(span)).toList());
}
@Override

View file

@ -19,8 +19,6 @@ import java.io.IOException;
import java.util.Collection;
import java.util.concurrent.locks.ReadWriteLock;
import com.google.common.collect.Collections2;
import db.DBHandle;
import db.DBRecord;
import ghidra.program.model.address.*;
@ -198,25 +196,29 @@ public class DBTraceEquateSpace implements DBTraceSpaceBased, TraceEquateSpace {
@Override
public Collection<? extends DBTraceEquate> getReferenced(long snap, Address address,
int operandIndex) {
Collection<DBTraceEquateReference> refs =
equateMapSpace.reduce(TraceAddressSnapRangeQuery.at(address, snap)).values();
Collection<DBTraceEquateReference> filt = Collections2.filter(refs, r -> {
if (r.type != EquateRefType.OP) {
return false;
}
if (r.opOrHash != operandIndex) {
return false;
}
return true;
});
return Collections2.transform(filt, r -> manager.equateStore.getObjectAt(r.equateKey));
return equateMapSpace.reduce(TraceAddressSnapRangeQuery.at(address, snap))
.values()
.stream()
.filter(r -> {
if (r.type != EquateRefType.OP) {
return false;
}
if (r.opOrHash != operandIndex) {
return false;
}
return true;
})
.map(r -> manager.equateStore.getObjectAt(r.equateKey))
.toList();
}
@Override
public Collection<? extends DBTraceEquate> getReferenced(long snap, Address address) {
Collection<DBTraceEquateReference> refs =
equateMapSpace.reduce(TraceAddressSnapRangeQuery.at(address, snap)).values();
return Collections2.transform(refs, r -> manager.equateStore.getObjectAt(r.equateKey));
return equateMapSpace.reduce(TraceAddressSnapRangeQuery.at(address, snap))
.values()
.stream()
.map(r -> manager.equateStore.getObjectAt(r.equateKey))
.toList();
}
@Override

View file

@ -21,8 +21,6 @@ import java.util.*;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import com.google.common.collect.Collections2;
import db.DBRecord;
import ghidra.program.database.function.OverlappingFunctionException;
import ghidra.program.model.address.*;
@ -244,9 +242,10 @@ public class DBTraceFunctionSymbol extends DBTraceNamespaceSymbol
if (!foundBadVariables) {
return;
}
List<AbstractDBTraceVariableSymbol> badns = new ArrayList<>();
badns.addAll(Collections2.filter(manager.allLocals.getChildren(this),
DBTraceFunctionSymbol::isBadVariable));
List<? extends AbstractDBTraceVariableSymbol> badns = manager.allLocals.getChildren(this)
.stream()
.filter(DBTraceFunctionSymbol::isBadVariable)
.toList();
if (badns.isEmpty()) {
return;
}
@ -1451,7 +1450,7 @@ public class DBTraceFunctionSymbol extends DBTraceNamespaceSymbol
into.addAll(from);
}
else {
into.addAll(Collections2.filter(from, filter::matches));
from.stream().filter(v -> filter.matches(v)).forEach(into::add);
}
}
@ -1741,7 +1740,7 @@ public class DBTraceFunctionSymbol extends DBTraceNamespaceSymbol
if (DBTraceSymbolManager.DEFAULT_CALLING_CONVENTION_ID == callingConventionID) {
return cs.getDefaultCallingConvention();
}
String ccName = manager.callingConventionMap.inverse().get(callingConventionID);
String ccName = manager.callingConventionMap.getKey(callingConventionID);
if (ccName == null) {
return null;
}
@ -1758,7 +1757,7 @@ public class DBTraceFunctionSymbol extends DBTraceNamespaceSymbol
if (DBTraceSymbolManager.DEFAULT_CALLING_CONVENTION_ID == callingConventionID) {
return DBTraceSymbolManager.DEFAULT_CALLING_CONVENTION_NAME;
}
return manager.callingConventionMap.inverse().get(callingConventionID);
return manager.callingConventionMap.getKey(callingConventionID);
}
}
@ -1970,9 +1969,11 @@ public class DBTraceFunctionSymbol extends DBTraceNamespaceSymbol
@Override
public void promoteLocalUserLabelsToGlobal() {
try (LockHold hold = LockHold.lock(manager.lock.writeLock())) {
List<DBTraceLabelSymbol> toPromote =
new ArrayList<>(Collections2.filter(manager.labels().getChildren(this),
l -> l.getSource() == SourceType.USER_DEFINED));
List<? extends DBTraceLabelSymbol> toPromote = manager.labels()
.getChildren(this)
.stream()
.filter(l -> l.getSource() == SourceType.USER_DEFINED)
.toList();
for (DBTraceLabelSymbol label : toPromote) {
try {
label.setNamespace(manager.getGlobalNamespace());

View file

@ -21,8 +21,6 @@ import java.util.Collections;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import com.google.common.collect.Collections2;
import db.DBHandle;
import ghidra.program.model.address.*;
import ghidra.program.model.lang.Language;
@ -273,13 +271,13 @@ public class DBTraceReferenceManager extends AbstractDBTraceSpaceBasedManager<DB
@Override
public AddressSetView getReferenceSources(Lifespan span) {
return new UnionAddressSetView(
Collections2.transform(memSpacesView, s -> s.getReferenceSources(span)));
memSpacesView.stream().map(s -> s.getReferenceSources(span)).toList());
}
@Override
public AddressSetView getReferenceDestinations(Lifespan span) {
return new UnionAddressSetView(
Collections2.transform(memSpacesView, s -> s.getReferenceDestinations(span)));
memSpacesView.stream().map(s -> s.getReferenceDestinations(span)).toList());
}
@Override

View file

@ -18,8 +18,7 @@ package ghidra.trace.database.symbol;
import java.io.IOException;
import java.util.Collection;
import java.util.concurrent.locks.ReadWriteLock;
import com.google.common.collect.Collections2;
import java.util.stream.Stream;
import db.DBHandle;
import db.DBRecord;
@ -47,8 +46,7 @@ import ghidra.trace.model.symbol.TraceReference;
import ghidra.trace.model.symbol.TraceReferenceSpace;
import ghidra.trace.model.thread.TraceThread;
import ghidra.trace.util.TraceChangeRecord;
import ghidra.util.LockHold;
import ghidra.util.Msg;
import ghidra.util.*;
import ghidra.util.database.*;
import ghidra.util.database.annot.*;
import ghidra.util.exception.VersionException;
@ -598,49 +596,53 @@ public class DBTraceReferenceSpace implements DBTraceSpaceBased, TraceReferenceS
}
}
private Stream<? extends DBTraceReference> streamReferencesFrom(long snap,
Address fromAddress) {
return referenceMapSpace.reduce(TraceAddressSnapRangeQuery.at(fromAddress, snap))
.values()
.stream()
.map(e -> e.ref);
}
@Override
public Collection<? extends DBTraceReference> getReferencesFrom(long snap,
Address fromAddress) {
return Collections2.transform(
referenceMapSpace.reduce(TraceAddressSnapRangeQuery.at(fromAddress, snap)).values(),
e -> e.ref);
return streamReferencesFrom(snap, fromAddress).toList();
}
@Override
public Collection<? extends DBTraceReference> getReferencesFrom(long snap, Address fromAddress,
int operandIndex) {
return Collections2.filter(getReferencesFrom(snap, fromAddress),
r -> r.getOperandIndex() == operandIndex);
return streamReferencesFrom(snap, fromAddress)
.filter(r -> r.getOperandIndex() == operandIndex)
.toList();
}
@Override
public Collection<? extends DBTraceReference> getReferencesFromRange(Lifespan span,
AddressRange range) {
return Collections2.transform(
referenceMapSpace.reduce(TraceAddressSnapRangeQuery.intersecting(range, span)).values(),
e -> e.ref);
return new LazyCollection<>(
() -> referenceMapSpace.reduce(TraceAddressSnapRangeQuery.intersecting(range, span))
.values()
.stream()
.map(e -> e.ref));
}
@Override
public DBTraceReference getPrimaryReferenceFrom(long snap, Address fromAddress,
int operandIndex) {
for (DBTraceReference ref : getReferencesFrom(snap, fromAddress)) {
if (!ref.isPrimary()) {
continue;
}
if (ref.getOperandIndex() != operandIndex) {
continue;
}
return ref;
}
return null;
return streamReferencesFrom(snap, fromAddress)
.filter(r -> r.isPrimary() && r.getOperandIndex() == operandIndex)
.findFirst()
.orElse(null);
}
@Override
public Collection<? extends DBTraceReference> getFlowReferencesFrom(long snap,
Address fromAddress) {
return Collections2.filter(getReferencesFrom(snap, fromAddress),
r -> r.getReferenceType().isFlow());
return streamReferencesFrom(snap, fromAddress)
.filter(r -> r.getReferenceType().isFlow())
.toList();
}
@Override
@ -669,17 +671,21 @@ public class DBTraceReferenceSpace implements DBTraceSpaceBased, TraceReferenceS
@Override
public Collection<? extends DBTraceReference> getReferencesTo(long snap, Address toAddress) {
return Collections2.transform(
xrefMapSpace.reduce(TraceAddressSnapRangeQuery.at(toAddress, snap)).values(),
this::getRefForXRefEntry);
return xrefMapSpace.reduce(TraceAddressSnapRangeQuery.at(toAddress, snap))
.values()
.stream()
.map(this::getRefForXRefEntry)
.toList();
}
@Override
public Collection<? extends DBTraceReference> getReferencesToRange(Lifespan span,
AddressRange range) {
return Collections2.transform(
xrefMapSpace.reduce(TraceAddressSnapRangeQuery.intersecting(range, span)).values(),
this::getRefForXRefEntry);
return new LazyCollection<>(
() -> xrefMapSpace.reduce(TraceAddressSnapRangeQuery.intersecting(range, span))
.values()
.stream()
.map(this::getRefForXRefEntry));
}
protected void truncateOrDeleteEntry(DBTraceReferenceEntry ref, long otherStartSnap) {
@ -732,7 +738,7 @@ public class DBTraceReferenceSpace implements DBTraceSpaceBased, TraceReferenceS
}
protected Collection<? extends DBTraceReference> getReferencesBySymbolId(long id) {
return Collections2.transform(refsBySymbolId.get(id), e -> e.ref);
return refsBySymbolId.get(id).stream().map(e -> e.ref).toList();
}
@Override

View file

@ -20,8 +20,8 @@ import java.lang.reflect.Field;
import java.util.*;
import java.util.concurrent.locks.ReadWriteLock;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import org.apache.commons.collections4.BidiMap;
import org.apache.commons.collections4.bidimap.DualHashBidiMap;
import db.*;
import ghidra.program.model.address.*;
@ -413,6 +413,8 @@ public class DBTraceSymbolManager implements TraceSymbolManager, DBTraceManager
}
};
public static final List<MySymbolTypes> VALUES = List.of(values());
abstract boolean isValidParent(DBTraceNamespaceSymbol parent);
boolean isNoFunctionAncestor(DBTraceNamespaceSymbol parent) {
@ -434,7 +436,7 @@ public class DBTraceSymbolManager implements TraceSymbolManager, DBTraceManager
protected final DBTraceAddressSnapRangePropertyMap<Long, DBTraceSymbolIDEntry> idMap;
protected final DBCachedObjectStore<DBTraceCallingConventionEntry> callingConventionStore;
protected final BiMap<String, Byte> callingConventionMap = HashBiMap.create();
protected final BidiMap<String, Byte> callingConventionMap = new DualHashBidiMap<>();
protected final DBCachedObjectStore<DBTraceFunctionTag> tagStore;
protected final DBCachedObjectIndex<String, DBTraceFunctionTag> tagsByName;

View file

@ -18,10 +18,8 @@ package ghidra.trace.database.symbol;
import java.util.*;
import java.util.stream.Collectors;
import com.google.common.collect.Collections2;
import generic.CatenatedCollection;
import ghidra.trace.model.symbol.*;
import ghidra.util.LazyCollection;
import ghidra.util.MergeSortingIterator;
public class DBTraceSymbolMultipleTypesView<T extends AbstractDBTraceSymbol>
@ -49,30 +47,30 @@ public class DBTraceSymbolMultipleTypesView<T extends AbstractDBTraceSymbol>
@Override
public Collection<? extends T> getAll(boolean includeDynamicSymbols) {
return new CatenatedCollection<>(
Collections2.transform(parts, p -> p.getAll(includeDynamicSymbols)));
return new LazyCollection<>(
() -> parts.stream().flatMap(p -> p.getAll(includeDynamicSymbols).stream()));
}
@Override
public Collection<? extends T> getChildrenNamed(String name, TraceNamespaceSymbol parent) {
return new CatenatedCollection<>(
Collections2.transform(parts, p -> p.getChildrenNamed(name, parent)));
return parts.stream().flatMap(p -> p.getChildrenNamed(name, parent).stream()).toList();
}
@Override
public Collection<? extends T> getChildren(TraceNamespaceSymbol parent) {
return new CatenatedCollection<>(Collections2.transform(parts, p -> p.getChildren(parent)));
return new LazyCollection<>(
() -> parts.stream().flatMap(p -> p.getChildren(parent).stream()));
}
@Override
public Collection<? extends T> getNamed(String name) {
return new CatenatedCollection<>(Collections2.transform(parts, p -> p.getNamed(name)));
return parts.stream().flatMap(p -> p.getNamed(name).stream()).toList();
}
@Override
public Collection<? extends T> getWithMatchingName(String glob, boolean caseSensitive) {
return new CatenatedCollection<>(
Collections2.transform(parts, p -> p.getWithMatchingName(glob, caseSensitive)));
return new LazyCollection<>(() -> parts.stream()
.flatMap(p -> p.getWithMatchingName(glob, caseSensitive).stream()));
}
@Override

View file

@ -17,12 +17,10 @@ package ghidra.trace.database.symbol;
import java.util.Collection;
import com.google.common.collect.Collections2;
import generic.CatenatedCollection;
import ghidra.program.model.address.*;
import ghidra.trace.model.symbol.TraceNamespaceSymbol;
import ghidra.trace.model.symbol.TraceSymbolWithAddressView;
import ghidra.util.LazyCollection;
import ghidra.util.LockHold;
public class DBTraceSymbolMultipleTypesWithAddressView<T extends AbstractDBTraceSymbol>
@ -60,8 +58,8 @@ public class DBTraceSymbolMultipleTypesWithAddressView<T extends AbstractDBTrace
@Override
public Collection<? extends T> getIntersecting(AddressRange range,
boolean includeDynamicSymbols) {
return new CatenatedCollection<>(Collections2.transform(getParts(),
p -> p.getIntersecting(range, includeDynamicSymbols)));
return new LazyCollection<>(() -> getParts().stream()
.flatMap(p -> p.getIntersecting(range, includeDynamicSymbols).stream()));
}
@Override

View file

@ -18,9 +18,6 @@ package ghidra.trace.database.symbol;
import java.util.Collection;
import java.util.Collections;
import com.google.common.collect.Collections2;
import generic.CatenatedCollection;
import ghidra.program.model.address.Address;
import ghidra.program.model.address.AddressRange;
import ghidra.trace.database.map.DBTraceAddressSnapRangePropertyMapSpace;
@ -31,6 +28,7 @@ import ghidra.trace.model.Lifespan;
import ghidra.trace.model.symbol.TraceNamespaceSymbol;
import ghidra.trace.model.symbol.TraceSymbolWithLocationView;
import ghidra.trace.model.thread.TraceThread;
import ghidra.util.LazyCollection;
import ghidra.util.LockHold;
import ghidra.util.database.spatial.rect.Rectangle2DDirection;
@ -70,8 +68,9 @@ public class DBTraceSymbolMultipleTypesWithLocationView<T extends AbstractDBTrac
@Override
public Collection<? extends T> getAt(long snap, TraceThread thread, Address address,
boolean includeDynamicSymbols) {
return new CatenatedCollection<>(Collections2.transform(getParts(),
p -> p.getAt(snap, thread, address, includeDynamicSymbols)));
return getParts().stream()
.flatMap(p -> p.getAt(snap, thread, address, includeDynamicSymbols).stream())
.toList();
}
@Override
@ -87,30 +86,31 @@ public class DBTraceSymbolMultipleTypesWithLocationView<T extends AbstractDBTrac
if (space == null) {
return Collections.emptyList();
}
Collection<Long> sids =
space.reduce(TraceAddressSnapRangeQuery.intersecting(range, span)
.starting(
forward ? Rectangle2DDirection.LEFTMOST
: Rectangle2DDirection.RIGHTMOST))
.orderedValues();
Collection<Long> matchingTid = Collections2.filter(sids, s -> {
byte tid = DBTraceSymbolManager.unpackTypeID(s);
for (AbstractDBTraceSymbolSingleTypeView<? extends T> p : parts) {
if (p.typeID == tid) {
return true;
}
}
return false;
});
return Collections2.transform(matchingTid, s -> {
byte tid = DBTraceSymbolManager.unpackTypeID(s);
for (AbstractDBTraceSymbolSingleTypeView<? extends T> p : parts) {
if (p.typeID == tid) {
return p.store.getObjectAt(DBTraceSymbolManager.unpackKey(s));
}
}
throw new AssertionError(); // Was filtered above
});
return new LazyCollection<>(() -> space
.reduce(TraceAddressSnapRangeQuery.intersecting(range, span)
.starting(
forward ? Rectangle2DDirection.LEFTMOST
: Rectangle2DDirection.RIGHTMOST))
.orderedValues()
.stream()
.filter(s -> {
byte tid = DBTraceSymbolManager.unpackTypeID(s);
for (AbstractDBTraceSymbolSingleTypeView<? extends T> p : parts) {
if (p.typeID == tid) {
return true;
}
}
return false;
})
.map(s -> {
byte tid = DBTraceSymbolManager.unpackTypeID(s);
for (AbstractDBTraceSymbolSingleTypeView<? extends T> p : parts) {
if (p.typeID == tid) {
return p.store.getObjectAt(DBTraceSymbolManager.unpackKey(s));
}
}
throw new AssertionError(); // Was filtered above
}));
}
}
}

View file

@ -21,10 +21,6 @@ import java.util.*;
import java.util.function.Function;
import java.util.stream.*;
import org.apache.commons.collections4.IteratorUtils;
import com.google.common.collect.Iterators;
import db.DBRecord;
import db.StringField;
import ghidra.dbg.target.TargetObject;
@ -60,8 +56,7 @@ import ghidra.trace.model.target.*;
import ghidra.trace.model.target.annot.TraceObjectInterfaceUtils;
import ghidra.trace.model.thread.TraceObjectThread;
import ghidra.trace.util.TraceChangeRecord;
import ghidra.util.LockHold;
import ghidra.util.Msg;
import ghidra.util.*;
import ghidra.util.database.*;
import ghidra.util.database.DBCachedObjectStoreFactory.AbstractDBFieldCodec;
import ghidra.util.database.annot.*;
@ -605,23 +600,20 @@ public class DBTraceObject extends DBAnnotatedObject implements TraceObject {
Rectangle2DDirection dir = forward
? Rectangle2DDirection.BOTTOMMOST
: Rectangle2DDirection.TOPMOST;
List<Iterator<DBTraceObjectAddressRangeValue>> iterators = manager.rangeValueMap
List<Stream<DBTraceObjectAddressRangeValue>> streams = manager.rangeValueMap
.getActiveMemorySpaces()
.stream()
.map(s -> IteratorUtils.filteredIterator(s
.map(s -> StreamSupport.stream(s
.reduce(TraceAddressSnapRangeQuery.intersecting(span, s.getAddressSpace())
.starting(dir))
.orderedValues()
.iterator(),
v -> key.equals(v.getEntryKey()) && this == v.getParent()))
.collect(Collectors.toList());
.spliterator(),
false).filter(v -> key.equals(v.getEntryKey()) && this == v.getParent()))
.toList();
Comparator<Long> order = forward ? Comparator.naturalOrder() : Comparator.reverseOrder();
Comparator<DBTraceObjectAddressRangeValue> comparator =
Comparator.comparing(v -> v.getMinSnap(), order);
Iterator<DBTraceObjectAddressRangeValue> merged =
Iterators.mergeSorted(iterators, comparator);
return StreamSupport
.stream(Spliterators.spliteratorUnknownSize(merged, Spliterator.ORDERED), false);
return StreamUtils.merge(streams, comparator);
}
@Override
@ -642,10 +634,7 @@ public class DBTraceObject extends DBAnnotatedObject implements TraceObject {
Comparator<Long> order = forward ? Comparator.naturalOrder() : Comparator.reverseOrder();
Comparator<InternalTraceObjectValue> comparator =
Comparator.comparing(v -> v.getMinSnap(), order);
Iterator<InternalTraceObjectValue> merged =
Iterators.mergeSorted(Arrays.asList(nrVals.iterator(), rVals.iterator()), comparator);
return StreamSupport
.stream(Spliterators.spliteratorUnknownSize(merged, Spliterator.ORDERED), false);
return StreamUtils.merge(List.of(nrVals, rVals), comparator);
}
@Override

View file

@ -16,9 +16,9 @@
package ghidra.trace.util;
import java.util.Iterator;
import java.util.function.Predicate;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterators;
import org.apache.commons.collections4.IteratorUtils;
import ghidra.program.model.listing.Function;
import ghidra.program.model.listing.FunctionIterator;
@ -32,7 +32,7 @@ public class WrappingFunctionIterator implements FunctionIterator {
public <T extends Function> WrappingFunctionIterator(Iterator<T> it,
Predicate<? super T> filter) {
this.it = Iterators.filter(it, filter);
this.it = IteratorUtils.filteredIterator(it, e -> filter.test(e));
}
@Override