// Fix the inner type of containers (that is, make it work smoothly with AddSymbol) // by prefixing it with the module except for well-known types like STL/Qt types static inline std::string fixInnerType(std::string type, const SymbolGroupValue &container) { std::string stripped = SymbolGroupValue::stripConst(SymbolGroupValue::stripClassPrefixes(type)); // Unfortunately the cdb can not handle the vc exclusiv 64 bit integer // "__int64" but works fine with "int64", so we have to strip down "__" const size_t __int64pos = stripped.find("__int64"); if (__int64pos != std::string::npos) stripped.erase(__int64pos, 2); const KnownType kt = knownType(stripped, 0); // Resolve types unless they are POD or pointers to POD (that is, qualify 'Foo' and 'Foo*') const bool needResolve = kt == KT_Unknown || kt == KT_PointerType || !(kt & KT_POD_Type); const std::string fixed = needResolve ? SymbolGroupValue::resolveType(stripped, container.context(), container.module()) : stripped; if (SymbolGroupValue::verbose) { DebugPrint dp; dp << "fixInnerType (resolved=" << needResolve << ") '" << type << "' ["; formatKnownTypeFlags(dp, kt); dp << "] -> '" << fixed <<"'\n"; } return fixed; }
int PyType::code() const { if (!m_resolved) return TypeCodeUnresolvable; if (m_tag < 0) { // try to parse typeName const std::string &typeName = name(); if (typeName.empty()) return TypeCodeUnresolvable; if (isPointerType(typeName)) return TypeCodePointer; if (isArrayType(typeName)) return TypeCodeArray; if (typeName.find("<function>") == 0) return TypeCodeFunction; if (isIntegralType(typeName)) return TypeCodeIntegral; if (isFloatType(typeName)) return TypeCodeFloat; IDebugSymbolGroup2 *sg = 0; if (FAILED(ExtensionCommandContext::instance()->symbols()->CreateSymbolGroup2(&sg))) return TypeCodeStruct; if (knownType(name(), 0) != KT_Unknown) return TypeCodeStruct; const std::string helperValueName = SymbolGroupValue::pointedToSymbolName(0, name(true)); ULONG index = DEBUG_ANY_ID; if (SUCCEEDED(sg->AddSymbol(helperValueName.c_str(), &index))) m_tag = PyValue(index, sg).tag(); sg->Release(); } switch (m_tag) { case SymTagUDT: return TypeCodeStruct; case SymTagEnum: return TypeCodeEnum; case SymTagTypedef: return TypeCodeTypedef; case SymTagFunctionType: return TypeCodeFunction; case SymTagPointerType: return TypeCodePointer; case SymTagArrayType: return TypeCodeArray; case SymTagBaseType: return isIntegralType(name()) ? TypeCodeIntegral : TypeCodeFloat; default: break; } return TypeCodeStruct; }
// Fix the inner type of containers (that is, make it work smoothly with AddSymbol) // by prefixing it with the module except for well-known types like STL/Qt types static inline std::string fixInnerType(std::string type, const SymbolGroupValue &container) { const std::string stripped = SymbolGroupValue::stripConst(SymbolGroupValue::stripClassPrefixes(type)); const KnownType kt = knownType(stripped, 0); // Resolve types unless they are POD or pointers to POD (that is, qualify 'Foo' and 'Foo*') const bool needResolve = kt == KT_Unknown || kt == KT_PointerType || !(kt & KT_POD_Type); const std::string fixed = needResolve ? SymbolGroupValue::resolveType(stripped, container.context(), container.module()) : stripped; if (SymbolGroupValue::verbose) { DebugPrint dp; dp << "fixInnerType (resolved=" << needResolve << ") '" << type << "' ["; formatKnownTypeFlags(dp, kt); dp << "] -> '" << fixed <<"'\n"; } return fixed; }