@@ -1268,6 +1268,7 @@ typedef struct _GzipReaderStruct {
1268
1268
int64_t _pos ;
1269
1269
int64_t _size ;
1270
1270
PyObject * fp ;
1271
+ Py_buffer * memview ;
1271
1272
char stream_phase ;
1272
1273
char all_bytes_read ;
1273
1274
char closed ;
@@ -1278,7 +1279,12 @@ typedef struct _GzipReaderStruct {
1278
1279
1279
1280
static void GzipReader_dealloc (GzipReader * self )
1280
1281
{
1281
- PyMem_Free (self -> input_buffer );
1282
+ if (self -> memview == NULL ) {
1283
+ PyMem_Free (self -> input_buffer );
1284
+ } else {
1285
+ PyBuffer_Release (self -> memview );
1286
+ PyMem_Free (self -> memview );
1287
+ }
1282
1288
Py_XDECREF (self -> fp );
1283
1289
PyThread_free_lock (self -> lock );
1284
1290
Py_TYPE (self )-> tp_free (self );
@@ -1303,20 +1309,36 @@ GzipReader__new__(PyTypeObject *type, PyObject *args, PyObject *kwargs)
1303
1309
return NULL ;
1304
1310
}
1305
1311
GzipReader * self = PyObject_New (GzipReader , type );
1306
- self -> buffer_size = buffer_size ;
1307
- self -> input_buffer = PyMem_Malloc (self -> buffer_size );
1308
- if (self -> input_buffer == NULL ) {
1309
- Py_DECREF (self );
1310
- return PyErr_NoMemory ();
1312
+ if (PyObject_HasAttrString (fp , "read" )) {
1313
+ self -> memview = NULL ;
1314
+ self -> buffer_size = buffer_size ;
1315
+ self -> input_buffer = PyMem_Malloc (self -> buffer_size );
1316
+ if (self -> input_buffer == NULL ) {
1317
+ Py_DECREF (self );
1318
+ return PyErr_NoMemory ();
1319
+ }
1320
+ self -> buffer_end = self -> input_buffer ;
1321
+ self -> all_bytes_read = 0 ;
1322
+ } else {
1323
+ self -> memview = PyMem_Malloc (sizeof (Py_buffer ));
1324
+ if (self -> memview == NULL ) {
1325
+ return PyErr_NoMemory ();
1326
+ }
1327
+ if (PyObject_GetBuffer (fp , self -> memview , PyBUF_SIMPLE ) < 0 ) {
1328
+ Py_DECREF (self );
1329
+ return NULL ;
1330
+ }
1331
+ self -> buffer_size = self -> memview -> len ;
1332
+ self -> input_buffer = self -> memview -> buf ;
1333
+ self -> buffer_end = self -> input_buffer + self -> buffer_size ;
1334
+ self -> all_bytes_read = 1 ;
1311
1335
}
1312
1336
self -> current_pos = self -> input_buffer ;
1313
- self -> buffer_end = self -> current_pos ;
1314
1337
self -> _pos = 0 ;
1315
1338
self -> _size = -1 ;
1316
1339
Py_INCREF (fp );
1317
1340
self -> fp = fp ;
1318
1341
self -> stream_phase = GzipReader_HEADER ;
1319
- self -> all_bytes_read = 0 ;
1320
1342
self -> closed = 0 ;
1321
1343
self -> _last_mtime = 0 ;
1322
1344
self -> lock = PyThread_allocate_lock ();
0 commit comments