From 0ef1c56c368cfd8a0e1d5bb7e74d349941de71cc Mon Sep 17 00:00:00 2001 From: hjk <qtc-committer@nokia.com> Date: Mon, 16 Aug 2010 11:10:18 +0200 Subject: [PATCH] debugger: implement python dumper for std::vector<bool> (cherry picked from commit 104751241d74dcdfe74d5abc131cf450c0828d8d) Conflicts: tests/manual/gdbdebugger/simple/app.cpp --- share/qtcreator/gdbmacros/gdbmacros.py | 34 +++++++++++++++++++------ tests/manual/gdbdebugger/simple/app.cpp | 3 +++ 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/share/qtcreator/gdbmacros/gdbmacros.py b/share/qtcreator/gdbmacros/gdbmacros.py index 4394e630afb..93f8b47b27d 100644 --- a/share/qtcreator/gdbmacros/gdbmacros.py +++ b/share/qtcreator/gdbmacros/gdbmacros.py @@ -1855,10 +1855,21 @@ def qdump__std__string(d, item): def qdump__std__vector(d, item): impl = item.value["_M_impl"] - start = impl["_M_start"] - finish = impl["_M_finish"] + type = item.value.type.template_argument(0) alloc = impl["_M_end_of_storage"] - size = finish - start + isBool = str(type) == 'bool' + if isBool: + start = impl["_M_start"]["_M_p"] + finish = impl["_M_finish"]["_M_p"] + # FIXME: 32 is sizeof(unsigned long) * CHAR_BIT + storagesize = 32 + size = (finish - start) * storagesize + size += impl["_M_finish"]["_M_offset"] + size -= impl["_M_start"]["_M_offset"] + else: + start = impl["_M_start"] + finish = impl["_M_finish"] + size = finish - start check(0 <= size and size <= 1000 * 1000 * 1000) check(finish <= alloc) @@ -1869,11 +1880,18 @@ def qdump__std__vector(d, item): d.putItemCount(size) d.putNumChild(size) if d.isExpanded(item): - with Children(d, [size, 10000], item.value.type.template_argument(0)): - p = start - for i in d.childRange(): - d.putItem(Item(p.dereference(), item.iname, i)) - p += 1 + if isBool: + with Children(d, [size, 10000], type): + for i in d.childRange(): + q = start + i / storagesize + data = (q.dereference() >> (i % storagesize)) & 1 + d.putBoolItem(str(i), select(data, "true", "false")) + else: + with Children(d, [size, 10000], type): + p = start + for i in d.childRange(): + d.putItem(Item(p.dereference(), item.iname, i)) + p += 1 def qdump__string(d, item): diff --git a/tests/manual/gdbdebugger/simple/app.cpp b/tests/manual/gdbdebugger/simple/app.cpp index 464e18b7365..a165442671c 100644 --- a/tests/manual/gdbdebugger/simple/app.cpp +++ b/tests/manual/gdbdebugger/simple/app.cpp @@ -1119,6 +1119,9 @@ void testStdVector() std::vector<bool> vec; vec.push_back(true); vec.push_back(false); + vec.push_back(false); + vec.push_back(true); + vec.push_back(false); } void testQStandardItemModel() -- GitLab