diff --git a/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/classtype/MsftVxtManager.java b/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/classtype/MsftVxtManager.java index 04a7a7eb3d..8b5e04f0ae 100644 --- a/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/classtype/MsftVxtManager.java +++ b/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/classtype/MsftVxtManager.java @@ -52,9 +52,9 @@ import mdemangler.typeinfo.*; * {@link #createVirtualTable(CategoryPath, String, Address, TaskMonitor)} methods demangle * the strings and created tables within a owner/parentage tree based on the demangled information. *

- * The {@link #findVbt(ClassID, List)} and {@link #findVft(ClassID, List)} methods attempt - * to find the VF/VB tables by finding the appropriate node in the tree based upon owner and - * at-times-mismatched parentage information from the user. This mismatch is not necessarily + * The {@link #findVbt(ClassID, List, Integer)} and {@link #findVft(ClassID, List, Integer)} methods + * attempt to find the VF/VB tables by finding the appropriate node in the tree based upon owner + * and at-times-mismatched parentage information from the user. This mismatch is not necessarily * the fault of the user, but more due to what parentage is incorporated into the mangled name. *

* DESIGN of find mechanism @@ -127,6 +127,12 @@ public class MsftVxtManager extends VxtManager { private Map> vbtsByOwner; private Map> vftsByOwner; + // A new interim solution using the address order per owner. + private Map> vbtByAddressByOwner; + private Map> vftByAddressByOwner; + private Map> vbtByPtrOrdinalByOwner; + private Map> vftByPtrOrdinalByOwner; + // Used for locating vft and vbt // These are explicitly used for storing/retrieving the "program" versions which result from // locating and parsing the mangled strings for these tables. It is possible that these @@ -149,6 +155,10 @@ public class MsftVxtManager extends VxtManager { parentageNodeByMangled = new HashMap<>(); vbtsByOwner = new HashMap<>(); vftsByOwner = new HashMap<>(); + vbtByAddressByOwner = new HashMap<>(); + vftByAddressByOwner = new HashMap<>(); + vbtByPtrOrdinalByOwner = new HashMap<>(); + vftByPtrOrdinalByOwner = new HashMap<>(); vbtRoot = new ParentageNode(null); vftRoot = new ParentageNode(null); vbtsByOwnerParentage = new HashMap<>(); @@ -295,23 +305,63 @@ public class MsftVxtManager extends VxtManager { * @param parentage the parentage for the desired table. The parentage must start with the * parent that contains the pointer to the table and should include the ordered lineage from * that class through all of its decendents to the owner, excluding the owner + * @param ordinal ordinal of table for owner as sorted by address * @return the table */ - public VirtualBaseTable findVbt(ClassID owner, List parentage) { + public VirtualBaseTable findVbt(ClassID owner, List parentage, Integer ordinal) { OwnerParentage op = new OwnerParentage(owner, parentage); VirtualBaseTable vbt = vbtsByOwnerParentage.get(op); if (vbt != null) { return vbt; } - vbt = searchVbtTree(owner, parentage); + vbt = getVbtByAddressOrdinal(owner, ordinal); if (vbt == null) { - vbt = new PlaceholderVirtualBaseTable(owner, parentage); + vbt = searchVbtTree(owner, parentage); + if (vbt == null) { + vbt = new PlaceholderVirtualBaseTable(owner, parentage); + } } vbtsByOwnerParentage.put(op, vbt); - storeVbt(owner, vbt); + storeVbt(owner, ordinal, vbt); return vbt; } + private VirtualBaseTable getVbtByAddressOrdinal(ClassID owner, Integer ordinal) { + if (ordinal == null) { + return null; + } + Map map = vbtByAddressByOwner.get(owner); + if (map == null) { + return null; + } + int count = 0; + for (Map.Entry entry : map.entrySet()) { + if (count == ordinal) { + return entry.getValue(); + } + count++; + } + return null; + } + + private VirtualFunctionTable getVftByAddressOrdinal(ClassID owner, Integer ordinal) { + if (ordinal == null) { + return null; + } + Map map = vftByAddressByOwner.get(owner); + if (map == null) { + return null; + } + int count = 0; + for (Map.Entry entry : map.entrySet()) { + if (count == ordinal) { + return entry.getValue(); + } + count++; + } + return null; + } + private VirtualBaseTable searchVbtTree(ClassID owner, List parentage) { ParentageNode node = findNode(owner, parentage, vbtRoot); if (node == null) { @@ -341,20 +391,24 @@ public class MsftVxtManager extends VxtManager { * @param parentage the parentage for the desired table. The parentage must start with the * parent that contains the pointer to the table and should include the ordered lineage from * that class through all of its decendents to the owner, excluding the owner + * @param ordinal ordinal of table for owner as sorted by address * @return the table */ - public VirtualFunctionTable findVft(ClassID owner, List parentage) { + public VirtualFunctionTable findVft(ClassID owner, List parentage, Integer ordinal) { OwnerParentage op = new OwnerParentage(owner, parentage); VirtualFunctionTable vft = vftsByOwnerParentage.get(op); if (vft != null) { return vft; } - vft = searchVftTree(owner, parentage); + vft = getVftByAddressOrdinal(owner, ordinal); if (vft == null) { - vft = new PlaceholderVirtualFunctionTable(owner, parentage); + vft = searchVftTree(owner, parentage); + if (vft == null) { + vft = new PlaceholderVirtualFunctionTable(owner, parentage); + } } vftsByOwnerParentage.put(op, vft); - storeVft(owner, vft); + storeVft(owner, ordinal, vft); return vft; } @@ -463,7 +517,7 @@ public class MsftVxtManager extends VxtManager { } node.setVBTable(prvbt); vbtByAddress.put(address, prvbt); - storeVbt(owner, prvbt); // temp solution? + storeVbt(owner, address, prvbt); // temp solution? break; case VFT: @@ -475,7 +529,7 @@ public class MsftVxtManager extends VxtManager { } node.setVFTable(vft); vftByAddress.put(address, vft); - storeVft(owner, vft); // temp solution? + storeVft(owner, address, vft); // temp solution? break; default: @@ -484,9 +538,8 @@ public class MsftVxtManager extends VxtManager { return true; } - private void storeVbt(ClassID owner, VirtualBaseTable vbt) { - ClassID own = vbt.getOwner(); - List list = vbtsByOwner.get(own); + private void storeVbt(ClassID owner, Address address, VirtualBaseTable vbt) { + List list = vbtsByOwner.get(owner); if (list == null) { list = new ArrayList<>(); vbtsByOwner.put(owner, list); @@ -498,9 +551,55 @@ public class MsftVxtManager extends VxtManager { } } list.add(vbt); + + // Part of next interim solution + Map map = vbtByAddressByOwner.get(owner); + if (map == null) { + map = new TreeMap<>(); + vbtByAddressByOwner.put(owner, map); + } + if (map.containsKey(address)) { + Msg.warn(this, String.format("VBT already exists for owner/address %s/%s", + owner.getSymbolPath().toString(), address.toString())); + return; + } + map.put(address, vbt); + } - private void storeVft(ClassID owner, VirtualFunctionTable vft) { + private void storeVbt(ClassID owner, Integer ordinal, VirtualBaseTable vbt) { + List list = vbtsByOwner.get(owner); + if (list == null) { + list = new ArrayList<>(); + vbtsByOwner.put(owner, list); + } + List parentage = vbt.getParentage(); + for (VirtualBaseTable table : list) { + if (isEqual(table.getParentage(), parentage)) { + return; // return without saving + } + } + list.add(vbt); + + // Part of next interim solution + if (ordinal == null) { + return; + } + Map map = vbtByPtrOrdinalByOwner.get(owner); + if (map == null) { + map = new TreeMap<>(); + vbtByPtrOrdinalByOwner.put(owner, map); + } + if (map.containsKey(ordinal)) { + Msg.warn(this, String.format("VBT already exists for owner/ordinal %s/%d ", + owner.getSymbolPath().toString(), ordinal)); + return; + } + map.put(ordinal, vbt); + + } + + private void storeVft(ClassID owner, Address address, VirtualFunctionTable vft) { List list = vftsByOwner.get(owner); if (list == null) { list = new ArrayList<>(); @@ -513,6 +612,52 @@ public class MsftVxtManager extends VxtManager { } } list.add(vft); + + // Part of next interim solution + Map map = vftByAddressByOwner.get(owner); + if (map == null) { + map = new TreeMap<>(); + vftByAddressByOwner.put(owner, map); + } + if (map.containsKey(address)) { + Msg.warn(this, String.format("VFT already exists for owner/address %s/%s", + owner.getSymbolPath().toString(), address.toString())); + return; + } + map.put(address, vft); + + } + + private void storeVft(ClassID owner, Integer ordinal, VirtualFunctionTable vft) { + List list = vftsByOwner.get(owner); + if (list == null) { + list = new ArrayList<>(); + vftsByOwner.put(owner, list); + } + List parentage = vft.getParentage(); + for (VirtualFunctionTable table : list) { + if (isEqual(table.getParentage(), parentage)) { + return; // return without saving + } + } + list.add(vft); + + // Part of next interim solution + if (ordinal == null) { + return; + } + Map map = vftByPtrOrdinalByOwner.get(owner); + if (map == null) { + map = new TreeMap<>(); + vftByPtrOrdinalByOwner.put(owner, map); + } + if (map.containsKey(ordinal)) { + Msg.warn(this, String.format("VFT already exists for owner/ptrOffset %s/%d", + owner.getSymbolPath().toString(), ordinal)); + return; + } + map.put(ordinal, vft); + } private boolean isEqual(List parentage1, List parentage2) { diff --git a/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/classtype/VirtualBaseTable.java b/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/classtype/VirtualBaseTable.java index 68b8e2cc26..2dfacd4016 100644 --- a/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/classtype/VirtualBaseTable.java +++ b/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/classtype/VirtualBaseTable.java @@ -216,10 +216,10 @@ public abstract class VirtualBaseTable implements VBTable { } /** - * Returns the built data type for this vftable for the current entries + * Returns the built data type for this vbtable for the current entries * @param dtm the data type manager * @param categoryPath category path for the table - * @return the structure of the vftable + * @return the structure of the vbtable */ public Structure getLayout(DataTypeManager dtm, CategoryPath categoryPath) { if (!isBuilt) { // what if we want to rebuild... what should we do? diff --git a/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/CppCompositeType.java b/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/CppCompositeType.java index 4a5d22f1f6..7b20795e06 100644 --- a/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/CppCompositeType.java +++ b/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/CppCompositeType.java @@ -1453,7 +1453,7 @@ public class CppCompositeType { myVftPtrOffset = vftPtrTypeByOffset.firstKey(); VxtPtrInfo info = new VxtPtrInfo(myVftPtrOffset, myVftPtrOffset, myId, List.of(myId)); - VirtualFunctionTable myVft = vxtManager.findVft(myId, info.parentage()); + VirtualFunctionTable myVft = vxtManager.findVft(myId, info.parentage(), 0); myVft.setPtrOffsetInClass(info.finalOffset()); propagatedSelfBaseVfts.add(info); finalVftByOffset.put(info.finalOffset(), myVft); @@ -1490,7 +1490,7 @@ public class CppCompositeType { Msg.warn(this, "Mismatch vbt location for " + myId); } VxtPtrInfo info = new VxtPtrInfo(vbtPtrOffset, vbtPtrOffset, myId, List.of(myId)); - VirtualBaseTable myVbt = vxtManager.findVbt(myId, info.parentage()); + VirtualBaseTable myVbt = vxtManager.findVbt(myId, info.parentage(), 0); myVbt.setPtrOffsetInClass(info.finalOffset()); propagatedSelfBaseVbts.add(info); finalVbtByOffset.put(info.finalOffset(), myVbt); @@ -1548,7 +1548,8 @@ public class CppCompositeType { Long finalOffset = info.finalOffset(); VirtualFunctionTable myVft = (VirtualFunctionTable) finalVftByOffset.get(finalOffset); if (myVft == null) { - myVft = mvxtManager.findVft(myId, info.parentage()); + Integer ordinal = getOrdinalOfKey(finalVftByOffset, finalOffset); + myVft = mvxtManager.findVft(myId, info.parentage(), ordinal); if (myVft == null) { return null; } @@ -1556,8 +1557,7 @@ public class CppCompositeType { } myVft.setPtrOffsetInClass(finalOffset); - VirtualFunctionTable parentVft = - mvxtManager.findVft(parentId, parentParentage); + VirtualFunctionTable parentVft = mvxtManager.findVft(parentId, parentParentage, null); if (parentVft == null) { // this is an error @@ -1669,7 +1669,8 @@ public class CppCompositeType { Long finalOffset = info.finalOffset(); VirtualBaseTable myVbt = (VirtualBaseTable) finalVbtByOffset.get(finalOffset); if (myVbt == null) { - myVbt = mvxtManager.findVbt(myId, info.parentage()); + Integer ordinal = getOrdinalOfKey(finalVbtByOffset, finalOffset); + myVbt = mvxtManager.findVbt(myId, info.parentage(), ordinal); if (myVbt == null) { return null; } @@ -1677,8 +1678,7 @@ public class CppCompositeType { } myVbt.setPtrOffsetInClass(finalOffset); - VirtualBaseTable parentVbt = - mvxtManager.findVbt(parentId, parentParentage); + VirtualBaseTable parentVbt = mvxtManager.findVbt(parentId, parentParentage, null); if (parentVbt == null) { // this is an error return null; @@ -1693,6 +1693,17 @@ public class CppCompositeType { return myVbt; } + private Integer getOrdinalOfKey(Map map, Long key) { + int index = 0; + for (Long offset : finalVftByOffset.keySet()) { + if (offset == key) { + return index; + } + index++; + } + return map.size(); + } + /** * Provides the Virtual Base Table to be used for placing virtual bases of this class * @throws PdbException upon unrecognized vft type @@ -1739,12 +1750,15 @@ public class CppCompositeType { } } } - long off = selfBaseType.getAlignedLength(); + int off = selfBaseType.getAlignedLength(); for (VirtualLayoutBaseClass base : reorderedVirtualBases) { CppCompositeType baseType = base.getBaseClassType(); - addPlaceholderVirtualBaseTableEntry(plvbt, vxtManager, base, off); + int basePtrOff = base.getBasePointerOffset(); + Composite baseComposite = baseType.getComposite(); + off = DataOrganizationImpl.getAlignedOffset(baseComposite.getAlignment(), off); + addPlaceholderVirtualBaseTableEntry(plvbt, vxtManager, base, off - basePtrOff); if (!baseType.hasZeroBaseSize) { - off += baseType.getSelfBaseType().getAlignedLength(); + off += baseType.getSelfBaseType().getLength(); } } return plvbt; diff --git a/Ghidra/Features/PDB/src/test/java/ghidra/app/util/pdb/classtype/MsftVxtManagerTest.java b/Ghidra/Features/PDB/src/test/java/ghidra/app/util/pdb/classtype/MsftVxtManagerTest.java index 94a6c9021a..0bd6ca0622 100644 --- a/Ghidra/Features/PDB/src/test/java/ghidra/app/util/pdb/classtype/MsftVxtManagerTest.java +++ b/Ghidra/Features/PDB/src/test/java/ghidra/app/util/pdb/classtype/MsftVxtManagerTest.java @@ -976,244 +976,244 @@ public class MsftVxtManagerTest extends AbstractGenericTest { int addressIndex = startVbtAddresses; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(A_ID, List.of()); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(A_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(A_ID, List.of(A_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(A_ID, List.of(A_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(B_ID, List.of()); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(B_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(B_ID, List.of(B_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(B_ID, List.of(B_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(C_ID, List.of()); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(C_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(C_ID, List.of(C_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(C_ID, List.of(C_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(D_ID, List.of(C_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(D_ID, List.of(C_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(D_ID, List.of(C_ID, D_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(D_ID, List.of(C_ID, D_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(D_ID, List.of(A_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(D_ID, List.of(A_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(D_ID, List.of(A_ID, D_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(D_ID, List.of(A_ID, D_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(D_ID, List.of(B_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(D_ID, List.of(B_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(D_ID, List.of(B_ID, D_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(D_ID, List.of(B_ID, D_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(E_ID, List.of(A_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(E_ID, List.of(A_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(E_ID, List.of(A_ID, E_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(E_ID, List.of(A_ID, E_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(E_ID, List.of(B_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(E_ID, List.of(B_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(E_ID, List.of(B_ID, E_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(E_ID, List.of(B_ID, E_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(F_ID, List.of()); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(F_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(F_ID, List.of(F_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(F_ID, List.of(F_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(G_ID, List.of()); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(G_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(G_ID, List.of(F_ID, G_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(G_ID, List.of(F_ID, G_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(H_ID, List.of()); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(H_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(H_ID, List.of(F_ID, H_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(H_ID, List.of(F_ID, H_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(I_ID, List.of(G_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(I_ID, List.of(G_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(I_ID, List.of(F_ID, G_ID, I_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(I_ID, List.of(F_ID, G_ID, I_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(I_ID, List.of(H_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(I_ID, List.of(H_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(I_ID, List.of(F_ID, H_ID, I_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(I_ID, List.of(F_ID, H_ID, I_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(J_ID, List.of(H_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(J_ID, List.of(H_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(J_ID, List.of(J_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(J_ID, List.of(J_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(K_ID, List.of()); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(K_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(K_ID, List.of(J_ID, K_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(K_ID, List.of(J_ID, K_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(L_ID, List.of()); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(L_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(L_ID, List.of(J_ID, K_ID, L_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(L_ID, List.of(J_ID, K_ID, L_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(A_ID, E_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(A_ID, E_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(A_ID, E_ID, M_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(A_ID, E_ID, M_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(C_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(C_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(C_ID, D_ID, M_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(C_ID, D_ID, M_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(A_ID, D_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(A_ID, D_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(A_ID, D_ID, M_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(A_ID, D_ID, M_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(B_ID, D_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(B_ID, D_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(B_ID, D_ID, M_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(B_ID, D_ID, M_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(G_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(G_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); vbt = - (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(F_ID, G_ID, I_ID, M_ID)); + (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(F_ID, G_ID, I_ID, M_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(H_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(H_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); vbt = - (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(F_ID, H_ID, I_ID, M_ID)); + (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(F_ID, H_ID, I_ID, M_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of()); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); vbt = - (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(J_ID, K_ID, L_ID, M_ID)); + (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(J_ID, K_ID, L_ID, M_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(B_ID, E_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(B_ID, E_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(B_ID, E_ID, M_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(M_ID, List.of(B_ID, E_ID, M_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; //=== - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O1_ID, List.of(A_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O1_ID, List.of(A_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O1_ID, List.of(A_ID, O1_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O1_ID, List.of(A_ID, O1_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O1_ID, List.of(B_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O1_ID, List.of(B_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O1_ID, List.of(B_ID, O1_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O1_ID, List.of(B_ID, O1_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O2_ID, List.of(A_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O2_ID, List.of(A_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O2_ID, List.of(A_ID, O2_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O2_ID, List.of(A_ID, O2_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O2_ID, List.of(B_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O2_ID, List.of(B_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O2_ID, List.of(B_ID, O2_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O2_ID, List.of(B_ID, O2_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O3_ID, List.of(A_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O3_ID, List.of(A_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O3_ID, List.of(A_ID, O3_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O3_ID, List.of(A_ID, O3_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O3_ID, List.of(B_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O3_ID, List.of(B_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O3_ID, List.of(B_ID, O3_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O3_ID, List.of(B_ID, O3_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O4_ID, List.of(A_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O4_ID, List.of(A_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O4_ID, List.of(A_ID, O4_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O4_ID, List.of(A_ID, O4_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O4_ID, List.of(B_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O4_ID, List.of(B_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O4_ID, List.of(B_ID, O4_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O4_ID, List.of(B_ID, O4_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; //== - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(A_ID, O1_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(A_ID, O1_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(A_ID, O1_ID, O_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(A_ID, O1_ID, O_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(B_ID, O1_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(B_ID, O1_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(B_ID, O1_ID, O_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(B_ID, O1_ID, O_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(A_ID, O2_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(A_ID, O2_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(A_ID, O2_ID, O_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(A_ID, O2_ID, O_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(B_ID, O2_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(B_ID, O2_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(B_ID, O2_ID, O_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(B_ID, O2_ID, O_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(A_ID, O3_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(A_ID, O3_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(A_ID, O3_ID, O_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(A_ID, O3_ID, O_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(B_ID, O3_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(B_ID, O3_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(B_ID, O3_ID, O_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(B_ID, O3_ID, O_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(A_ID, O4_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(A_ID, O4_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); - vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(A_ID, O4_ID, O_ID)); + vbt = (ProgramVirtualBaseTable) mVxtManager32.findVbt(O_ID, List.of(A_ID, O4_ID, O_ID), null); assertEquals(addresses32.get(addressIndex), vbt.getAddress()); addressIndex++; @@ -1236,21 +1236,21 @@ public class MsftVxtManagerTest extends AbstractGenericTest { int addressIndex = startVftAddresses + 1; // skip one for first meta - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(A1_ID, List.of()); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(A1_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(A1_ID, List.of(A1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(A1_ID, List.of(A1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(A2_ID, List.of()); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(A2_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(A2_ID, List.of(A2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(A2_ID, List.of(A2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(A_ID, List.of()); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(A_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(A_ID, List.of(A_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(A_ID, List.of(A_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; @@ -1261,530 +1261,530 @@ public class MsftVxtManagerTest extends AbstractGenericTest { function.getName().equals(ANS_A_fa_1.getName()); // End of spot-check - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(A_ID, List.of(A1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(A_ID, List.of(A1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(A_ID, List.of(A1_ID, A_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(A_ID, List.of(A1_ID, A_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(A_ID, List.of(A2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(A_ID, List.of(A2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(A_ID, List.of(A2_ID, A_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(A_ID, List.of(A2_ID, A_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(B1_ID, List.of()); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(B1_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(B1_ID, List.of(B1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(B1_ID, List.of(B1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(B2_ID, List.of()); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(B2_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(B2_ID, List.of(B2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(B2_ID, List.of(B2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(B_ID, List.of()); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(B_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(B_ID, List.of(B_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(B_ID, List.of(B_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(B_ID, List.of(B1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(B_ID, List.of(B1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(B_ID, List.of(B1_ID, B_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(B_ID, List.of(B1_ID, B_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(B_ID, List.of(B2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(B_ID, List.of(B2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(B_ID, List.of(B2_ID, B_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(B_ID, List.of(B2_ID, B_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; // Second is same query as first for this one - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(C_ID, List.of(C_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(C_ID, List.of(C_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(C_ID, List.of(C_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(C_ID, List.of(C_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(C_ID, List.of(A1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(C_ID, List.of(A1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(C_ID, List.of(A1_ID, C_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(C_ID, List.of(A1_ID, C_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(C_ID, List.of(A2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(C_ID, List.of(A2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(C_ID, List.of(A2_ID, C_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(C_ID, List.of(A2_ID, C_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(C_ID, List.of(B1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(C_ID, List.of(B1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(C_ID, List.of(B1_ID, C_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(C_ID, List.of(B1_ID, C_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(C_ID, List.of(B2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(C_ID, List.of(B2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(C_ID, List.of(B2_ID, C_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(C_ID, List.of(B2_ID, C_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(C_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(C_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(C_ID, D_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(C_ID, D_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(A_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(A_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(A_ID, D_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(A_ID, D_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(B_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(B_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(B_ID, D_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(B_ID, D_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(A1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(A1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = - (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(A1_ID, A_ID, D_ID)); + (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(A1_ID, A_ID, D_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(A2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(A2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = - (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(A2_ID, A_ID, D_ID)); + (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(A2_ID, A_ID, D_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(B1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(B1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = - (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(B1_ID, B_ID, D_ID)); + (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(B1_ID, B_ID, D_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(B2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(B2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = - (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(B2_ID, B_ID, D_ID)); + (ProgramVirtualFunctionTable) mVxtManager32.findVft(D_ID, List.of(B2_ID, B_ID, D_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(A_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(A_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(A_ID, E_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(A_ID, E_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(A1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(A1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(A1_ID, A_ID, E_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(A1_ID, A_ID, E_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(A2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(A2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(A2_ID, A_ID, E_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(A2_ID, A_ID, E_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(B1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(B1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(B1_ID, B_ID, E_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(B1_ID, B_ID, E_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(B2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(B2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(B2_ID, B_ID, E_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(B2_ID, B_ID, E_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(B_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(B_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(B_ID, E_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(E_ID, List.of(B_ID, E_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(F_ID, List.of()); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(F_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(F_ID, List.of(A1_ID, F_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(F_ID, List.of(A1_ID, F_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(G_ID, List.of()); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(G_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(G_ID, List.of(A1_ID, F_ID, G_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(G_ID, List.of(A1_ID, F_ID, G_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(H_ID, List.of()); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(H_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(H_ID, List.of(A1_ID, F_ID, H_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(H_ID, List.of(A1_ID, F_ID, H_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(I_ID, List.of()); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(I_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(I_ID, - List.of(A1_ID, F_ID, G_ID, I_ID)); + List.of(A1_ID, F_ID, G_ID, I_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(J_ID, List.of()); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(J_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(J_ID, List.of(A1_ID, J_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(J_ID, List.of(A1_ID, J_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(K_ID, List.of()); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(K_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(K_ID, List.of(A1_ID, J_ID, K_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(K_ID, List.of(A1_ID, J_ID, K_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(L_ID, List.of()); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(L_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(L_ID, - List.of(A1_ID, J_ID, K_ID, L_ID)); + List.of(A1_ID, J_ID, K_ID, L_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(N1_ID, List.of()); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(N1_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(N1_ID, List.of(A1_ID, F_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(N1_ID, List.of(A1_ID, F_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(N2_ID, List.of()); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(N2_ID, List.of(), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(N2_ID, List.of(A1_ID, F_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(N2_ID, List.of(A1_ID, F_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; //== - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(A_ID, E_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(A_ID, E_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(A_ID, E_ID, M_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(A_ID, E_ID, M_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(C_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(C_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(C_ID, D_ID, M_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(C_ID, D_ID, M_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(A_ID, D_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(A_ID, D_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(A_ID, D_ID, M_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(A_ID, D_ID, M_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(B_ID, D_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(B_ID, D_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(B_ID, D_ID, M_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(B_ID, D_ID, M_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(N1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(N1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(N1_ID, M_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(N1_ID, M_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(A1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(A1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, - List.of(A1_ID, A_ID, E_ID, M_ID)); + List.of(A1_ID, A_ID, E_ID, M_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(A2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(A2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, - List.of(A2_ID, A_ID, E_ID, M_ID)); + List.of(A2_ID, A_ID, E_ID, M_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(B1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(B1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, - List.of(B1_ID, B_ID, E_ID, M_ID)); + List.of(B1_ID, B_ID, E_ID, M_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(B2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(B2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, - List.of(B2_ID, B_ID, E_ID, M_ID)); + List.of(B2_ID, B_ID, E_ID, M_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(B_ID, E_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(B_ID, E_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(B_ID, E_ID, M_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(B_ID, E_ID, M_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(N2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(N2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(N2_ID, M_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(M_ID, List.of(N2_ID, M_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; //== - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(A_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(A_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(A_ID, O1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(A_ID, O1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(B_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(B_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(B_ID, O1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(B_ID, O1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(A1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(A1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = - (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(A1_ID, A_ID, O1_ID)); + (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(A1_ID, A_ID, O1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(A2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(A2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = - (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(A2_ID, A_ID, O1_ID)); + (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(A2_ID, A_ID, O1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(B1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(B1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = - (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(B1_ID, B_ID, O1_ID)); + (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(B1_ID, B_ID, O1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(B2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(B2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = - (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(B2_ID, B_ID, O1_ID)); + (ProgramVirtualFunctionTable) mVxtManager32.findVft(O1_ID, List.of(B2_ID, B_ID, O1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; //== - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(A_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(A_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(A_ID, O2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(A_ID, O2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(A1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(A1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = - (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(A1_ID, A_ID, O2_ID)); + (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(A1_ID, A_ID, O2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(A2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(A2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = - (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(A2_ID, A_ID, O2_ID)); + (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(A2_ID, A_ID, O2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(B1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(B1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = - (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(B1_ID, B_ID, O2_ID)); + (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(B1_ID, B_ID, O2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(B2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(B2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = - (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(B2_ID, B_ID, O2_ID)); + (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(B2_ID, B_ID, O2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(B_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(B_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(B_ID, O2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O2_ID, List.of(B_ID, O2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; //== - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(A_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(A_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(A_ID, O3_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(A_ID, O3_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(B_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(B_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(B_ID, O3_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(B_ID, O3_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(A1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(A1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = - (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(A1_ID, A_ID, O3_ID)); + (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(A1_ID, A_ID, O3_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(A2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(A2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = - (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(A2_ID, A_ID, O3_ID)); + (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(A2_ID, A_ID, O3_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(B1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(B1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = - (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(B1_ID, B_ID, O3_ID)); + (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(B1_ID, B_ID, O3_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(B2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(B2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = - (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(B2_ID, B_ID, O3_ID)); + (ProgramVirtualFunctionTable) mVxtManager32.findVft(O3_ID, List.of(B2_ID, B_ID, O3_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; //== - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(A_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(A_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(A_ID, O4_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(A_ID, O4_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(A1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(A1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = - (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(A1_ID, A_ID, O4_ID)); + (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(A1_ID, A_ID, O4_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(A2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(A2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = - (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(A2_ID, A_ID, O4_ID)); + (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(A2_ID, A_ID, O4_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(B1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(B1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = - (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(B1_ID, B_ID, O4_ID)); + (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(B1_ID, B_ID, O4_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(B2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(B2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = - (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(B2_ID, B_ID, O4_ID)); + (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(B2_ID, B_ID, O4_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(B_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(B_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(B_ID, O4_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O4_ID, List.of(B_ID, O4_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; //== - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(A_ID, O1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(A_ID, O1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(A_ID, O1_ID, O_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(A_ID, O1_ID, O_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(B_ID, O1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(B_ID, O1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(B_ID, O1_ID, O_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(B_ID, O1_ID, O_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(A_ID, O2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(A_ID, O2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(A_ID, O2_ID, O_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(A_ID, O2_ID, O_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(A1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(A1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, - List.of(A1_ID, A_ID, O1_ID, O_ID)); + List.of(A1_ID, A_ID, O1_ID, O_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(A2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(A2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, - List.of(A2_ID, A_ID, O1_ID, O_ID)); + List.of(A2_ID, A_ID, O1_ID, O_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(B1_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(B1_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, - List.of(B1_ID, B_ID, O1_ID, O_ID)); + List.of(B1_ID, B_ID, O1_ID, O_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(B2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(B2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, - List.of(B2_ID, B_ID, O1_ID, O_ID)); + List.of(B2_ID, B_ID, O1_ID, O_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(B_ID, O2_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(B_ID, O2_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(B_ID, O2_ID, O_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(B_ID, O2_ID, O_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(A_ID, O3_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(A_ID, O3_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(A_ID, O3_ID, O_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(A_ID, O3_ID, O_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(B_ID, O3_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(B_ID, O3_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(B_ID, O3_ID, O_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(B_ID, O3_ID, O_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2; - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(A_ID, O4_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(A_ID, O4_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); - vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(A_ID, O4_ID, O_ID)); + vft = (ProgramVirtualFunctionTable) mVxtManager32.findVft(O_ID, List.of(A_ID, O4_ID, O_ID), null); assertEquals(addresses32.get(addressIndex), vft.getAddress()); addressIndex += 2;