@@ -440,34 +440,30 @@ cdef class Unpacker(object):
440440 self .buf_size = buf_size
441441 self .buf_tail = tail + _buf_len
442442
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))
448449 if next_bytes:
449450 self .append_buffer(PyBytes_AsString(next_bytes), PyBytes_Size(next_bytes))
450451 else :
451452 self .file_like = None
453+ return 0
452454
453455 cdef object _unpack(self , execute_fn execute, bint iter = 0 ):
454456 cdef int ret
455457 cdef object obj
456458 cdef Py_ssize_t prev_head
457459
458- if self .buf_head >= self .buf_tail and self .file_like is not None :
459- self .read_from_file()
460-
461460 while 1 :
462461 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
471467
472468 if ret == 1 :
473469 obj = unpack_data(& self .ctx)
0 commit comments