debugger: fix python dumper for std::vector<bool>

This commit is contained in:
hjk
2010-07-22 19:49:15 +02:00
parent 695ff52e3b
commit 1730141fe6
2 changed files with 29 additions and 8 deletions

View File

@@ -1857,10 +1857,21 @@ def qdump__std__string(d, item):
def qdump__std__vector(d, item): def qdump__std__vector(d, item):
impl = item.value["_M_impl"] impl = item.value["_M_impl"]
start = impl["_M_start"] type = item.value.type.template_argument(0)
finish = impl["_M_finish"]
alloc = impl["_M_end_of_storage"] 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(0 <= size and size <= 1000 * 1000 * 1000)
check(finish <= alloc) check(finish <= alloc)
@@ -1871,11 +1882,18 @@ def qdump__std__vector(d, item):
d.putItemCount(size) d.putItemCount(size)
d.putNumChild(size) d.putNumChild(size)
if d.isExpanded(item): if d.isExpanded(item):
with Children(d, [size, 10000], item.value.type.template_argument(0)): if isBool:
p = start with Children(d, [size, 10000], type):
for i in d.childRange(): for i in d.childRange():
d.putItem(Item(p.dereference(), item.iname, i)) q = start + i / storagesize
p += 1 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): def qdump__string(d, item):

View File

@@ -1119,6 +1119,9 @@ void testStdVector()
std::vector<bool> vec; std::vector<bool> vec;
vec.push_back(true); vec.push_back(true);
vec.push_back(false); vec.push_back(false);
vec.push_back(false);
vec.push_back(true);
vec.push_back(false);
} }
void testQStandardItemModel() void testQStandardItemModel()