contrib/python-zstandard/c-ext/decompressionwriter.c
changeset 31796 e0dc40530c5a
parent 30895 c32454d69b85
child 37495 b1fb341d8a61
equal deleted inserted replaced
31795:2b130e26c3a4 31796:e0dc40530c5a
    16 
    16 
    17 static void ZstdDecompressionWriter_dealloc(ZstdDecompressionWriter* self) {
    17 static void ZstdDecompressionWriter_dealloc(ZstdDecompressionWriter* self) {
    18 	Py_XDECREF(self->decompressor);
    18 	Py_XDECREF(self->decompressor);
    19 	Py_XDECREF(self->writer);
    19 	Py_XDECREF(self->writer);
    20 
    20 
    21 	if (self->dstream) {
       
    22 		ZSTD_freeDStream(self->dstream);
       
    23 		self->dstream = NULL;
       
    24 	}
       
    25 
       
    26 	PyObject_Del(self);
    21 	PyObject_Del(self);
    27 }
    22 }
    28 
    23 
    29 static PyObject* ZstdDecompressionWriter_enter(ZstdDecompressionWriter* self) {
    24 static PyObject* ZstdDecompressionWriter_enter(ZstdDecompressionWriter* self) {
    30 	if (self->entered) {
    25 	if (self->entered) {
    31 		PyErr_SetString(ZstdError, "cannot __enter__ multiple times");
    26 		PyErr_SetString(ZstdError, "cannot __enter__ multiple times");
    32 		return NULL;
    27 		return NULL;
    33 	}
    28 	}
    34 
    29 
    35 	self->dstream = DStream_from_ZstdDecompressor(self->decompressor);
    30 	if (0 != init_dstream(self->decompressor)) {
    36 	if (!self->dstream) {
       
    37 		return NULL;
    31 		return NULL;
    38 	}
    32 	}
    39 
    33 
    40 	self->entered = 1;
    34 	self->entered = 1;
    41 
    35 
    44 }
    38 }
    45 
    39 
    46 static PyObject* ZstdDecompressionWriter_exit(ZstdDecompressionWriter* self, PyObject* args) {
    40 static PyObject* ZstdDecompressionWriter_exit(ZstdDecompressionWriter* self, PyObject* args) {
    47 	self->entered = 0;
    41 	self->entered = 0;
    48 
    42 
    49 	if (self->dstream) {
       
    50 		ZSTD_freeDStream(self->dstream);
       
    51 		self->dstream = NULL;
       
    52 	}
       
    53 
       
    54 	Py_RETURN_FALSE;
    43 	Py_RETURN_FALSE;
    55 }
    44 }
    56 
    45 
    57 static PyObject* ZstdDecompressionWriter_memory_size(ZstdDecompressionWriter* self) {
    46 static PyObject* ZstdDecompressionWriter_memory_size(ZstdDecompressionWriter* self) {
    58 	if (!self->dstream) {
    47 	if (!self->decompressor->dstream) {
    59 		PyErr_SetString(ZstdError, "cannot determine size of inactive decompressor; "
    48 		PyErr_SetString(ZstdError, "cannot determine size of inactive decompressor; "
    60 			"call when context manager is active");
    49 			"call when context manager is active");
    61 		return NULL;
    50 		return NULL;
    62 	}
    51 	}
    63 
    52 
    64 	return PyLong_FromSize_t(ZSTD_sizeof_DStream(self->dstream));
    53 	return PyLong_FromSize_t(ZSTD_sizeof_DStream(self->decompressor->dstream));
    65 }
    54 }
    66 
    55 
    67 static PyObject* ZstdDecompressionWriter_write(ZstdDecompressionWriter* self, PyObject* args) {
    56 static PyObject* ZstdDecompressionWriter_write(ZstdDecompressionWriter* self, PyObject* args) {
    68 	const char* source;
    57 	const char* source;
    69 	Py_ssize_t sourceSize;
    58 	Py_ssize_t sourceSize;
    84 	if (!self->entered) {
    73 	if (!self->entered) {
    85 		PyErr_SetString(ZstdError, "write must be called from an active context manager");
    74 		PyErr_SetString(ZstdError, "write must be called from an active context manager");
    86 		return NULL;
    75 		return NULL;
    87 	}
    76 	}
    88 
    77 
       
    78 	assert(self->decompressor->dstream);
       
    79 
    89 	output.dst = PyMem_Malloc(self->outSize);
    80 	output.dst = PyMem_Malloc(self->outSize);
    90 	if (!output.dst) {
    81 	if (!output.dst) {
    91 		return PyErr_NoMemory();
    82 		return PyErr_NoMemory();
    92 	}
    83 	}
    93 	output.size = self->outSize;
    84 	output.size = self->outSize;
    97 	input.size = sourceSize;
    88 	input.size = sourceSize;
    98 	input.pos = 0;
    89 	input.pos = 0;
    99 
    90 
   100 	while ((ssize_t)input.pos < sourceSize) {
    91 	while ((ssize_t)input.pos < sourceSize) {
   101 		Py_BEGIN_ALLOW_THREADS
    92 		Py_BEGIN_ALLOW_THREADS
   102 		zresult = ZSTD_decompressStream(self->dstream, &output, &input);
    93 		zresult = ZSTD_decompressStream(self->decompressor->dstream, &output, &input);
   103 		Py_END_ALLOW_THREADS
    94 		Py_END_ALLOW_THREADS
   104 
    95 
   105 		if (ZSTD_isError(zresult)) {
    96 		if (ZSTD_isError(zresult)) {
   106 			PyMem_Free(output.dst);
    97 			PyMem_Free(output.dst);
   107 			PyErr_Format(ZstdError, "zstd decompress error: %s",
    98 			PyErr_Format(ZstdError, "zstd decompress error: %s",