PyType PyType::lookupType(const std::string &typeNameIn, ULONG64 module) { if (debuggingTypeEnabled()) DebugPrint() << "lookup type '" << typeNameIn << "'"; std::string typeName = typeNameIn; trimBack(typeName); trimFront(typeName); if (isPointerType(typeName) || isArrayType(typeName)) return PyType(0, 0, typeName); if (typeName.find("enum ") == 0) typeName.erase(0, 5); if (endsWith(typeName, " const")) typeName.erase(typeName.length() - 6); if (typeName == "__int64" || typeName == "unsigned __int64") typeName.erase(typeName.find("__"), 2); const static std::regex typeNameRE("^[a-zA-Z_][a-zA-Z0-9_]*!?[a-zA-Z0-9_<>:, \\*\\&\\[\\]]*$"); if (!std::regex_match(typeName, typeNameRE)) return PyType(); CIDebugSymbols *symbols = ExtensionCommandContext::instance()->symbols(); ULONG typeId; HRESULT result = S_FALSE; if (module != 0 && !isIntegralType(typeName) && !isFloatType(typeName)) result = symbols->GetTypeId(module, typeName.c_str(), &typeId); if (FAILED(result) || result == S_FALSE) result = symbols->GetSymbolTypeId(typeName.c_str(), &typeId, &module); if (FAILED(result)) return createUnresolvedType(typeName); return PyType(module, typeId, typeName); }