contrib/python-zstandard/c-ext/decompressoriterator.c
changeset 37495 b1fb341d8a61
parent 31796 e0dc40530c5a
child 42070 675775c33ab6
equal deleted inserted replaced
37494:1ce7a55b09d1 37495:b1fb341d8a61
    18 
    18 
    19 static void ZstdDecompressorIterator_dealloc(ZstdDecompressorIterator* self) {
    19 static void ZstdDecompressorIterator_dealloc(ZstdDecompressorIterator* self) {
    20 	Py_XDECREF(self->decompressor);
    20 	Py_XDECREF(self->decompressor);
    21 	Py_XDECREF(self->reader);
    21 	Py_XDECREF(self->reader);
    22 
    22 
    23 	if (self->buffer) {
    23 	if (self->buffer.buf) {
    24 		PyBuffer_Release(self->buffer);
    24 		PyBuffer_Release(&self->buffer);
    25 		PyMem_FREE(self->buffer);
    25 		memset(&self->buffer, 0, sizeof(self->buffer));
    26 		self->buffer = NULL;
       
    27 	}
    26 	}
    28 
    27 
    29 	if (self->input.src) {
    28 	if (self->input.src) {
    30 		PyMem_Free((void*)self->input.src);
    29 		PyMem_Free((void*)self->input.src);
    31 		self->input.src = NULL;
    30 		self->input.src = NULL;
    43 	size_t zresult;
    42 	size_t zresult;
    44 	PyObject* chunk;
    43 	PyObject* chunk;
    45 	DecompressorIteratorResult result;
    44 	DecompressorIteratorResult result;
    46 	size_t oldInputPos = self->input.pos;
    45 	size_t oldInputPos = self->input.pos;
    47 
    46 
    48 	assert(self->decompressor->dstream);
       
    49 
       
    50 	result.chunk = NULL;
    47 	result.chunk = NULL;
    51 
    48 
    52 	chunk = PyBytes_FromStringAndSize(NULL, self->outSize);
    49 	chunk = PyBytes_FromStringAndSize(NULL, self->outSize);
    53 	if (!chunk) {
    50 	if (!chunk) {
    54 		result.errored = 1;
    51 		result.errored = 1;
    58 	self->output.dst = PyBytes_AsString(chunk);
    55 	self->output.dst = PyBytes_AsString(chunk);
    59 	self->output.size = self->outSize;
    56 	self->output.size = self->outSize;
    60 	self->output.pos = 0;
    57 	self->output.pos = 0;
    61 
    58 
    62 	Py_BEGIN_ALLOW_THREADS
    59 	Py_BEGIN_ALLOW_THREADS
    63 	zresult = ZSTD_decompressStream(self->decompressor->dstream, &self->output, &self->input);
    60 	zresult = ZSTD_decompress_generic(self->decompressor->dctx, &self->output, &self->input);
    64 	Py_END_ALLOW_THREADS
    61 	Py_END_ALLOW_THREADS
    65 
    62 
    66 	/* We're done with the pointer. Nullify to prevent anyone from getting a
    63 	/* We're done with the pointer. Nullify to prevent anyone from getting a
    67 	handle on a Python object. */
    64 	handle on a Python object. */
    68 	self->output.dst = NULL;
    65 	self->output.dst = NULL;
    84 	}
    81 	}
    85 
    82 
    86 	/* If it produced output data, return it. */
    83 	/* If it produced output data, return it. */
    87 	if (self->output.pos) {
    84 	if (self->output.pos) {
    88 		if (self->output.pos < self->outSize) {
    85 		if (self->output.pos < self->outSize) {
    89 			if (_PyBytes_Resize(&chunk, self->output.pos)) {
    86 			if (safe_pybytes_resize(&chunk, self->output.pos)) {
       
    87 				Py_XDECREF(chunk);
    90 				result.errored = 1;
    88 				result.errored = 1;
    91 				return result;
    89 				return result;
    92 			}
    90 			}
    93 		}
    91 		}
    94 	}
    92 	}
   135 			}
   133 			}
   136 
   134 
   137 			PyBytes_AsStringAndSize(readResult, &readBuffer, &readSize);
   135 			PyBytes_AsStringAndSize(readResult, &readBuffer, &readSize);
   138 		}
   136 		}
   139 		else {
   137 		else {
   140 			assert(self->buffer && self->buffer->buf);
   138 			assert(self->buffer.buf);
   141 
   139 
   142 			/* Only support contiguous C arrays for now */
   140 			/* Only support contiguous C arrays for now */
   143 			assert(self->buffer->strides == NULL && self->buffer->suboffsets == NULL);
   141 			assert(self->buffer.strides == NULL && self->buffer.suboffsets == NULL);
   144 			assert(self->buffer->itemsize == 1);
   142 			assert(self->buffer.itemsize == 1);
   145 
   143 
   146 			/* TODO avoid memcpy() below */
   144 			/* TODO avoid memcpy() below */
   147 			readBuffer = (char *)self->buffer->buf + self->bufferOffset;
   145 			readBuffer = (char *)self->buffer.buf + self->bufferOffset;
   148 			bufferRemaining = self->buffer->len - self->bufferOffset;
   146 			bufferRemaining = self->buffer.len - self->bufferOffset;
   149 			readSize = min(bufferRemaining, (Py_ssize_t)self->inSize);
   147 			readSize = min(bufferRemaining, (Py_ssize_t)self->inSize);
   150 			self->bufferOffset += readSize;
   148 			self->bufferOffset += readSize;
   151 		}
   149 		}
   152 
   150 
   153 		if (readSize) {
   151 		if (readSize) {