diff --git a/bin/gdbmacros/gdbmacros.cpp b/bin/gdbmacros/gdbmacros.cpp index ca19e5870270f147d6b3ea9fc9cb083435fd16b8..a3b3de6a4de92e51bbc0d50788010beefd2460f8 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/doc/coding-style.qdoc b/doc/coding-style.qdoc index 3e20915745533f7622eb815d3baf27c54ed23d15..c2e886c85b3fb355e5b568cc741672f63725598d 100644 --- a/doc/coding-style.qdoc +++ b/doc/coding-style.qdoc @@ -108,6 +108,34 @@ in C++. \endcode +\o Using Qt's foreach is ok in non-time critical code when using a QTL + container. It is a nice way to keep line noise down and to give the + loop variable a proper name: + +\code + foreach (QWidget *widget, container) + doSomething(widget); + + -VS- + + Container::iterator end = container.end(); + for (Container::iterator it = container.begin(); it != end; ++it) + doSomething(*it); +\endcode + + If the loop variable can be made const, do so. This can prevent + unnecessary detaching of shared data in some cases. So: + +\code + foreach (const QString &name, someListOfNames) + doSomething(name); + + - NOT - + + foreach (QString name, someListOfNames) + doSomething(name); +\endcode + \section1 Formatting diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp index 710bee9aee5e666a81eb2eee7c150688ef514775..e2bbfb3766e879929f842ad336b79cd8f1f0d19f 100644 --- a/src/plugins/debugger/gdbengine.cpp +++ b/src/plugins/debugger/gdbengine.cpp @@ -1362,7 +1362,7 @@ void GdbEngine::handleShowVersion(const GdbResultRecord &response) if (response.resultClass == GdbResultDone) { m_gdbVersion = 100; QString msg = response.data.findChild("consolestreamoutput").data(); - QRegExp supported("GNU gdb(.*) (\\d+)\\.(\\d+)\\.(\\d+)"); + QRegExp supported("GNU gdb(.*) (\\d+)\\.(\\d+)(\\.(\\d+))?"); if (supported.indexIn(msg) == -1) { qDebug() << "UNSUPPORTED GDB VERSION " << msg; QStringList list = msg.split("\n"); @@ -1384,7 +1384,7 @@ void GdbEngine::handleShowVersion(const GdbResultRecord &response) } else { m_gdbVersion = 10000 * supported.cap(2).toInt() + 100 * supported.cap(3).toInt() - + 1 * supported.cap(4).toInt(); + + 1 * supported.cap(5).toInt(); //qDebug() << "GDB VERSION " << m_gdbVersion; } } @@ -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 149be98c271905564acb2a8f2274442a5305e578..24626064e4f1fb4d66484cdedd5da404df3e5774 100644 --- a/tests/manual/gdbdebugger/simple/app.cpp +++ b/tests/manual/gdbdebugger/simple/app.cpp @@ -74,8 +74,6 @@ uint qHash(const double & f) return int(f); } -#define X myns -X::QString str; class Foo { @@ -418,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;