[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

AltStyle によって変換されたページ (->オリジナル) /