private static DemangledObject processObjectCPP(MDObjectCPP objectCPP, String mangled,
			String demangledSource) {
		MDTypeInfo typeinfo = objectCPP.getTypeInfo();
		DemangledObject result = null;
		if (typeinfo != null) {
			if (typeinfo instanceof MDVariableInfo) {
				DemangledVariable variable;
				MDVariableInfo variableInfo = (MDVariableInfo) typeinfo;
				MDType mdtype = variableInfo.getMDType();
				DemangledDataType dt =
					processDataType(null, (MDDataType) mdtype, mangled, demangledSource);
				if ("std::nullptr_t".equals(dt.getName())) {
					variable = new DemangledVariable(mangled, demangledSource, "");
				}
				else {
					variable =
						new DemangledVariable(mangled, demangledSource, objectCPP.getName());
					variable.setNamespace(
						processNamespace(objectCPP.getQualification(), mangled, demangledSource));
				}
				variable.setDatatype(dt);
				result = variable;
				variable.setConst(variableInfo.isConst());
				variable.setVolatile(variableInfo.isVolatile());
				variable.setPointer64(variableInfo.isPointer64());
				if (variableInfo.isRestrict()) {
					variable.setRestrict();
				}
				if (variableInfo.isUnaligned()) {
					variable.setUnaligned();
				}
				variable.setBasedName(variableInfo.getBasedName());
				if (variableInfo.isMember()) {
					variable.setMemberScope(variableInfo.getMemberScope());
				}
			}
			else if (typeinfo instanceof MDFunctionInfo) {
				if (typeinfo.getSpecialHandlingCode() == 'F') {
					result = new DemangledUnknown(mangled, demangledSource, null);
				}
				else {
					DemangledFunction function =
						new DemangledFunction(mangled, demangledSource, objectCPP.getName());
					function.setSignatureSourceType(SourceType.IMPORTED);
					function.setNamespace(
						processNamespace(objectCPP.getQualification(), mangled, demangledSource));
					result = function;
					processFunction((MDFunctionInfo) typeinfo, function, mangled,
						demangledSource);
					// Any other special values to be set?
					if (typeinfo instanceof MDMemberFunctionInfo) {
						if (typeinfo instanceof MDVCall) {
							// Empty for now--placeholder for possible future logic.
						}
						else if (typeinfo instanceof MDVFAdjustor) {
							// Empty for now--placeholder for possible future logic.
						}
						else if (typeinfo instanceof MDVtordisp) {
							// Empty for now--placeholder for possible future logic.
						}
						else if (typeinfo instanceof MDVtordispex) {
							// Empty for now--placeholder for possible future logic.
						}
						else {
							// plain member function
						}
					}
					else {
						// global function
					}
				}
			}
			else if (typeinfo instanceof MDVxTable) { //Includes VFTable, VBTable, and RTTI4
				MDVxTable vxtable = (MDVxTable) typeinfo;
				DemangledVariable variable =
					new DemangledVariable(mangled, demangledSource, objectCPP.getName());
				variable.setNamespace(
					processNamespace(objectCPP.getQualification(), mangled, demangledSource));
				variable.setConst(vxtable.isConst());
				variable.setVolatile(vxtable.isVolatile());
				variable.setPointer64(vxtable.isPointer64());
				result = variable;
				// The following code would be an alternative, depending on whether we get
				//  customer complaints or other fall-out from having created a variable here.
				//resultObject = new DemangledUnknown();
			}
			else if (typeinfo instanceof AbstractMDMetaClass) { //Includes all RTTI, except RTTI4
				DemangledVariable variable =
					new DemangledVariable(mangled, demangledSource, objectCPP.getName());
				variable.setNamespace(
					processNamespace(objectCPP.getQualification(), mangled, demangledSource));
				result = variable;
				// The following code would be an alternative, depending on whether we get
				//  customer complaints or other fall-out from having created a variable here.
				//resultObject = new DemangledUnknown();
			}
			else if (typeinfo instanceof MDGuard) {
				DemangledVariable variable =
					new DemangledVariable(mangled, demangledSource, objectCPP.getName());
				variable.setNamespace(
					processNamespace(objectCPP.getQualification(), mangled, demangledSource));
				result = variable;
				// The following code would be an alternative, depending on whether we get
				//  customer complaints or other fall-out from having created a variable here.
				//resultObject = new DemangledUnknown();
			}
			else {
				// Any others (e.g., case '9')
				DemangledVariable variable =
					new DemangledVariable(mangled, demangledSource, objectCPP.getName());
				variable.setNamespace(
					processNamespace(objectCPP.getQualification(), mangled, demangledSource));
				result = variable;
				// The following code would be an alternative, depending on whether we get
				//  customer complaints or other fall-out from having created a variable here.
				//resultObject = new DemangledUnknown();
			}
			if (typeinfo.isPrivate()) {
				result.setVisibilty("private");
			}
			else if (typeinfo.isProtected()) {
				result.setVisibilty("protected");
			}
			else if (typeinfo.isPublic()) {
				result.setVisibilty("public");
			}
			result.setStatic(typeinfo.isStatic());
			result.setVirtual(typeinfo.isVirtual());
			result.setThunk(typeinfo.isThunk());
			if (typeinfo.isExternC()) {
				result.setSpecialPrefix("extern \"C\"");
			}
		}
		else {
			String baseName = objectCPP.getName();
			if (objectCPP.isString()) {
				MDString mstring = objectCPP.getMDString();
				DemangledString demangledString =
					new DemangledString(mangled, demangledSource, mstring.getName(),
						mstring.toString(), mstring.getLength(), mstring.isUnicode());
				result = demangledString;
			}
			else if (baseName.length() != 0) {
				DemangledVariable variable;
				variable = new DemangledVariable(mangled, demangledSource, baseName);
				variable.setNamespace(
					processNamespace(objectCPP.getQualification(), mangled, demangledSource));
				result = variable;
			}
		}
		return result;
		// //Various RTTI types (MDType '8' or '9')
		// DemangledVariable variable =
		// new
		// DemangledVariable(objectCPP.getQualifiedName().getBasicName().toString());
		// variable.setNamespace(processNamespace(objectCPP.getQualifiedName()));
		// return variable;
		// TODO: fill in lots of object.____ items
		// object.setVisibilty(typeinfo.g);
		// object.setConst(isConst);
	}
Method to convert an {@link MDDataType} into a {@link DemangledDataType}.  Demangler
needs to have already run to process the type before calling this method
@param type the type to convert
@param mangled the mangled string
@param originalDemangled the original demangled string
@return the result
Ghidra/Features/MicrosoftDemangler/src/main/java/ghidra/app/util/demangler/microsoft/MicrosoftDemanglerUtil.java