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:
hjk
2014-10-10 01:33:35 +02:00
parent 86ca234004
commit 392b3f65d2

View File

@@ -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