diff options
Diffstat (limited to 'lldb/packages/Python/lldbsuite/test/dotest_channels.py')
-rw-r--r-- | lldb/packages/Python/lldbsuite/test/dotest_channels.py | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/dotest_channels.py b/lldb/packages/Python/lldbsuite/test/dotest_channels.py index 02605fe6bc5..a09cbff4983 100644 --- a/lldb/packages/Python/lldbsuite/test/dotest_channels.py +++ b/lldb/packages/Python/lldbsuite/test/dotest_channels.py @@ -44,7 +44,7 @@ class UnpicklingForwardingReaderChannel(asyncore.dispatcher): def __init__(self, file_object, async_map, forwarding_func): asyncore.dispatcher.__init__(self, sock=file_object, map=async_map) - self.header_contents = '' + self.header_contents = b"" self.packet_bytes_remaining = 0 self.reading_header = True self.ibuffer = b'' @@ -69,17 +69,21 @@ class UnpicklingForwardingReaderChannel(asyncore.dispatcher): if not data or (len(data) == 0): return None - for index in range(len(data)): - byte = data[index] - if byte != '#': - # Header byte. - self.header_contents += byte - else: - # End of header. - self.packet_bytes_remaining = int(self.header_contents) - self.header_contents = '' - self.reading_header = False - return data[(index+1):] + full_header_len = 4 + + assert(len(self.header_contents) < full_header_len) + + bytes_avail = len(data) + bytes_needed = full_header_len - len(self.header_contents) + header_bytes_avail = min(bytes_needed, bytes_avail) + self.header_contents += data[:header_bytes_avail] + if len(self.header_contents) == full_header_len: + import struct + # End of header. + self.packet_bytes_remaining = struct.unpack("!I", self.header_contents)[0] + self.header_contents = b"" + self.reading_header = False + return data[header_bytes_avail:] # If we made it here, we've exhausted the data and # we're still parsing header content. |