aboutsummaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorhjk <hjk@qt.io>2020-12-07 15:15:58 +0100
committerhjk <hjk@qt.io>2020-12-08 14:19:40 +0000
commitfff1fafec73d78d8b22e61a565da21eecb8244bc (patch)
tree36baad11060a0ffcd6ed9cf23928e259cdbdc640 /share
parente9ae81612fbbaa00238050fd9eb7cc5dfd9698e7 (diff)
Debugger: Consolidate list data extraction in dumper
Change-Id: I5b860da4b1d15ffab8c60418321e40943dbbe07a Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'share')
-rw-r--r--share/qtcreator/debugger/dumper.py19
-rw-r--r--share/qtcreator/debugger/qttypes.py21
2 files changed, 23 insertions, 17 deletions
diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py
index 66c826f101..e94a21996a 100644
--- a/share/qtcreator/debugger/dumper.py
+++ b/share/qtcreator/debugger/dumper.py
@@ -1722,15 +1722,30 @@ class DumperBase():
addr += 1
return result
- def listChildrenGenerator(self, addr, innerType):
- base = self.extractPointer(addr)
+ def listData(self, value, check=True):
+ if self.qtVersion() >= 0x60000:
+ dd, data, size = self.split('ppi', value)
+ return data, size
+
+ base = self.extractPointer(value)
(ref, alloc, begin, end) = self.split('IIII', base)
array = base + 16
if self.qtVersion() < 0x50000:
array += self.ptrSize()
size = end - begin
+
+ if check:
+ self.check(begin >= 0 and end >= 0 and end <= 1000 * 1000 * 1000)
+ size = end - begin
+ self.check(size >= 0)
+
stepSize = self.ptrSize()
data = array + begin * stepSize
+ return data, size
+
+ def listChildrenGenerator(self, addr, innerType):
+ stepSize = self.ptrSize()
+ data, size = self.listData(addr)
for i in range(size):
yield self.createValue(data + i * stepSize, innerType)
#yield self.createValue(data + i * stepSize, 'void*')
diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py
index ebff0247cb..62c9d81c5c 100644
--- a/share/qtcreator/debugger/qttypes.py
+++ b/share/qtcreator/debugger/qttypes.py
@@ -1057,25 +1057,16 @@ def qdump__QVariantList(d, value):
def qdumpHelper_QList(d, value, innerType):
+ data, size = d.listData(value, check=True)
+ d.putItemCount(size)
+
if d.qtVersion() >= 0x60000:
- dd, data, size = d.split('ppi', value)
- d.putItemCount(size)
d.putPlotData(data, size, innerType)
return
- base = d.extractPointer(value)
- _, _, begin, end = d.split('IIII', base)
- array = base + 16
- if d.qtVersion() < 0x50000:
- array += d.ptrSize()
- d.check(begin >= 0 and end >= 0 and end <= 1000 * 1000 * 1000)
- size = end - begin
- d.check(size >= 0)
- d.putItemCount(size)
if d.isExpanded():
innerSize = innerType.size()
stepSize = d.ptrSize()
- addr = array + begin * stepSize
# The exact condition here is:
# QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic
# but this data is available neither in the compiled binary nor
@@ -1090,17 +1081,17 @@ def qdumpHelper_QList(d, value, innerType):
isInternal = innerSize <= stepSize and innerType.isMovableType()
if isInternal:
if innerSize == stepSize:
- d.putArrayData(addr, size, innerType)
+ d.putArrayData(data, size, innerType)
else:
with Children(d, size, childType=innerType):
for i in d.childRange():
- p = d.createValue(addr + i * stepSize, innerType)
+ p = d.createValue(data + i * stepSize, innerType)
d.putSubItem(i, p)
else:
# about 0.5s / 1000 items
with Children(d, size, maxNumChild=2000, childType=innerType):
for i in d.childRange():
- p = d.extractPointer(addr + i * stepSize)
+ p = d.extractPointer(data + i * stepSize)
x = d.createValue(p, innerType)
d.putSubItem(i, x)