mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 18:29:37 +02:00
GP-1545: De-guava the Debugger
This commit is contained in:
parent
a2ae1f08ce
commit
d43b9ead66
142 changed files with 1125 additions and 1889 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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)));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue