| 258 | |
| 259 | |
| 260 | class _Unframer: |
| 261 | |
| 262 | def __init__(self, file_read, file_readline, file_tell=None): |
| 263 | self.file_read = file_read |
| 264 | self.file_readline = file_readline |
| 265 | self.current_frame = None |
| 266 | |
| 267 | def readinto(self, buf): |
| 268 | if self.current_frame: |
| 269 | n = self.current_frame.readinto(buf) |
| 270 | if n == 0 and len(buf) != 0: |
| 271 | self.current_frame = None |
| 272 | n = len(buf) |
| 273 | buf[:] = self.file_read(n) |
| 274 | return n |
| 275 | if n < len(buf): |
| 276 | raise UnpicklingError( |
| 277 | "pickle exhausted before end of frame") |
| 278 | return n |
| 279 | else: |
| 280 | n = len(buf) |
| 281 | buf[:] = self.file_read(n) |
| 282 | return n |
| 283 | |
| 284 | def read(self, n): |
| 285 | if self.current_frame: |
| 286 | data = self.current_frame.read(n) |
| 287 | if not data and n != 0: |
| 288 | self.current_frame = None |
| 289 | return self.file_read(n) |
| 290 | if len(data) < n: |
| 291 | raise UnpicklingError( |
| 292 | "pickle exhausted before end of frame") |
| 293 | return data |
| 294 | else: |
| 295 | return self._chunked_file_read(n) |
| 296 | |
| 297 | def readline(self): |
| 298 | if self.current_frame: |
| 299 | data = self.current_frame.readline() |
| 300 | if not data: |
| 301 | self.current_frame = None |
| 302 | return self.file_readline() |
| 303 | if data[-1] != b'\n'[0]: |
| 304 | raise UnpicklingError( |
| 305 | "pickle exhausted before end of frame") |
| 306 | return data |
| 307 | else: |
| 308 | return self.file_readline() |
| 309 | |
| 310 | def _chunked_file_read(self, size): |
| 311 | cursize = min(size, _MIN_READ_BUF_SIZE) |
| 312 | b = self.file_read(cursize) |
| 313 | while cursize < size and len(b) == cursize: |
| 314 | delta = min(cursize, size - cursize) |
| 315 | b += self.file_read(delta) |
| 316 | cursize += delta |
| 317 | return b |
no outgoing calls
no test coverage detected
searching dependent graphs…