forked from qt-creator/qt-creator
Debugger: Consolidate list data extraction in dumper
Change-Id: I5b860da4b1d15ffab8c60418321e40943dbbe07a Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -1722,15 +1722,30 @@ class DumperBase():
|
|||||||
addr += 1
|
addr += 1
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def listChildrenGenerator(self, addr, innerType):
|
def listData(self, value, check=True):
|
||||||
base = self.extractPointer(addr)
|
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)
|
(ref, alloc, begin, end) = self.split('IIII', base)
|
||||||
array = base + 16
|
array = base + 16
|
||||||
if self.qtVersion() < 0x50000:
|
if self.qtVersion() < 0x50000:
|
||||||
array += self.ptrSize()
|
array += self.ptrSize()
|
||||||
size = end - begin
|
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()
|
stepSize = self.ptrSize()
|
||||||
data = array + begin * stepSize
|
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):
|
for i in range(size):
|
||||||
yield self.createValue(data + i * stepSize, innerType)
|
yield self.createValue(data + i * stepSize, innerType)
|
||||||
#yield self.createValue(data + i * stepSize, 'void*')
|
#yield self.createValue(data + i * stepSize, 'void*')
|
||||||
|
@@ -1057,25 +1057,16 @@ def qdump__QVariantList(d, value):
|
|||||||
|
|
||||||
|
|
||||||
def qdumpHelper_QList(d, value, innerType):
|
def qdumpHelper_QList(d, value, innerType):
|
||||||
|
data, size = d.listData(value, check=True)
|
||||||
|
d.putItemCount(size)
|
||||||
|
|
||||||
if d.qtVersion() >= 0x60000:
|
if d.qtVersion() >= 0x60000:
|
||||||
dd, data, size = d.split('ppi', value)
|
|
||||||
d.putItemCount(size)
|
|
||||||
d.putPlotData(data, size, innerType)
|
d.putPlotData(data, size, innerType)
|
||||||
return
|
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():
|
if d.isExpanded():
|
||||||
innerSize = innerType.size()
|
innerSize = innerType.size()
|
||||||
stepSize = d.ptrSize()
|
stepSize = d.ptrSize()
|
||||||
addr = array + begin * stepSize
|
|
||||||
# The exact condition here is:
|
# The exact condition here is:
|
||||||
# QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic
|
# QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic
|
||||||
# but this data is available neither in the compiled binary nor
|
# 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()
|
isInternal = innerSize <= stepSize and innerType.isMovableType()
|
||||||
if isInternal:
|
if isInternal:
|
||||||
if innerSize == stepSize:
|
if innerSize == stepSize:
|
||||||
d.putArrayData(addr, size, innerType)
|
d.putArrayData(data, size, innerType)
|
||||||
else:
|
else:
|
||||||
with Children(d, size, childType=innerType):
|
with Children(d, size, childType=innerType):
|
||||||
for i in d.childRange():
|
for i in d.childRange():
|
||||||
p = d.createValue(addr + i * stepSize, innerType)
|
p = d.createValue(data + i * stepSize, innerType)
|
||||||
d.putSubItem(i, p)
|
d.putSubItem(i, p)
|
||||||
else:
|
else:
|
||||||
# about 0.5s / 1000 items
|
# about 0.5s / 1000 items
|
||||||
with Children(d, size, maxNumChild=2000, childType=innerType):
|
with Children(d, size, maxNumChild=2000, childType=innerType):
|
||||||
for i in d.childRange():
|
for i in d.childRange():
|
||||||
p = d.extractPointer(addr + i * stepSize)
|
p = d.extractPointer(data + i * stepSize)
|
||||||
x = d.createValue(p, innerType)
|
x = d.createValue(p, innerType)
|
||||||
d.putSubItem(i, x)
|
d.putSubItem(i, x)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user