forked from qt-creator/qt-creator
Debugger: Re-organize std::vector and std::deque dumpers
There are indications that the std::__1:: namespace cannot be relied upon anymore. Task-number: QTCREATORBUG-25061 Change-Id: I54d8d2fc757b1cfc9b27f00660f2814d745f2bc6 Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
@@ -3060,6 +3060,9 @@ class DumperBase():
|
|||||||
def extractPointer(self):
|
def extractPointer(self):
|
||||||
return self.split('p')[0]
|
return self.split('p')[0]
|
||||||
|
|
||||||
|
def hasMember(self, name):
|
||||||
|
return self.findMemberByName(name) is not None
|
||||||
|
|
||||||
def findMemberByName(self, name):
|
def findMemberByName(self, name):
|
||||||
self.check()
|
self.check()
|
||||||
if self.type.code == TypeCode.Typedef:
|
if self.type.code == TypeCode.Typedef:
|
||||||
|
@@ -76,12 +76,26 @@ def qdump__std____1__complex(d, value):
|
|||||||
|
|
||||||
def qdump__std__deque(d, value):
|
def qdump__std__deque(d, value):
|
||||||
if d.isQnxTarget():
|
if d.isQnxTarget():
|
||||||
qdump__std__deque__QNX(d, value)
|
qdumpHelper__std__deque__qnx(d, value)
|
||||||
return
|
elif d.isMsvcTarget():
|
||||||
if d.isMsvcTarget():
|
qdumpHelper__std__deque__msvc(d, value)
|
||||||
qdump__std__deque__MSVC(d, value)
|
elif value.hasMember("_M_impl"):
|
||||||
return
|
qdumpHelper__std__deque__libstdcxx(d, value)
|
||||||
|
elif value.hasMember("__start_"):
|
||||||
|
qdumpHelper__std__deque__libcxx(d, value)
|
||||||
|
elif value.type.size() == 10 * d.ptrSize():
|
||||||
|
qdumpHelper__std__deque__libstdcxx(d, value)
|
||||||
|
elif value.type.size() == 6 * d.ptrSize():
|
||||||
|
qdumpHelper__std__deque__libcxx(d, value)
|
||||||
|
else:
|
||||||
|
qdumpHelper__std__deque__libstdcxx(d, value)
|
||||||
|
|
||||||
|
|
||||||
|
def qdump__std____1__deque(d, value):
|
||||||
|
qdumpHelper__std__deque__libcxx(d, value)
|
||||||
|
|
||||||
|
|
||||||
|
def qdumpHelper__std__deque__libstdcxx(d, value):
|
||||||
innerType = value.type[0]
|
innerType = value.type[0]
|
||||||
innerSize = innerType.size()
|
innerSize = innerType.size()
|
||||||
bufsize = 1
|
bufsize = 1
|
||||||
@@ -113,7 +127,7 @@ def qdump__std__deque(d, value):
|
|||||||
pnode = newnode
|
pnode = newnode
|
||||||
|
|
||||||
|
|
||||||
def qdump__std____1__deque(d, value):
|
def qdumpHelper__std__deque__libcxx(d, value):
|
||||||
mptr, mfirst, mbegin, mend, start, size = value.split("pppptt")
|
mptr, mfirst, mbegin, mend, start, size = value.split("pppptt")
|
||||||
d.check(0 <= size and size <= 1000 * 1000 * 1000)
|
d.check(0 <= size and size <= 1000 * 1000 * 1000)
|
||||||
d.putItemCount(size)
|
d.putItemCount(size)
|
||||||
@@ -129,7 +143,7 @@ def qdump__std____1__deque(d, value):
|
|||||||
d.putSubItem(i, d.createValue(base + j * innerSize, innerType))
|
d.putSubItem(i, d.createValue(base + j * innerSize, innerType))
|
||||||
|
|
||||||
|
|
||||||
def qdump__std__deque__QNX(d, value):
|
def qdumpHelper__std__deque__qnx(d, value):
|
||||||
innerType = value.type[0]
|
innerType = value.type[0]
|
||||||
innerSize = innerType.size()
|
innerSize = innerType.size()
|
||||||
if innerSize <= 1:
|
if innerSize <= 1:
|
||||||
@@ -166,7 +180,7 @@ def qdump__std__deque__QNX(d, value):
|
|||||||
myoff += 1
|
myoff += 1
|
||||||
|
|
||||||
|
|
||||||
def qdump__std__deque__MSVC(d, value):
|
def qdumpHelper__std__deque__msvc(d, value):
|
||||||
innerType = value.type[0]
|
innerType = value.type[0]
|
||||||
innerSize = innerType.size()
|
innerSize = innerType.size()
|
||||||
if innerSize <= 1:
|
if innerSize <= 1:
|
||||||
@@ -1048,95 +1062,88 @@ def qedit__std__vector(d, value, data):
|
|||||||
|
|
||||||
def qdump__std__vector(d, value):
|
def qdump__std__vector(d, value):
|
||||||
if d.isQnxTarget() or d.isMsvcTarget():
|
if d.isQnxTarget() or d.isMsvcTarget():
|
||||||
qdumpHelper__std__vector__QNX(d, value)
|
qdumpHelper__std__vector__msvc(d, value)
|
||||||
|
elif value.hasMember("_M_impl"):
|
||||||
|
qdumpHelper__std__vector__libstdcxx(d, value)
|
||||||
|
elif value.hasMember("__begin_"):
|
||||||
|
qdumpHelper__std__vector__libcxx(d, value)
|
||||||
else:
|
else:
|
||||||
qdumpHelper__std__vector(d, value, False)
|
qdumpHelper__std__vector__libstdcxx(d, value)
|
||||||
|
|
||||||
|
|
||||||
def qdumpHelper__std__vector(d, value, isLibCpp):
|
def qdumpHelper__std__vector__nonbool(d, start, finish, alloc, inner_type):
|
||||||
innerType = value.type[0]
|
size = int((finish - start) / inner_type.size())
|
||||||
isBool = innerType.name == 'bool'
|
d.check(finish <= alloc)
|
||||||
|
if size > 0:
|
||||||
|
d.checkPointer(start)
|
||||||
|
d.checkPointer(finish)
|
||||||
|
d.checkPointer(alloc)
|
||||||
|
d.check(0 <= size and size <= 1000 * 1000 * 1000)
|
||||||
|
d.putItemCount(size)
|
||||||
|
d.putPlotData(start, size, inner_type)
|
||||||
|
|
||||||
if isBool:
|
|
||||||
if isLibCpp:
|
def qdumpHelper__std__vector__bool(d, start, size, inner_type):
|
||||||
start = value["__begin_"].pointer()
|
d.check(0 <= size and size <= 1000 * 1000 * 1000)
|
||||||
size = value["__size_"].integer()
|
d.putItemCount(size)
|
||||||
alloc = size
|
if d.isExpanded():
|
||||||
else:
|
with Children(d, size, maxNumChild=10000, childType=inner_type):
|
||||||
|
for i in d.childRange():
|
||||||
|
q = start + int(i / 8)
|
||||||
|
with SubItem(d, i):
|
||||||
|
d.putValue((int(d.extractPointer(q)) >> (i % 8)) & 1)
|
||||||
|
d.putType("bool")
|
||||||
|
|
||||||
|
|
||||||
|
def qdumpHelper__std__vector__libstdcxx(d, value):
|
||||||
|
inner_type = value.type[0]
|
||||||
|
if inner_type.name == "bool":
|
||||||
start = value["_M_start"]["_M_p"].pointer()
|
start = value["_M_start"]["_M_p"].pointer()
|
||||||
soffset = value["_M_start"]["_M_offset"].integer()
|
soffset = value["_M_start"]["_M_offset"].integer()
|
||||||
finish = value["_M_finish"]["_M_p"].pointer()
|
finish = value["_M_finish"]["_M_p"].pointer()
|
||||||
foffset = value["_M_finish"]["_M_offset"].integer()
|
foffset = value["_M_finish"]["_M_offset"].integer()
|
||||||
alloc = value["_M_end_of_storage"].pointer()
|
alloc = value["_M_end_of_storage"].pointer()
|
||||||
size = (finish - start) * 8 + foffset - soffset # 8 is CHAR_BIT.
|
size = (finish - start) * 8 + foffset - soffset # 8 is CHAR_BIT.
|
||||||
else:
|
qdumpHelper__std__vector__bool(d, start, size, inner_type)
|
||||||
if isLibCpp:
|
|
||||||
start = value["__begin_"].pointer()
|
|
||||||
finish = value["__end_"].pointer()
|
|
||||||
alloc = value["__end_cap_"].pointer()
|
|
||||||
else:
|
else:
|
||||||
start = value["_M_start"].pointer()
|
start = value["_M_start"].pointer()
|
||||||
finish = value["_M_finish"].pointer()
|
finish = value["_M_finish"].pointer()
|
||||||
alloc = value["_M_end_of_storage"].pointer()
|
alloc = value["_M_end_of_storage"].pointer()
|
||||||
size = int((finish - start) / innerType.size())
|
qdumpHelper__std__vector__nonbool(d, start, finish, alloc, inner_type)
|
||||||
d.check(finish <= alloc)
|
|
||||||
if size > 0:
|
|
||||||
d.checkPointer(start)
|
|
||||||
d.checkPointer(finish)
|
|
||||||
d.checkPointer(alloc)
|
|
||||||
|
|
||||||
d.check(0 <= size and size <= 1000 * 1000 * 1000)
|
|
||||||
|
|
||||||
d.putItemCount(size)
|
def qdumpHelper__std__vector__libcxx(d, value):
|
||||||
if isBool:
|
inner_type = value.type[0]
|
||||||
if d.isExpanded():
|
if inner_type.name == "bool":
|
||||||
with Children(d, size, maxNumChild=10000, childType=innerType):
|
start = value["__begin_"].pointer()
|
||||||
for i in d.childRange():
|
size = value["__size_"].integer()
|
||||||
q = start + int(i / 8)
|
qdumpHelper__std__vector__bool(d, start, size, inner_type)
|
||||||
with SubItem(d, i):
|
|
||||||
d.putValue((int(d.extractPointer(q)) >> (i % 8)) & 1)
|
|
||||||
d.putType("bool")
|
|
||||||
else:
|
else:
|
||||||
d.putPlotData(start, size, innerType)
|
start = value["__begin_"].pointer()
|
||||||
|
finish = value["__end_"].pointer()
|
||||||
|
alloc = value["__end_cap_"].pointer()
|
||||||
|
qdumpHelper__std__vector__nonbool(d, start, finish, alloc, inner_type)
|
||||||
|
|
||||||
|
|
||||||
def qdumpHelper__std__vector__QNX(d, value):
|
def qdumpHelper__std__vector__msvc(d, value):
|
||||||
innerType = value.type[0]
|
inner_type = value.type[0]
|
||||||
isBool = innerType.name == 'bool'
|
if inner_type.name == "bool":
|
||||||
if isBool:
|
proxy1, proxy2, start, finish, alloc, size = value.split("pppppi")
|
||||||
(proxy1, proxy2, start, last, end, size) = value.split("pppppi")
|
|
||||||
else:
|
|
||||||
(proxy, start, last, end) = value.split("pppp")
|
|
||||||
size = (last - start) // innerType.size()
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
d.check(0 <= size and size <= 1000 * 1000 * 1000)
|
d.check(0 <= size and size <= 1000 * 1000 * 1000)
|
||||||
d.check(last <= end)
|
d.check(finish <= alloc)
|
||||||
except RuntimeError:
|
except RuntimeError:
|
||||||
if isBool:
|
start, finish, alloc, size = value.split("pppi")
|
||||||
(start, last, end, size) = value.split("pppi")
|
qdumpHelper__std__vector__bool(d, start, size, inner_type)
|
||||||
else:
|
else:
|
||||||
(start, last, end) = value.split("ppp")
|
proxy, start, finish, alloc = value.split("pppp")
|
||||||
size = (last - start) // innerType.size()
|
size = (finish - start) // inner_type.size()
|
||||||
|
try:
|
||||||
d.check(0 <= size and size <= 1000 * 1000 * 1000)
|
d.check(0 <= size and size <= 1000 * 1000 * 1000)
|
||||||
d.check(last <= end)
|
d.check(finish <= alloc)
|
||||||
|
except RuntimeError:
|
||||||
if size > 0:
|
start, finish, alloc = value.split("ppp")
|
||||||
d.checkPointer(start)
|
qdumpHelper__std__vector__nonbool(d, start, finish, alloc, inner_type)
|
||||||
d.checkPointer(last)
|
|
||||||
d.checkPointer(end)
|
|
||||||
|
|
||||||
d.putItemCount(size)
|
|
||||||
if d.isExpanded():
|
|
||||||
if isBool:
|
|
||||||
with Children(d, size, maxNumChild=10000, childType=innerType):
|
|
||||||
for i in d.childRange():
|
|
||||||
q = start + int(i / 8)
|
|
||||||
with SubItem(d, i):
|
|
||||||
d.putValue((d.extractPointer(q) >> (i % 8)) & 1)
|
|
||||||
d.putType("bool")
|
|
||||||
else:
|
|
||||||
d.putPlotData(start, size, innerType)
|
|
||||||
|
|
||||||
|
|
||||||
def qform__std____1__vector():
|
def qform__std____1__vector():
|
||||||
@@ -1144,7 +1151,7 @@ def qform__std____1__vector():
|
|||||||
|
|
||||||
|
|
||||||
def qdump__std____1__vector(d, value):
|
def qdump__std____1__vector(d, value):
|
||||||
qdumpHelper__std__vector(d, value, True)
|
qdumpHelper__std__vector__libcxx(d, value)
|
||||||
|
|
||||||
|
|
||||||
def qform__std____debug__vector():
|
def qform__std____debug__vector():
|
||||||
|
Reference in New Issue
Block a user