diff --git a/share/qtcreator/gdbmacros/gdbmacros.cpp b/share/qtcreator/gdbmacros/gdbmacros.cpp index ba607ecb9877c06c252d41182df0afbfae796909..9e3ce85c2451299c92e25f54546606d0064b4f62 100644 --- a/share/qtcreator/gdbmacros/gdbmacros.cpp +++ b/share/qtcreator/gdbmacros/gdbmacros.cpp @@ -375,7 +375,6 @@ static bool isSimpleType(const char *type) return false; } -#if 0 static bool isStringType(const char *type) { return isEqual(type, NS"QString") @@ -384,7 +383,6 @@ static bool isStringType(const char *type) || isEqual(type, "std::wstring") || isEqual(type, "wstring"); } -#endif static bool isMovableType(const char *type) { @@ -502,7 +500,7 @@ struct QDumper void beginHash(); // start of data hash output void endHash(); // start of data hash output - void beginChildren(); // start of children list + void beginChildren(const char *mainInnerType = 0); // start of children list void endChildren(); // end of children list void beginItem(const char *name); // start of named item, ready to accept value @@ -775,8 +773,16 @@ void QDumper::endItem() put('"'); } -void QDumper::beginChildren() +void QDumper::beginChildren(const char *mainInnerType) { + if (mainInnerType) { + putItem("childtype", mainInnerType); + if (isSimpleType(mainInnerType) || isStringType(mainInnerType)) + putItem("childnumchild", "0"); + else if (isPointerType(mainInnerType)) + putItem("childnumchild", "1"); + } + putCommaIfNeeded(); put("children=["); } @@ -867,7 +873,7 @@ static void qDumpUnknown(QDumper &d, const char *why = 0) d.disarm(); } -static inline void dumpStdStringValue(QDumper &d, const std::string &str) +static void qDumpStdStringValue(QDumper &d, const std::string &str) { d.beginItem("value"); d.putBase64Encoded(str.c_str(), str.size()); @@ -877,7 +883,7 @@ static inline void dumpStdStringValue(QDumper &d, const std::string &str) d.putItem("numchild", "0"); } -static inline void dumpStdWStringValue(QDumper &d, const std::wstring &str) +static void qDumpStdWStringValue(QDumper &d, const std::wstring &str) { d.beginItem("value"); d.putBase64Encoded((const char *)str.c_str(), str.size() * sizeof(wchar_t)); @@ -887,30 +893,6 @@ static inline void dumpStdWStringValue(QDumper &d, const std::wstring &str) d.putItem("numchild", "0"); } -// Tell the calling routine whether a global "childnumchild" attribute makes sense -enum InnerValueResult -{ - InnerValueNotHandled, - InnerValueChildrenSpecified, - InnerValueNoFurtherChildren, - InnerValueFurtherChildren -}; - -static inline void dumpChildNumChildren(QDumper &d, InnerValueResult innerValueResult) -{ - switch (innerValueResult) { - case InnerValueChildrenSpecified: - case InnerValueNotHandled: - break; - case InnerValueNoFurtherChildren: - d.putItem("childnumchild", "0"); - break; - case InnerValueFurtherChildren: - d.putItem("childnumchild", "1"); - break; - } -} - // Called by templates, so, not static. static void qDumpInnerQCharValue(QDumper &d, QChar c, const char *field) { @@ -934,43 +916,31 @@ static void qDumpInnerCharValue(QDumper &d, char c, const char *field) d.putItem("numchild", 0); } -InnerValueResult qDumpInnerValueHelper(QDumper &d, const char *type, const void *addr, +void qDumpInnerValueHelper(QDumper &d, const char *type, const void *addr, const char *field = "value") { type = stripNamespace(type); switch (type[1]) { case 'h': - if (isEqual(type, "char")) { + if (isEqual(type, "char")) qDumpInnerCharValue(d, *(char *)addr, field); - return InnerValueNoFurtherChildren; - } - return InnerValueNotHandled; + break; case 'l': if (isEqual(type, "float")) - { d.putItem(field, *(float*)addr); return InnerValueNoFurtherChildren; } - return InnerValueNotHandled; + d.putItem(field, *(float*)addr); + break; case 'n': - if (isEqual(type, "int")) { + if (isEqual(type, "int")) d.putItem(field, *(int*)addr); - return InnerValueNoFurtherChildren; - } - if (isEqual(type, "unsigned") || isEqual(type, "unsigned int")) { + else if (isEqual(type, "unsigned") || isEqual(type, "unsigned int")) d.putItem(field, *(unsigned int*)addr); - return InnerValueNoFurtherChildren; - } - if (isEqual(type, "unsigned char")) { + else if (isEqual(type, "unsigned char")) qDumpInnerCharValue(d, *(char *)addr, field); - return InnerValueNoFurtherChildren; - } - if (isEqual(type, "unsigned long")) { + else if (isEqual(type, "unsigned long")) d.putItem(field, *(unsigned long*)addr); - return InnerValueNoFurtherChildren; - } - if (isEqual(type, "unsigned long long")) { + else if (isEqual(type, "unsigned long long")) d.putItem(field, *(qulonglong*)addr); - return InnerValueNoFurtherChildren; - } - return InnerValueNotHandled; + break; case 'o': if (isEqual(type, "bool")) { switch (*(bool*)addr) { @@ -978,44 +948,32 @@ InnerValueResult qDumpInnerValueHelper(QDumper &d, const char *type, const void case 1: d.putItem(field, "true"); break; default: d.putItem(field, *(bool*)addr); break; } - return InnerValueNoFurtherChildren; - } - if (isEqual(type, "double")) { + } else if (isEqual(type, "double")) d.putItem(field, *(double*)addr); - return InnerValueNoFurtherChildren; - } - if (isEqual(type, "long")) { + else if (isEqual(type, "long")) d.putItem(field, *(long*)addr); - return InnerValueNoFurtherChildren; - } - else if (isEqual(type, "long long")) { + else if (isEqual(type, "long long")) d.putItem(field, *(qulonglong*)addr); - return InnerValueNoFurtherChildren; - } - return InnerValueNotHandled; + break; case 'B': if (isEqual(type, "QByteArray")) { d.putCommaIfNeeded(); d.put(field).put("encoded=\"1\","); d.putItem(field, *(QByteArray*)addr); - return InnerValueFurtherChildren; } - return InnerValueNotHandled; + break; case 'C': - if (isEqual(type, "QChar")) { + if (isEqual(type, "QChar")) qDumpInnerQCharValue(d, *(QChar*)addr, field); - return InnerValueNoFurtherChildren; - } - return InnerValueNotHandled; + break; case 'L': if (startsWith(type, "QList<")) { const QListData *ldata = reinterpret_cast<const QListData*>(addr); d.putItemCount("value", ldata->size()); d.putItem("valuedisabled", "true"); d.putItem("numchild", ldata->size()); - return InnerValueChildrenSpecified; } - return InnerValueNotHandled; + break; case 'O': if (isEqual(type, "QObject *")) { if (addr) { @@ -1026,54 +984,47 @@ InnerValueResult qDumpInnerValueHelper(QDumper &d, const char *type, const void d.putItem("type", NS"QObject"); d.putItem("displayedtype", ob->metaObject()->className()); d.putItem("numchild", 1); - return InnerValueChildrenSpecified; } else { d.putItem("value", "0x0"); d.putItem("type", NS"QObject *"); d.putItem("numchild", 0); - return InnerValueNoFurtherChildren; } } - return InnerValueNotHandled; + break; case 'S': if (isEqual(type, "QString")) { d.putCommaIfNeeded(); d.putItem(field, *(QString*)addr); d.put(',').put(field).put("encoded=\"2\""); - return InnerValueNoFurtherChildren; } - return InnerValueNotHandled; + break; case 't': if (isEqual(type, "std::string") || isEqual(type, stdStringTypeC)) { d.putCommaIfNeeded(); - dumpStdStringValue(d, *reinterpret_cast<const std::string*>(addr)); - return InnerValueNoFurtherChildren; - } - if (isEqual(type, "std::wstring") + qDumpStdStringValue(d, *reinterpret_cast<const std::string*>(addr)); + } else if (isEqual(type, "std::wstring") || isEqual(type, stdWideStringTypeUShortC)) { - dumpStdWStringValue(d, *reinterpret_cast<const std::wstring*>(addr)); - return InnerValueNoFurtherChildren; + qDumpStdWStringValue(d, *reinterpret_cast<const std::wstring*>(addr)); } - return InnerValueNotHandled; + break; default: break; } - return InnerValueNotHandled; } -static InnerValueResult qDumpInnerValue(QDumper &d, const char *type, const void *addr) +static void qDumpInnerValue(QDumper &d, const char *type, const void *addr) { d.putItem("addr", addr); d.putItem("type", type); if (!type[0]) - return InnerValueNotHandled; + return; return qDumpInnerValueHelper(d, type, addr); } -static InnerValueResult qDumpInnerValueOrPointer(QDumper &d, +static void qDumpInnerValueOrPointer(QDumper &d, const char *type, const char *strippedtype, const void *addr) { if (strippedtype) { @@ -1081,17 +1032,18 @@ static InnerValueResult qDumpInnerValueOrPointer(QDumper &d, d.putItem("addr", deref(addr)); d.putItem("saddr", deref(addr)); d.putItem("type", strippedtype); - return qDumpInnerValueHelper(d, strippedtype, deref(addr)); + qDumpInnerValueHelper(d, strippedtype, deref(addr)); + } else { + d.putItem("addr", addr); + d.putItem("type", strippedtype); + d.putItem("value", "<null>"); + d.putItem("numchild", "0"); } + } else { d.putItem("addr", addr); - d.putItem("type", strippedtype); - d.putItem("value", "<null>"); - d.putItem("numchild", "0"); - return InnerValueChildrenSpecified; + d.putItem("type", type); + qDumpInnerValueHelper(d, type, addr); } - d.putItem("addr", addr); - d.putItem("type", type); - return qDumpInnerValueHelper(d, type, addr); } ////////////////////////////////////////////////////////////////////////////// @@ -1647,7 +1599,6 @@ static void qDumpQList(QDumper &d) d.putItem("valuedisabled", "true"); d.putItem("numchild", n); if (d.dumpChildren) { - InnerValueResult innerValueResult = InnerValueChildrenSpecified; unsigned innerSize = d.extraInt[0]; bool innerTypeIsPointer = isPointerType(d.innertype); QByteArray strippedInnerType = stripPointerType(d.innertype); @@ -1659,12 +1610,10 @@ static void qDumpQList(QDumper &d) // So as first approximation only do the 'isLarge' check: bool isInternal = innerSize <= int(sizeof(void*)) && isMovableType(d.innertype); - d.putItem("internal", (int)isInternal); - d.putItem("childtype", d.innertype); if (n > 1000) n = 1000; - d.beginChildren(); + d.beginChildren(n ? d.innertype : 0); for (int i = 0; i != n; ++i) { d.beginHash(); d.putItem("name", i); @@ -1673,7 +1622,7 @@ static void qDumpQList(QDumper &d) d.putItem("saddr", p); if (*(void**)p) { //d.putItem("value","@").put(p); - innerValueResult = qDumpInnerValue(d, strippedInnerType.data(), deref(p)); + qDumpInnerValue(d, strippedInnerType.data(), deref(p)); } else { d.putItem("value", "<null>"); d.putItem("numchild", "0"); @@ -1683,11 +1632,11 @@ static void qDumpQList(QDumper &d) if (isInternal) { //qDumpInnerValue(d, d.innertype, p); d.putItem("addr", p); - innerValueResult = qDumpInnerValueHelper(d, d.innertype, p); + qDumpInnerValueHelper(d, d.innertype, p); } else { //qDumpInnerValue(d, d.innertype, deref(p)); d.putItem("addr", deref(p)); - innerValueResult = qDumpInnerValueHelper(d, d.innertype, deref(p)); + qDumpInnerValueHelper(d, d.innertype, deref(p)); } } d.endHash(); @@ -1695,7 +1644,6 @@ static void qDumpQList(QDumper &d) if (n < nn) d.putEllipsis(); d.endChildren(); - dumpChildNumChildren(d, innerValueResult); } d.disarm(); } @@ -1714,7 +1662,6 @@ static void qDumpQLinkedList(QDumper &d) d.putItemCount("value", n); d.putItem("valuedisabled", "true"); d.putItem("numchild", n); - InnerValueResult innerValueResult = InnerValueChildrenSpecified; if (d.dumpChildren) { //unsigned innerSize = d.extraInt[0]; //bool innerTypeIsPointer = isPointerType(d.innertype); @@ -1722,16 +1669,15 @@ static void qDumpQLinkedList(QDumper &d) const char *stripped = isPointerType(d.innertype) ? strippedInnerType.data() : 0; - d.putItem("childtype", d.innertype); if (n > 1000) n = 1000; - d.beginChildren(); + d.beginChildren(d.innertype); const void *p = deref(ldata); for (int i = 0; i != n; ++i) { d.beginHash(); d.putItem("name", i); const void *addr = addOffset(p, 2 * sizeof(void*)); - innerValueResult = qDumpInnerValueOrPointer(d, d.innertype, stripped, addr); + qDumpInnerValueOrPointer(d, d.innertype, stripped, addr); p = deref(p); d.endHash(); } @@ -1739,7 +1685,6 @@ static void qDumpQLinkedList(QDumper &d) d.putEllipsis(); d.endChildren(); } - dumpChildNumChildren(d, innerValueResult); d.disarm(); } @@ -1807,7 +1752,6 @@ static void qDumpQMapNode(QDumper &d) d.putItem("value", ""); d.putItem("numchild", 2); - InnerValueResult innerValueResult = InnerValueChildrenSpecified; if (d.dumpChildren) { unsigned mapnodesize = d.extraInt[2]; unsigned valueOff = d.extraInt[3]; @@ -1815,7 +1759,7 @@ static void qDumpQMapNode(QDumper &d) unsigned keyOffset = 2 * sizeof(void*) - mapnodesize; unsigned valueOffset = 2 * sizeof(void*) - mapnodesize + valueOff; - d.beginChildren(); + d.beginChildren(d.innertype); d.beginHash(); d.putItem("name", "key"); qDumpInnerValue(d, keyType, addOffset(h, keyOffset)); @@ -1823,11 +1767,10 @@ static void qDumpQMapNode(QDumper &d) d.endHash(); d.beginHash(); d.putItem("name", "value"); - innerValueResult = qDumpInnerValue(d, valueType, addOffset(h, valueOffset)); + qDumpInnerValue(d, valueType, addOffset(h, valueOffset)); d.endHash(); d.endChildren(); } - dumpChildNumChildren(d, innerValueResult); d.disarm(); } @@ -2757,11 +2700,9 @@ static void qDumpQStringList(QDumper &d) d.putItem("valuedisabled", "true"); d.putItem("numchild", n); if (d.dumpChildren) { - d.putItem("childtype", NS"QString"); - d.putItem("childnumchild", "0"); if (n > 1000) n = 1000; - d.beginChildren(); + d.beginChildren(n ? NS"QString" : 0); for (int i = 0; i != n; ++i) { d.beginHash(); d.putItem("name", i); @@ -2814,18 +2755,17 @@ static void qDumpQVector(QDumper &d) d.putItemCount("value", n); d.putItem("valuedisabled", "true"); d.putItem("numchild", n); - InnerValueResult innerValueResult = InnerValueChildrenSpecified; if (d.dumpChildren) { QByteArray strippedInnerType = stripPointerType(d.innertype); const char *stripped = isPointerType(d.innertype) ? strippedInnerType.data() : 0; if (n > 1000) n = 1000; - d.beginChildren(); + d.beginChildren(d.innertype); for (int i = 0; i != n; ++i) { d.beginHash(); d.putItem("name", i); - innerValueResult = qDumpInnerValueOrPointer(d, d.innertype, stripped, + qDumpInnerValueOrPointer(d, d.innertype, stripped, addOffset(v, i * innersize + typeddatasize)); d.endHash(); } @@ -2833,7 +2773,6 @@ static void qDumpQVector(QDumper &d) d.putEllipsis(); d.endChildren(); } - dumpChildNumChildren(d, innerValueResult); d.disarm(); } @@ -2913,24 +2852,22 @@ static void qDumpStdList(QDumper &d) d.putItem("numchild", nn); d.putItem("valuedisabled", "true"); - InnerValueResult innerValueResult = InnerValueChildrenSpecified; if (d.dumpChildren) { QByteArray strippedInnerType = stripPointerType(d.innertype); const char *stripped = isPointerType(d.innertype) ? strippedInnerType.data() : 0; - d.beginChildren(); + d.beginChildren(d.innertype); it = list.begin(); for (int i = 0; i < 1000 && it != cend; ++i, ++it) { d.beginHash(); d.putItem("name", i); - innerValueResult = qDumpInnerValueOrPointer(d, d.innertype, stripped, it.operator->()); + qDumpInnerValueOrPointer(d, d.innertype, stripped, it.operator->()); d.endHash(); } if (it != list.end()) d.putEllipsis(); d.endChildren(); } - dumpChildNumChildren(d, innerValueResult); d.disarm(); } @@ -2974,7 +2911,6 @@ static void qDumpStdMapHelper(QDumper &d) pairType[strlen(pairType) - 2] = 0; d.putItem("pairtype", pairType); - InnerValueResult innerValueResult = InnerValueChildrenSpecified; if (d.dumpChildren) { bool isSimpleKey = isSimpleType(keyType); bool isSimpleValue = isSimpleType(valueType); @@ -2987,14 +2923,14 @@ static void qDumpStdMapHelper(QDumper &d) d.put(" valueOffset: ").put(valueOffset); d.endItem(); - d.beginChildren(); + d.beginChildren(d.innertype); it = map.begin(); for (int i = 0; i < 1000 && it != cend; ++i, ++it) { d.beginHash(); const void *node = it.operator->(); d.putItem("name", i); qDumpInnerValueHelper(d, keyType, node, "key"); - innerValueResult = qDumpInnerValueHelper(d, valueType, addOffset(node, valueOffset)); + qDumpInnerValueHelper(d, valueType, addOffset(node, valueOffset)); if (isSimpleKey && isSimpleValue) { d.putItem("type", valueType); d.putItem("addr", addOffset(node, valueOffset)); @@ -3010,7 +2946,6 @@ static void qDumpStdMapHelper(QDumper &d) d.putEllipsis(); d.endChildren(); } - dumpChildNumChildren(d, innerValueResult); d.disarm(); } @@ -3074,7 +3009,6 @@ static void qDumpStdSetHelper(QDumper &d) d.putItem("valueoffset", d.extraInt[0]); if (d.dumpChildren) { - InnerValueResult innerValueResult = InnerValueChildrenSpecified; int valueOffset = 0; // d.extraInt[0]; QByteArray strippedInnerType = stripPointerType(d.innertype); const char *stripped = @@ -3084,19 +3018,18 @@ static void qDumpStdSetHelper(QDumper &d) d.put("valueOffset: ").put(valueOffset); d.endItem(); - d.beginChildren(); + d.beginChildren(d.innertype); it = set.begin(); for (int i = 0; i < 1000 && it != cend; ++i, ++it) { const void *node = it.operator->(); d.beginHash(); d.putItem("name", i); - innerValueResult = qDumpInnerValueOrPointer(d, d.innertype, stripped, node); + qDumpInnerValueOrPointer(d, d.innertype, stripped, node); d.endHash(); } if (it != set.end()) d.putEllipsis(); d.endChildren(); - dumpChildNumChildren(d, innerValueResult); } d.disarm(); } @@ -3135,7 +3068,7 @@ static void qDumpStdString(QDumper &d) qCheckAccess(str.c_str()); qCheckAccess(str.c_str() + size - 1); } - dumpStdStringValue(d, str); + qDumpStdStringValue(d, str); d.disarm(); } @@ -3149,7 +3082,7 @@ static void qDumpStdWString(QDumper &d) qCheckAccess(str.c_str()); qCheckAccess(str.c_str() + size - 1); } - dumpStdWStringValue(d, str); + qDumpStdWStringValue(d, str); d.disarm(); } @@ -3185,14 +3118,13 @@ static void qDumpStdVector(QDumper &d) d.putItem("valuedisabled", "true"); d.putItem("numchild", n); if (d.dumpChildren) { - InnerValueResult innerValueResult = InnerValueChildrenSpecified; unsigned innersize = d.extraInt[0]; QByteArray strippedInnerType = stripPointerType(d.innertype); const char *stripped = isPointerType(d.innertype) ? strippedInnerType.data() : 0; if (n > 1000) n = 1000; - d.beginChildren(); + d.beginChildren(n ? d.innertype : 0); for (int i = 0; i != n; ++i) { d.beginHash(); d.putItem("name", i); @@ -3203,7 +3135,6 @@ static void qDumpStdVector(QDumper &d) if (n < nn) d.putEllipsis(); d.endChildren(); - dumpChildNumChildren(d, innerValueResult); } d.disarm(); } diff --git a/tests/auto/debugger/main.cpp b/tests/auto/debugger/main.cpp index ae0c6e65cb04a640385572b0451d9263bc44121c..522583a7047516c0d683e671e0b1964f1f9b6d3d 100644 --- a/tests/auto/debugger/main.cpp +++ b/tests/auto/debugger/main.cpp @@ -409,15 +409,14 @@ void tst_Debugger::dumpQList_int() { QList<int> ilist; testDumper("value='<0 items>',valuedisabled='true',numchild='0'," - "internal='1',childtype='int',children=[]", + "internal='1',children=[]", &ilist, NS"QList", true, "int"); ilist.append(1); ilist.append(2); testDumper("value='<2 items>',valuedisabled='true',numchild='2'," - "internal='1',childtype='int',children=[" + "internal='1',childtype='int',childnumchild='0',children=[" "{name='0',addr='" + str(&ilist.at(0)) + "',value='1'}," - "{name='1',addr='" + str(&ilist.at(1)) + "',value='2'}]," - "childnumchild='0'", + "{name='1',addr='" + str(&ilist.at(1)) + "',value='2'}]", &ilist, NS"QList", true, "int"); } @@ -425,17 +424,16 @@ void tst_Debugger::dumpQList_char() { QList<char> clist; testDumper("value='<0 items>',valuedisabled='true',numchild='0'," - "internal='1',childtype='char',children=[]", + "internal='1',children=[]", &clist, NS"QList", true, "char"); clist.append('a'); clist.append('b'); testDumper("value='<2 items>',valuedisabled='true',numchild='2'," - "internal='1',childtype='char',children=[" + "internal='1',childtype='char',childnumchild='0',children=[" "{name='0',addr='" + str(&clist.at(0)) + "'," "value=''a', ascii=97',numchild='0'}," "{name='1',addr='" + str(&clist.at(1)) + "'," - "value=''b', ascii=98',numchild='0'}]," - "childnumchild='0'", + "value=''b', ascii=98',numchild='0'}]", &clist, NS"QList", true, "char"); } @@ -443,25 +441,24 @@ void tst_Debugger::dumpQList_QString() { QList<QString> slist; testDumper("value='<0 items>',valuedisabled='true',numchild='0'," - "internal='1',childtype='QString',children=[]", - &slist, NS"QList", true, "QString"); + "internal='1',children=[]", + &slist, NS"QList", true, NS"QString"); slist.append("a"); slist.append("b"); testDumper("value='<2 items>',valuedisabled='true',numchild='2'," - "internal='1',childtype='QString',children=[" + "internal='1',childtype='"NS"QString',childnumchild='0',children=[" "{name='0',addr='" + str(&slist.at(0)) + "'," "value='YQA=',valueencoded='2'}," "{name='1',addr='" + str(&slist.at(1)) + "'," - "value='YgA=',valueencoded='2'}]," - "childnumchild='0'", - &slist, NS"QList", true, "QString"); + "value='YgA=',valueencoded='2'}]", + &slist, NS"QList", true, NS"QString"); } void tst_Debugger::dumpQList_Int3() { QList<Int3> i3list; testDumper("value='<0 items>',valuedisabled='true',numchild='0'," - "internal='0',childtype='Int3',children=[]", + "internal='0',children=[]", &i3list, NS"QList", true, "Int3"); i3list.append(Int3()); i3list.append(Int3()); @@ -476,7 +473,7 @@ void tst_Debugger::dumpQList_QString3() { QList<QString3> s3list; testDumper("value='<0 items>',valuedisabled='true',numchild='0'," - "internal='0',childtype='QString3',children=[]", + "internal='0',children=[]", &s3list, NS"QList", true, "QString3"); s3list.append(QString3()); s3list.append(QString3()); @@ -599,12 +596,14 @@ void tst_Debugger::dumpStdVector() std::list<int> list; vector.push_back(new std::list<int>(list)); testDumper("value='<1 items>',valuedisabled='true',numchild='1'," + "childtype='" + inner + "',childnumchild='1'," "children=[{name='0',addr='" + str(deref(&vector[0])) + "'," "saddr='" + str(deref(&vector[0])) + "',type='" + innerp + "'}]", &vector, "std::vector", true, inner, "", sizeof(std::list<int> *)); vector.push_back(0); list.push_back(45); testDumper("value='<2 items>',valuedisabled='true',numchild='2'," + "childtype='" + inner + "',childnumchild='1'," "children=[{name='0',addr='" + str(deref(&vector[0])) + "'," "saddr='" + str(deref(&vector[0])) + "',type='" + innerp + "'}," "{name='1',addr='" + str(&vector[1]) + "',"