@@ -166,6 +166,11 @@ def __init__(self, file_like=None, read_size=0, use_list=True,
166166 self ._fb_buf_o = 0
167167 self ._fb_buf_i = 0
168168 self ._fb_buf_n = 0
169+ # When Unpacker is used as an iterable, between the calls to next(),
170+ # the buffer is not "consumed" completely, for efficiency sake.
171+ # Instead, it is done sloppily. To make sure we raise BufferFull at
172+ # the correct moments, we have to keep track of how sloppy we were.
173+ self ._fb_sloppiness = 0
169174 self ._max_buffer_size = max_buffer_size or 2 ** 31 - 1
170175 if read_size > self ._max_buffer_size :
171176 raise ValueError ("read_size must be smaller than max_buffer_size" )
@@ -196,7 +201,8 @@ def feed(self, next_bytes):
196201 elif isinstance (next_bytes , bytearray ):
197202 next_bytes = bytes (next_bytes )
198203 assert self ._fb_feeding
199- if self ._fb_buf_n + len (next_bytes ) > self ._max_buffer_size :
204+ if (self ._fb_buf_n + len (next_bytes ) - self ._fb_sloppiness
205+ > self ._max_buffer_size ):
200206 raise BufferFull
201207 self ._fb_buf_n += len (next_bytes )
202208 self ._fb_buffers .append (next_bytes )
@@ -208,6 +214,10 @@ def _fb_sloppy_consume(self):
208214 self ._fb_buf_n -= len (self ._fb_buffers [i ])
209215 self ._fb_buffers = self ._fb_buffers [self ._fb_buf_i :]
210216 self ._fb_buf_i = 0
217+ if self ._fb_buffers :
218+ self ._fb_sloppiness = self ._fb_buf_o
219+ else :
220+ self ._fb_sloppiness = 0
211221
212222 def _fb_consume (self ):
213223 """ Gets rid of the used parts of the buffer. """
@@ -222,6 +232,7 @@ def _fb_consume(self):
222232 else :
223233 self ._fb_buf_n = 0
224234 self ._fb_buf_o = 0
235+ self ._fb_sloppiness = 0
225236
226237 def _fb_got_extradata (self ):
227238 if self ._fb_buf_i != len (self ._fb_buffers ):
0 commit comments