protected void updateClassWithVftable(RecoveredClass recoveredClass, Symbol vftableSymbol,
			boolean allowNullFunctionPtrs, boolean allowDefaultRefsInMiddle) throws Exception {

		// get only the functions from the ones that are not already processed
		// structures
		// return null if not an unprocessed table
		Address vftableAddress = vftableSymbol.getAddress();
		Namespace vftableNamespace = vftableSymbol.getParentNamespace();

		List<Function> virtualFunctions = getFunctionsFromVftable(vftableAddress, vftableSymbol,
			allowNullFunctionPtrs, allowDefaultRefsInMiddle);

		// the vftable has already been processed or is invalid - skip it
		if (virtualFunctions == null) {
			return;
		}

		// Check to see if already have an existing RecoveredClass object for the
		// class associated with the current vftable.
		recoveredClass = getClass(vftableNamespace);

		if (recoveredClass == null) {
			// Create a RecoveredClass object for the current class
			recoveredClass = createNewClass(vftableNamespace, true);
			recoveredClass.addVftableAddress(vftableAddress);
			recoveredClass.addVftableVfunctionsMapping(vftableAddress, virtualFunctions);

		}
		else {
			recoveredClass.addVftableAddress(vftableAddress);
			recoveredClass.addVftableVfunctionsMapping(vftableAddress, virtualFunctions);

		}

		// add it to the vftableAddress to Class map
		updateVftableToClassMap(vftableAddress, recoveredClass);

		List<Address> referencesToVftable = getReferencesToVftable(vftableAddress);
		addReferenceToVtableMapping(referencesToVftable, vftableAddress);

		Map<Address, Function> vftableReferenceToFunctionMapping =
			createVftableReferenceToFunctionMapping(referencesToVftable);

		// vftableReferenceToFunctionMapping
		List<Function> possibleConstructorDestructorsForThisClass =
			findPossibleConstructorDestructors(vftableReferenceToFunctionMapping);

		addFunctionsToClassMapping(possibleConstructorDestructorsForThisClass, recoveredClass);

		// add the vftable reference to function mapping to the global list
		addFunctionToVftableReferencesMapping(vftableReferenceToFunctionMapping);

		// add the possible constructor/destructor list to the class
		recoveredClass.addConstructorDestructorList(possibleConstructorDestructorsForThisClass);
		recoveredClass.addIndeterminateConstructorOrDestructorList(
			possibleConstructorDestructorsForThisClass);

		// } // end of looping over vfTables
	}
Method to recover the class information for each vftable symbol on the list
* For each virtual function table:
1. get vftable's existing class
2. create matching data type category folder in dt manager
3. get list of virtual functions
4. create RecoveredClass object for the vftable class
5. add mapping from vftableAddress to class
6. add list of const/dest functions to RecoveredClass object
7. update list of all const/dest functions in currenetProgram
8. set RecoveredClass indeterminate list to const/dest list
9. update list of all indeterminate const/dest
@param vftableSymbolList List of vftable symbols
@param allowNullFunctionPtrs if true, allow existance of null pointers in vftable
@param allowDefaultRefsInMiddle if true, allow existance of default refs into the middle of a vftable
@return List of RecoveredClass objects created corresponding to the vftable symbols
@throws CancelledException if cancelled
@throws Exception if issues getting data
Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RecoveredClassHelper.java