util.chunkbuffer: special case reading everything
authorGregory Szorc <gregory.szorc@gmail.com>
Mon, 05 Oct 2015 16:28:12 -0700
changeset 26478 a3f7e5461dbd
parent 26477 d69245af4dbe
child 26479 46143f31290e
util.chunkbuffer: special case reading everything The new code results in simpler logic within the while loop. It is also faster since we avoid performing operations on the queue and buf collections. However, there shouldn't be any super hot loops for this since the whole point of chunkbuffer is to avoid reading large amounts of data at once. This does, however, make it easier to optimize chunkbuffer in a subsequent patch.
mercurial/util.py
--- a/mercurial/util.py	Mon Oct 05 07:13:35 2015 +0200
+++ b/mercurial/util.py	Mon Oct 05 16:28:12 2015 -0700
@@ -1292,10 +1292,13 @@
         Returns less than L bytes if the iterator runs dry.
 
         If size parameter is omitted, read everything"""
+        if l is None:
+            return ''.join(self.iter)
+
         left = l
         buf = []
         queue = self._queue
-        while left is None or left > 0:
+        while left > 0:
             # refill the queue
             if not queue:
                 target = 2**18
@@ -1308,9 +1311,8 @@
                     break
 
             chunk = queue.popleft()
-            if left is not None:
-                left -= len(chunk)
-            if left is not None and left < 0:
+            left -= len(chunk)
+            if left < 0:
                 queue.appendleft(chunk[left:])
                 buf.append(chunk[:left])
             else: