equal
deleted
inserted
replaced
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) { |