From efed3fd7cf9f28f24fdb7055de8c65c1a95e6409 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint <Friedemann.Kleint@nokia.com> Date: Wed, 23 Mar 2011 14:55:02 +0100 Subject: [PATCH] Debugger[CDB]: Add a dumper for QSharedPointer. As the structure is quite deeply nested. --- src/libs/qtcreatorcdbext/knowntype.h | 1 + src/libs/qtcreatorcdbext/symbolgroupvalue.cpp | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/libs/qtcreatorcdbext/knowntype.h b/src/libs/qtcreatorcdbext/knowntype.h index a4df0313be8..0572c974e67 100644 --- a/src/libs/qtcreatorcdbext/knowntype.h +++ b/src/libs/qtcreatorcdbext/knowntype.h @@ -76,6 +76,7 @@ enum KnownType KT_QAtomicInt = KT_Qt_Type + KT_HasSimpleDumper + 19, KT_QObject = KT_Qt_Type + KT_HasSimpleDumper + KT_HasComplexDumper + 20, KT_QWidget = KT_Qt_Type + KT_HasSimpleDumper + KT_HasComplexDumper + 21, + KT_QSharedPointer = KT_Qt_Type + KT_HasSimpleDumper + KT_HasComplexDumper + 22, // Types: Various QT movable types KT_QPen = KT_Qt_Type + KT_Qt_MovableType + 30, KT_QUrl = KT_Qt_Type + KT_Qt_MovableType + 31, diff --git a/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp b/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp index 4f4e3cfade4..09df78028ce 100644 --- a/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp +++ b/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp @@ -939,6 +939,10 @@ static KnownType knownClassTypeHelper(const std::string &type, if (!type.compare(qPos, 11, "QLinkedList")) return KT_QLinkedList; break; + case 14: + if (!type.compare(qPos, 14, "QSharedPointer")) + return KT_QSharedPointer; + break; } } // Remaining non-template types @@ -1688,6 +1692,29 @@ static bool dumpQVariant(const SymbolGroupValue &v, std::wostream &str, void **s return true; } +// Dump a qsharedpointer (just list reference counts) +static inline bool dumpQSharedPointer(const SymbolGroupValue &v, std::wostream &str, void **specialInfoIn = 0) +{ + const SymbolGroupValue externalRefCountV = v[unsigned(0)]; + if (!externalRefCountV) + return false; + const SymbolGroupValue dV = externalRefCountV["d"]; + if (!dV) + return false; + // Get value element from base and store in special info. + const SymbolGroupValue valueV = externalRefCountV[unsigned(0)]["value"]; + if (!valueV) + return false; + // Format references. + const int strongRef = dV["strongref"]["_q_value"].intValue(); + const int weakRef = dV["weakref"]["_q_value"].intValue(); + if (strongRef < 0 || weakRef < 0) + return false; + str << L"References: " << strongRef << '/' << weakRef; + *specialInfoIn = valueV.node(); + return true; +} + // Dump builtin simple types using SymbolGroupValue expressions. unsigned dumpSimpleType(SymbolGroupNode *n, const SymbolGroupValueContext &ctx, std::wstring *s, int *knownTypeIn /* = 0 */, @@ -1792,6 +1819,9 @@ unsigned dumpSimpleType(SymbolGroupNode *n, const SymbolGroupValueContext &ctx, case KT_QWidget: rc = dumpQWidget(v, str, specialInfoIn) ? SymbolGroupNode::SimpleDumperOk : SymbolGroupNode::SimpleDumperFailed; break; + case KT_QSharedPointer: + rc = dumpQSharedPointer(v, str, specialInfoIn) ? SymbolGroupNode::SimpleDumperOk : SymbolGroupNode::SimpleDumperFailed; + break; case KT_StdString: case KT_StdWString: rc = dumpStd_W_String(v, str) ? SymbolGroupNode::SimpleDumperOk : SymbolGroupNode::SimpleDumperFailed; @@ -1863,6 +1893,11 @@ std::vector<AbstractSymbolGroupNode *> SymbolGroupNode *containerNode = reinterpret_cast<SymbolGroupNode *>(specialInfo); rc.push_back(new ReferenceSymbolGroupNode("children", "children", containerNode)); } + case KT_QSharedPointer: // Special info by simple dumper is the value + if (specialInfo) { + SymbolGroupNode *valueNode = reinterpret_cast<SymbolGroupNode *>(specialInfo); + rc.push_back(new ReferenceSymbolGroupNode("value", "value", valueNode)); + } break; default: break; -- GitLab