forked from qt-creator/qt-creator
Debugger: Speed up reading of 0 terminated blobs in dumpers
Change-Id: Iebc64c21f4dd6f4876989e57d3a347b96e1bd449 Reviewed-by: Christian Stenger <christian.stenger@digia.com>
This commit is contained in:
@@ -696,19 +696,21 @@ class DumperBase:
|
|||||||
self.check(count >= minimum)
|
self.check(count >= minimum)
|
||||||
self.check(count < 1000000)
|
self.check(count < 1000000)
|
||||||
|
|
||||||
def findFirstZero(self, p, maximum):
|
def readToFirstZero(self, p, tsize, maximum):
|
||||||
for i in xrange(maximum):
|
code = (None, "b", "H", None, "I")[tsize]
|
||||||
if int(p.dereference()) == 0:
|
base = toInteger(p)
|
||||||
return 0, i
|
blob = self.extractBlob(base, maximum).toBytes()
|
||||||
p = p + 1
|
for i in xrange(0, maximum / tsize):
|
||||||
# Real end is unknown.
|
t = struct.unpack_from(code, blob, i)[0]
|
||||||
return -1, maximum
|
if t == 0:
|
||||||
|
return 0, i, self.hexencode(blob[:i])
|
||||||
|
|
||||||
def encodeCArray(self, p, innerType, limit):
|
# Real end is unknown.
|
||||||
t = self.lookupType(innerType)
|
return -1, maximum, self.hexencode(blob[:maximum])
|
||||||
p = p.cast(t.pointer())
|
|
||||||
elided, shown = self.findFirstZero(p, limit)
|
def encodeCArray(self, p, tsize, limit):
|
||||||
return elided, self.readMemory(p, shown * t.sizeof)
|
elided, shown, blob = self.readToFirstZero(p, tsize, limit)
|
||||||
|
return elided, blob
|
||||||
|
|
||||||
def putItemCount(self, count, maximum = 1000000000):
|
def putItemCount(self, count, maximum = 1000000000):
|
||||||
# This needs to override the default value, so don't use 'put' directly.
|
# This needs to override the default value, so don't use 'put' directly.
|
||||||
@@ -851,13 +853,11 @@ class DumperBase:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def putSimpleCharArray(self, base, size = None):
|
def putSimpleCharArray(self, base, size = None):
|
||||||
t = self.lookupType("char")
|
|
||||||
p = base.cast(t.pointer())
|
|
||||||
if size is None:
|
if size is None:
|
||||||
elided, shown = self.findFirstZero(p, self.displayStringLimit)
|
elided, shown, data = self.readToFirstZero(base, 1, self.displayStringLimit)
|
||||||
else:
|
else:
|
||||||
elided, shown = self.computeLimit(int(size), self.displayStringLimit)
|
elided, shown = self.computeLimit(int(size), self.displayStringLimit)
|
||||||
data = self.readMemory(p, shown)
|
data = self.readMemory(p, shown)
|
||||||
self.putValue(data, Hex2EncodedLatin1, elided=elided)
|
self.putValue(data, Hex2EncodedLatin1, elided=elided)
|
||||||
|
|
||||||
def putDisplay(self, format, value = None, cmd = None):
|
def putDisplay(self, format, value = None, cmd = None):
|
||||||
@@ -903,7 +903,7 @@ class DumperBase:
|
|||||||
if format == None and innerTypeName == "char":
|
if format == None and innerTypeName == "char":
|
||||||
# Use Latin1 as default for char *.
|
# Use Latin1 as default for char *.
|
||||||
self.putType(typeName)
|
self.putType(typeName)
|
||||||
(elided, data) = self.encodeCArray(value, "unsigned char", self.displayStringLimit)
|
(elided, data) = self.encodeCArray(value, 1, self.displayStringLimit)
|
||||||
self.putValue(data, Hex2EncodedLatin1, elided=elided)
|
self.putValue(data, Hex2EncodedLatin1, elided=elided)
|
||||||
self.putNumChild(0)
|
self.putNumChild(0)
|
||||||
return
|
return
|
||||||
@@ -923,7 +923,7 @@ class DumperBase:
|
|||||||
# Explicitly requested Latin1 formatting.
|
# Explicitly requested Latin1 formatting.
|
||||||
limit = self.displayStringLimit if format == Latin1StringFormat else 1000000
|
limit = self.displayStringLimit if format == Latin1StringFormat else 1000000
|
||||||
self.putType(typeName)
|
self.putType(typeName)
|
||||||
(elided, data) = self.encodeCArray(value, "unsigned char", limit)
|
(elided, data) = self.encodeCArray(value, 1, limit)
|
||||||
self.putValue(data, Hex2EncodedLatin1, elided=elided)
|
self.putValue(data, Hex2EncodedLatin1, elided=elided)
|
||||||
self.putNumChild(0)
|
self.putNumChild(0)
|
||||||
self.putDisplay((StopDisplay if format == Latin1StringFormat else DisplayLatin1String), data)
|
self.putDisplay((StopDisplay if format == Latin1StringFormat else DisplayLatin1String), data)
|
||||||
@@ -933,7 +933,7 @@ class DumperBase:
|
|||||||
# Explicitly requested UTF-8 formatting.
|
# Explicitly requested UTF-8 formatting.
|
||||||
limit = self.displayStringLimit if format == Utf8StringFormat else 1000000
|
limit = self.displayStringLimit if format == Utf8StringFormat else 1000000
|
||||||
self.putType(typeName)
|
self.putType(typeName)
|
||||||
(elided, data) = self.encodeCArray(value, "unsigned char", limit)
|
(elided, data) = self.encodeCArray(value, 1, limit)
|
||||||
self.putValue(data, Hex2EncodedUtf8, elided=elided)
|
self.putValue(data, Hex2EncodedUtf8, elided=elided)
|
||||||
self.putNumChild(0)
|
self.putNumChild(0)
|
||||||
self.putDisplay((StopDisplay if format == Utf8StringFormat else DisplayUtf8String), data)
|
self.putDisplay((StopDisplay if format == Utf8StringFormat else DisplayUtf8String), data)
|
||||||
@@ -942,7 +942,7 @@ class DumperBase:
|
|||||||
if format == Local8BitStringFormat:
|
if format == Local8BitStringFormat:
|
||||||
# Explicitly requested local 8 bit formatting.
|
# Explicitly requested local 8 bit formatting.
|
||||||
self.putType(typeName)
|
self.putType(typeName)
|
||||||
(elided, data) = self.encodeCArray(value, "unsigned char", self.displayStringLimit)
|
(elided, data) = self.encodeCArray(value, 1, self.displayStringLimit)
|
||||||
self.putValue(data, Hex2EncodedLocal8Bit, elided=elided)
|
self.putValue(data, Hex2EncodedLocal8Bit, elided=elided)
|
||||||
self.putNumChild(0)
|
self.putNumChild(0)
|
||||||
return
|
return
|
||||||
@@ -950,7 +950,7 @@ class DumperBase:
|
|||||||
if format == Utf16StringFormat:
|
if format == Utf16StringFormat:
|
||||||
# Explicitly requested UTF-16 formatting.
|
# Explicitly requested UTF-16 formatting.
|
||||||
self.putType(typeName)
|
self.putType(typeName)
|
||||||
(elided, data) = self.encodeCArray(value, "unsigned short", self.displayStringLimit)
|
(elided, data) = self.encodeCArray(value, 2, self.displayStringLimit)
|
||||||
self.putValue(data, Hex4EncodedLittleEndian, elided=elided)
|
self.putValue(data, Hex4EncodedLittleEndian, elided=elided)
|
||||||
self.putNumChild(0)
|
self.putNumChild(0)
|
||||||
return
|
return
|
||||||
@@ -958,7 +958,7 @@ class DumperBase:
|
|||||||
if format == Ucs4StringFormat:
|
if format == Ucs4StringFormat:
|
||||||
# Explicitly requested UCS-4 formatting.
|
# Explicitly requested UCS-4 formatting.
|
||||||
self.putType(typeName)
|
self.putType(typeName)
|
||||||
(elided, data) = self.encodeCArray(value, "unsigned int", self.displayStringLimit)
|
(elided, data) = self.encodeCArray(value, 4, self.displayStringLimit)
|
||||||
self.putValue(data, Hex8EncodedLittleEndian, elided=elided)
|
self.putValue(data, Hex8EncodedLittleEndian, elided=elided)
|
||||||
self.putNumChild(0)
|
self.putNumChild(0)
|
||||||
return
|
return
|
||||||
|
Reference in New Issue
Block a user