diff options
author | Friedemann Kleint <[email protected]> | 2009-07-07 16:00:45 +0200 |
---|---|---|
committer | Friedemann Kleint <[email protected]> | 2009-07-07 16:00:45 +0200 |
commit | 7b15d123008dc8b5f860307e0188dc777d8c797d (patch) | |
tree | f6df43d233fe23486f636f0464841d779da18755 /src/plugins/debugger/watchutils.cpp | |
parent | e2a06db32e6c5bd02265021b9ad1da798f0b7d20 (diff) |
Dumper fixing, dump some common std::map, std::set types with CDB.
- std::set/map: Introduce templates to iterate the MSVC STL
implementation depending on type (since it inherits some
basic set_traits that depend on the key/value size.
- Retrieve types correctly in CDB (buffer too short for STL-types)
- Fix std::map in GDB broken by previous commit.
- Introduce a dumper version check in GDB/CDB.
- Make GDB parse sizes in initial dumper call as well
- Fix special sizes to work with namespaced Qt (watchutils)
Diffstat (limited to 'src/plugins/debugger/watchutils.cpp')
-rw-r--r-- | src/plugins/debugger/watchutils.cpp | 71 |
1 files changed, 56 insertions, 15 deletions
diff --git a/src/plugins/debugger/watchutils.cpp b/src/plugins/debugger/watchutils.cpp index 555b6ac6cd4..b82d54e75e1 100644 --- a/src/plugins/debugger/watchutils.cpp +++ b/src/plugins/debugger/watchutils.cpp @@ -638,20 +638,30 @@ void QtDumperHelper::TypeData::clear() // ----------------- QtDumperHelper QtDumperHelper::QtDumperHelper() : - m_qtVersion(0) + m_qtVersion(0), + m_dumperVersion(1.0) { qFill(m_specialSizes, m_specialSizes + SpecialSizeCount, 0); + setQClassPrefixes(QString()); } void QtDumperHelper::clear() { m_nameTypeMap.clear(); m_qtVersion = 0; + m_dumperVersion = 1.0; m_qtNamespace.clear(); m_sizeCache.clear(); qFill(m_specialSizes, m_specialSizes + SpecialSizeCount, 0); m_expressionCache.clear(); - m_dumperVersion.clear(); + setQClassPrefixes(QString()); +} + +QString QtDumperHelper::msgDumperOutdated(double requiredVersion, double currentVersion) +{ + return QCoreApplication::translate("QtDumperHelper", + "Found a too-old version of the debugging helper library (%1); version %2 is required."). + arg(currentVersion).arg(requiredVersion); } static inline void formatQtVersion(int v, QTextStream &str) @@ -685,7 +695,7 @@ QString QtDumperHelper::toString(bool debug) const return QCoreApplication::translate("QtDumperHelper", "%n known types, Qt version: %1, Qt namespace: %2 Dumper version: %3", 0, QCoreApplication::CodecForTr, - m_nameTypeMap.size()).arg(qtVersionString(), nameSpace, m_dumperVersion); + m_nameTypeMap.size()).arg(qtVersionString(), nameSpace).arg(m_dumperVersion); } QtDumperHelper::Type QtDumperHelper::simpleType(const QString &simpleType) const @@ -774,11 +784,11 @@ QtDumperHelper::ExpressionRequirement QtDumperHelper::expressionRequirements(Typ switch (t) { case QAbstractItemType: case QVectorType: - case StdMapType: return NeedsComplexExpression; case QMapType: case QMultiMapType: case QMapNodeType: + case StdMapType: return NeedsCachedExpression; default: // QObjectSlotType, QObjectSignalType need the signal number, which is numeric @@ -1130,6 +1140,25 @@ bool QueryDumperParser::handleValue(const char *k, int size) return true; } +static inline QString qClassName(const QString &qtNamespace, const char *className) +{ + if (qtNamespace.isEmpty()) + return QString::fromAscii(className); + QString rc = qtNamespace; + rc += QLatin1String("::"); + rc += QString::fromAscii(className); + return rc; +} + +void QtDumperHelper::setQClassPrefixes(const QString &qNamespace) +{ + // Prefixes with namespaces + m_qPointerPrefix = qClassName(qNamespace, "QPointer"); + m_qSharedPointerPrefix = qClassName(qNamespace, "QSharedPointer"); + m_qSharedDataPointerPrefix = qClassName(qNamespace, "QSharedDataPointer"); + m_qWeakPointerPrefix = qClassName(qNamespace, "QWeakPointer"); +} + // parse a query bool QtDumperHelper::parseQuery(const char *data, Debugger debugger) { @@ -1139,14 +1168,27 @@ bool QtDumperHelper::parseQuery(const char *data, Debugger debugger) clear(); m_qtNamespace = parser.data().qtNameSpace; setQtVersion(parser.data().qtVersion); + setQClassPrefixes(m_qtNamespace); parseQueryTypes(parser.data().types, debugger); foreach (const QueryDumperParser::SizeEntry &se, parser.data().sizes) addSize(se.first, se.second); m_expressionCache = parser.data().expressionCache; - m_dumperVersion = parser.data().dumperVersion; + // Version + if (!parser.data().dumperVersion.isEmpty()) { + double dumperVersion; + bool ok; + dumperVersion = parser.data().dumperVersion.toDouble(&ok); + if (ok) + m_dumperVersion = dumperVersion; + } return true; } +void QtDumperHelper::addExpression(const QString &expression, const QString &value) +{ + m_expressionCache.insert(expression, value); +} + void QtDumperHelper::addSize(const QString &name, int size) { // Special interest cases @@ -1219,27 +1261,23 @@ QString QtDumperHelper::evaluationSizeofTypeExpression(const QString &typeName, return sizeofTypeExpression(typeName); } -QtDumperHelper::SpecialSizeType QtDumperHelper::specialSizeType(const QString &typeName) +QtDumperHelper::SpecialSizeType QtDumperHelper::specialSizeType(const QString &typeName) const { if (isPointerType(typeName)) return PointerSize; static const QString intType = QLatin1String("int"); static const QString stdAllocatorPrefix = QLatin1String("std::allocator"); - static const QString qPointerPrefix = QLatin1String("QPointer"); - static const QString qSharedPointerPrefix = QLatin1String("QSharedPointer"); - static const QString qSharedDataPointerPrefix = QLatin1String("QSharedDataPointer"); - static const QString qWeakPointerPrefix = QLatin1String("QWeakPointer"); if (typeName == intType) return IntSize; if (typeName.startsWith(stdAllocatorPrefix)) return StdAllocatorSize; - if (typeName.startsWith(qPointerPrefix)) + if (typeName.startsWith(m_qPointerPrefix)) return QPointerSize; - if (typeName.startsWith(qSharedPointerPrefix)) + if (typeName.startsWith(m_qSharedPointerPrefix)) return QSharedPointerSize; - if (typeName.startsWith(qSharedDataPointerPrefix)) + if (typeName.startsWith(m_qSharedDataPointerPrefix)) return QSharedDataPointerSize; - if (typeName.startsWith(qWeakPointerPrefix)) + if (typeName.startsWith(m_qWeakPointerPrefix)) return QWeakPointerSize; return SpecialSizeCount; } @@ -1374,7 +1412,10 @@ void QtDumperHelper::evaluationParameters(const WatchData &data, int bracketPos = pairType.indexOf(QLatin1Char('<')); if (bracketPos != -1) pairType.remove(0, bracketPos + 1); - bracketPos = pairType.indexOf(QLatin1Char('>')); + const QChar closingBracket = QLatin1Char('>'); + bracketPos = pairType.lastIndexOf(closingBracket); + if (bracketPos != -1) + bracketPos = pairType.lastIndexOf(closingBracket, bracketPos - pairType.size() - 1); if (bracketPos != -1) pairType.truncate(bracketPos + 1); extraArgs[2] = QLatin1String("(size_t)&(('"); |