diff --git a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RecoveredClassHelper.java b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RecoveredClassHelper.java index f36c713735..e62e551dae 100644 --- a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RecoveredClassHelper.java +++ b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RecoveredClassHelper.java @@ -137,6 +137,7 @@ public class RecoveredClassHelper { protected final boolean createBookmarks; protected final boolean useShortTemplates; protected final boolean nameVfunctions; + public HashMap> 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 getAllVfunctions(List
vftableAddresses) - throws CancelledException { - - Set allVfunctionsSet = new HashSet(); - + public Set getAllVfunctions(List
vftableAddresses) throws CancelledException { if (vftableAddresses.isEmpty()) { - return allVfunctionsSet; + return Collections.emptySet(); } + + Set vfunctionSet = new HashSet<>(); for (Address vftableAddress : vftableAddresses) { monitor.checkCancelled(); - allVfunctionsSet.addAll(getVfunctions(vftableAddress)); + if (!allVfunctions.containsKey(vftableAddress)) { + List 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 getAllClassFunctionsWithVtableRef(List
vftables)