@@ -440,34 +440,30 @@ cdef class Unpacker(object):
440
440
self .buf_size = buf_size
441
441
self .buf_tail = tail + _buf_len
442
442
443
- cdef read_from_file(self ):
444
- next_bytes = self .file_like_read(
445
- min (self .read_size,
446
- self .max_buffer_size - (self .buf_tail - self .buf_head)
447
- ))
443
+ cdef int read_from_file(self ) except - 1 :
444
+ cdef Py_ssize_t remains = self .max_buffer_size - (self .buf_tail - self .buf_head)
445
+ if remains <= 0 :
446
+ raise BufferFull
447
+
448
+ next_bytes = self .file_like_read(min (self .read_size, remains))
448
449
if next_bytes:
449
450
self .append_buffer(PyBytes_AsString(next_bytes), PyBytes_Size(next_bytes))
450
451
else :
451
452
self .file_like = None
453
+ return 0
452
454
453
455
cdef object _unpack(self , execute_fn execute, bint iter = 0 ):
454
456
cdef int ret
455
457
cdef object obj
456
458
cdef Py_ssize_t prev_head
457
459
458
- if self .buf_head >= self .buf_tail and self .file_like is not None :
459
- self .read_from_file()
460
-
461
460
while 1 :
462
461
prev_head = self .buf_head
463
- if prev_head >= self .buf_tail:
464
- if iter :
465
- raise StopIteration (" No more data to unpack." )
466
- else :
467
- raise OutOfData(" No more data to unpack." )
468
-
469
- ret = execute(& self .ctx, self .buf, self .buf_tail, & self .buf_head)
470
- self .stream_offset += self .buf_head - prev_head
462
+ if prev_head < self .buf_tail:
463
+ ret = execute(& self .ctx, self .buf, self .buf_tail, & self .buf_head)
464
+ self .stream_offset += self .buf_head - prev_head
465
+ else :
466
+ ret = 0
471
467
472
468
if ret == 1 :
473
469
obj = unpack_data(& self .ctx)
0 commit comments