forked from qt-creator/qt-creator
make the std::map dumper work with keys that already have a const
qualification like 'const char *'
This commit is contained in:
@@ -2155,6 +2155,14 @@ static void qDumpStdMap(QDumper &d)
|
||||
P(d, "valuedisabled", "true");
|
||||
P(d, "valueoffset", d.extraInt[2]);
|
||||
|
||||
// HACK: we need a properly const qualified version of the
|
||||
// std::pair used. We extract it from the allocator parameter
|
||||
// as it is there, and, equally importantly, in an order that
|
||||
// gdb accepts when fed with it.
|
||||
char *pairType = (char *)(d.templateParameters[3]) + 16;
|
||||
pairType[strlen(pairType) - 2] = 0;
|
||||
P(d, "pairtype", pairType);
|
||||
|
||||
if (d.dumpChildren) {
|
||||
bool simpleKey = isSimpleType(keyType);
|
||||
bool simpleValue = isShortKey(valueType);
|
||||
@@ -2177,7 +2185,7 @@ static void qDumpStdMap(QDumper &d)
|
||||
d.beginHash();
|
||||
P(d, "name", "[" << i << "]");
|
||||
P(d, "addr", it.operator->());
|
||||
P(d, "type", "std::pair<const " << keyType << "," << valueType << " >");
|
||||
P(d, "type", pairType);
|
||||
d.endHash();
|
||||
}
|
||||
}
|
||||
|
@@ -3022,8 +3022,13 @@ void GdbEngine::runCustomDumper(const WatchData & data0, bool dumpChildren)
|
||||
} else if (outertype == "std::map") {
|
||||
// We don't want the comparator and the allocator confuse gdb.
|
||||
// But we need the offset of the second item in the value pair.
|
||||
extraArgs[2] = "(size_t)&(('std::pair<const " + inners.at(0)
|
||||
+ "," + inners.at(1) + ">'*)0)->second";
|
||||
// We read the type of the pair from the allocator argument because
|
||||
// that gets the constness "right" (in the sense that gdb can
|
||||
// read it back;
|
||||
QString pairType = inners.at(3);
|
||||
// remove 'std::allocator<...>':
|
||||
pairType = pairType.mid(15, pairType.size() - 15 - 2);
|
||||
extraArgs[2] = "(size_t)&(('" + pairType + "'*)0)->second";
|
||||
extraArgs[3] = "0";
|
||||
} else if (outertype == "std::basic_string") {
|
||||
//qDebug() << "EXTRACT TEMPLATE: " << outertype << inners;
|
||||
|
@@ -416,6 +416,11 @@ void testStdMap()
|
||||
gg3["33.0"] = Foo(33);
|
||||
gg3["44.0"] = Foo(44);
|
||||
|
||||
|
||||
std::map<const char *, Foo> m1;
|
||||
m1["22.0"] = Foo(22);
|
||||
m1["33.0"] = Foo(33);
|
||||
m1["44.0"] = Foo(44);
|
||||
#if 1
|
||||
std::map<uint, uint> gg;
|
||||
gg[11] = 1;
|
||||
|
Reference in New Issue
Block a user