@@ -166,6 +166,11 @@ def __init__(self, file_like=None, read_size=0, use_list=True,
166
166
self ._fb_buf_o = 0
167
167
self ._fb_buf_i = 0
168
168
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
169
174
self ._max_buffer_size = max_buffer_size or 2 ** 31 - 1
170
175
if read_size > self ._max_buffer_size :
171
176
raise ValueError ("read_size must be smaller than max_buffer_size" )
@@ -196,7 +201,8 @@ def feed(self, next_bytes):
196
201
elif isinstance (next_bytes , bytearray ):
197
202
next_bytes = bytes (next_bytes )
198
203
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 ):
200
206
raise BufferFull
201
207
self ._fb_buf_n += len (next_bytes )
202
208
self ._fb_buffers .append (next_bytes )
@@ -208,6 +214,10 @@ def _fb_sloppy_consume(self):
208
214
self ._fb_buf_n -= len (self ._fb_buffers [i ])
209
215
self ._fb_buffers = self ._fb_buffers [self ._fb_buf_i :]
210
216
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
211
221
212
222
def _fb_consume (self ):
213
223
""" Gets rid of the used parts of the buffer. """
@@ -222,6 +232,7 @@ def _fb_consume(self):
222
232
else :
223
233
self ._fb_buf_n = 0
224
234
self ._fb_buf_o = 0
235
+ self ._fb_sloppiness = 0
225
236
226
237
def _fb_got_extradata (self ):
227
238
if self ._fb_buf_i != len (self ._fb_buffers ):
0 commit comments