equal
deleted
inserted
replaced
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", |