[Python-checkins] cpython (merge default -> default): Merge

antoine.pitrou python-checkins at python.org
Sat Aug 4 16:19:52 CEST 2012


http://hg.python.org/cpython/rev/27ae40361ca5
changeset:   78411:27ae40361ca5
parent:      78410:d6745ddbccbd
parent:      78409:cdf27a213bd2
user:        Antoine Pitrou <solipsis at pitrou.net>
date:        Sat Aug 04 16:17:10 2012 +0200
summary:
  Merge

files:
  Lib/asynchat.py |  14 +----------
  Lib/bz2.py      |  47 ++++++++++++++++++++----------------
  2 files changed, 27 insertions(+), 34 deletions(-)


diff --git a/Lib/asynchat.py b/Lib/asynchat.py
--- a/Lib/asynchat.py
+++ b/Lib/asynchat.py
@@ -49,18 +49,6 @@
 import asyncore
 from collections import deque
 
-def buffer(obj, start=None, stop=None):
-    # if memoryview objects gain slicing semantics,
-    # this function will change for the better
-    # memoryview used for the TypeError
-    memoryview(obj)
-    if start == None:
-        start = 0
-    if stop == None:
-        stop = len(obj)
-    x = obj[start:stop]
-    ## print("buffer type is: %s"%(type(x),))
-    return x
 
 class async_chat (asyncore.dispatcher):
     """This is an abstract class.  You must derive from this class, and add
@@ -240,7 +228,7 @@
             # handle classic producer behavior
             obs = self.ac_out_buffer_size
             try:
-                data = buffer(first, 0, obs)
+                data = first[:obs]
             except TypeError:
                 data = first.more()
                 if data:
diff --git a/Lib/bz2.py b/Lib/bz2.py
--- a/Lib/bz2.py
+++ b/Lib/bz2.py
@@ -174,29 +174,31 @@
 
     # Fill the readahead buffer if it is empty. Returns False on EOF.
     def _fill_buffer(self):
-        if self._buffer:
-            return True
+        # Depending on the input data, our call to the decompressor may not
+        # return any data. In this case, try again after reading another block.
+        while True:
+            if self._buffer:
+                return True
 
-        if self._decompressor.unused_data:
-            rawblock = self._decompressor.unused_data
-        else:
-            rawblock = self._fp.read(_BUFFER_SIZE)
+            if self._decompressor.unused_data:
+                rawblock = self._decompressor.unused_data
+            else:
+                rawblock = self._fp.read(_BUFFER_SIZE)
 
-        if not rawblock:
+            if not rawblock:
+                if self._decompressor.eof:
+                    self._mode = _MODE_READ_EOF
+                    self._size = self._pos
+                    return False
+                else:
+                    raise EOFError("Compressed file ended before the "
+                                   "end-of-stream marker was reached")
+
+            # Continue to next stream.
             if self._decompressor.eof:
-                self._mode = _MODE_READ_EOF
-                self._size = self._pos
-                return False
-            else:
-                raise EOFError("Compressed file ended before the "
-                               "end-of-stream marker was reached")
+                self._decompressor = BZ2Decompressor()
 
-        # Continue to next stream.
-        if self._decompressor.eof:
-            self._decompressor = BZ2Decompressor()
-
-        self._buffer = self._decompressor.decompress(rawblock)
-        return True
+            self._buffer = self._decompressor.decompress(rawblock)
 
     # Read data until EOF.
     # If return_data is false, consume the data without returning it.
@@ -256,11 +258,14 @@
                 return self._read_block(size)
 
     def read1(self, size=-1):
-        """Read up to size uncompressed bytes with at most one read
-        from the underlying stream.
+        """Read up to size uncompressed bytes, while trying to avoid
+        making multiple reads from the underlying stream.
 
         Returns b'' if the file is at EOF.
         """
+        # Usually, read1() calls _fp.read() at most once. However, sometimes
+        # this does not give enough data for the decompressor to make progress.
+        # In this case we make multiple reads, to avoid returning b"".
         with self._lock:
             self._check_can_read()
             if (size == 0 or self._mode == _MODE_READ_EOF or

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list