mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-09-28 17:11:11 -09:00
feat: cache vfunctions list
The vfunctions are collected and compared in two loops against all the recoveredClasses, this takes time if the binary have many classes. This commit makes the vfunctions list and the vftable address to be stored in a map, making the vfunctions list and create happen only once.
This commit is contained in:
@@ -137,6 +137,7 @@ public class RecoveredClassHelper {
|
||||
protected final boolean createBookmarks;
|
||||
protected final boolean useShortTemplates;
|
||||
protected final boolean nameVfunctions;
|
||||
public HashMap<Address, Set<Function>> allVfunctions = new HashMap<>();
|
||||
|
||||
public RecoveredClassHelper(Program program, ServiceProvider serviceProvider,
|
||||
FlatProgramAPI api, boolean createBookmarks, boolean useShortTemplates,
|
||||
@@ -478,20 +479,25 @@ public class RecoveredClassHelper {
|
||||
return functionToLoadPcodeOps.get(function);
|
||||
}
|
||||
|
||||
public Set<Function> getAllVfunctions(List<Address> vftableAddresses)
|
||||
throws CancelledException {
|
||||
|
||||
Set<Function> allVfunctionsSet = new HashSet<Function>();
|
||||
|
||||
public Set<Function> getAllVfunctions(List<Address> vftableAddresses) throws CancelledException {
|
||||
if (vftableAddresses.isEmpty()) {
|
||||
return allVfunctionsSet;
|
||||
return Collections.emptySet();
|
||||
}
|
||||
|
||||
Set<Function> vfunctionSet = new HashSet<>();
|
||||
for (Address vftableAddress : vftableAddresses) {
|
||||
monitor.checkCancelled();
|
||||
allVfunctionsSet.addAll(getVfunctions(vftableAddress));
|
||||
if (!allVfunctions.containsKey(vftableAddress)) {
|
||||
List<Function> funcList = getVfunctions(vftableAddress);
|
||||
if (funcList == null) {
|
||||
funcList = new ArrayList<>();
|
||||
}
|
||||
allVfunctions.put(vftableAddress, new HashSet<>(funcList));
|
||||
}
|
||||
vfunctionSet.addAll(allVfunctions.get(vftableAddress));
|
||||
}
|
||||
|
||||
return allVfunctionsSet;
|
||||
return vfunctionSet;
|
||||
}
|
||||
|
||||
public Set<Function> getAllClassFunctionsWithVtableRef(List<Address> vftables)
|
||||
|
||||
Reference in New Issue
Block a user