aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhjk <qtc-committer@nokia.com>2008-12-17 15:46:27 +0100
committerhjk <qtc-committer@nokia.com>2008-12-17 15:46:27 +0100
commit04c4a0ec720059414ddf1c702e1fb28e4876d2f9 (patch)
treef458a33d5ccb8d38b39efde633ea0b7722e1f2a0
parentfff7acad55f0d2009afe8941ef2c7cd37481da6f (diff)
make the std::map dumper work with keys that already have a const
qualification like 'const char *'
-rw-r--r--bin/gdbmacros/gdbmacros.cpp10
-rw-r--r--src/plugins/debugger/gdbengine.cpp9
-rw-r--r--tests/manual/gdbdebugger/simple/app.cpp5
3 files changed, 21 insertions, 3 deletions
diff --git a/bin/gdbmacros/gdbmacros.cpp b/bin/gdbmacros/gdbmacros.cpp
index ca19e58702..a3b3de6a4d 100644
--- a/bin/gdbmacros/gdbmacros.cpp
+++ b/bin/gdbmacros/gdbmacros.cpp
@@ -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();
}
}
diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp
index 6e650917ce..e2bbfb3766 100644
--- a/src/plugins/debugger/gdbengine.cpp
+++ b/src/plugins/debugger/gdbengine.cpp
@@ -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;
diff --git a/tests/manual/gdbdebugger/simple/app.cpp b/tests/manual/gdbdebugger/simple/app.cpp
index ba36298eb1..24626064e4 100644
--- a/tests/manual/gdbdebugger/simple/app.cpp
+++ b/tests/manual/gdbdebugger/simple/app.cpp
@@ -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;