Fix reference leaks introduced by the recent incremental codec

changes.
This commit is contained in:
Hye-Shik Chang 2006-03-27 08:24:54 +00:00
parent 40108c97fb
commit b9c03e999f
2 changed files with 52 additions and 41 deletions

View File

@ -758,7 +758,9 @@ encoder_encode_stateful(MultibyteStatefulEncoderContext *ctx,
datalen, ctx->errors, final ? MBENC_FLUSH : 0);
if (r == NULL) {
/* recover the original pending buffer */
memcpy(ctx->pending, inbuf_tmp, Py_UNICODE_SIZE * origpending);
if (origpending > 0)
memcpy(ctx->pending, inbuf_tmp,
Py_UNICODE_SIZE * origpending);
ctx->pendingsize = origpending;
goto errorexit;
}
@ -887,17 +889,9 @@ static PyObject *
mbiencoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
MultibyteIncrementalEncoderObject *self;
PyObject *codec;
PyObject *codec = NULL;
char *errors = NULL;
codec = PyObject_GetAttrString((PyObject *)type, "codec");
if (codec == NULL)
return NULL;
if (!MultibyteCodec_Check(codec)) {
PyErr_SetString(PyExc_TypeError, "codec is unexpected type");
return NULL;
}
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|s:IncrementalEncoder",
incnewkwarglist, &errors))
return NULL;
@ -906,6 +900,14 @@ mbiencoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
if (self == NULL)
return NULL;
codec = PyObject_GetAttrString((PyObject *)type, "codec");
if (codec == NULL)
goto errorexit;
if (!MultibyteCodec_Check(codec)) {
PyErr_SetString(PyExc_TypeError, "codec is unexpected type");
goto errorexit;
}
self->codec = ((MultibyteCodecObject *)codec)->codec;
self->pendingsize = 0;
self->errors = internal_error_callback(errors);
@ -915,10 +917,12 @@ mbiencoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
self->codec->encinit(&self->state, self->codec->config) != 0)
goto errorexit;
Py_DECREF(codec);
return (PyObject *)self;
errorexit:
Py_XDECREF(self);
Py_XDECREF(codec);
return NULL;
}
@ -1080,17 +1084,9 @@ static PyObject *
mbidecoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
MultibyteIncrementalDecoderObject *self;
PyObject *codec;
PyObject *codec = NULL;
char *errors = NULL;
codec = PyObject_GetAttrString((PyObject *)type, "codec");
if (codec == NULL)
return NULL;
if (!MultibyteCodec_Check(codec)) {
PyErr_SetString(PyExc_TypeError, "codec is unexpected type");
return NULL;
}
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|s:IncrementalDecoder",
incnewkwarglist, &errors))
return NULL;
@ -1099,6 +1095,14 @@ mbidecoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
if (self == NULL)
return NULL;
codec = PyObject_GetAttrString((PyObject *)type, "codec");
if (codec == NULL)
goto errorexit;
if (!MultibyteCodec_Check(codec)) {
PyErr_SetString(PyExc_TypeError, "codec is unexpected type");
goto errorexit;
}
self->codec = ((MultibyteCodecObject *)codec)->codec;
self->pendingsize = 0;
self->errors = internal_error_callback(errors);
@ -1108,10 +1112,12 @@ mbidecoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
self->codec->decinit(&self->state, self->codec->config) != 0)
goto errorexit;
Py_DECREF(codec);
return (PyObject *)self;
errorexit:
Py_XDECREF(self);
Py_XDECREF(codec);
return NULL;
}
@ -1381,17 +1387,9 @@ static PyObject *
mbstreamreader_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
MultibyteStreamReaderObject *self;
PyObject *codec, *stream;
PyObject *stream, *codec = NULL;
char *errors = NULL;
codec = PyObject_GetAttrString((PyObject *)type, "codec");
if (codec == NULL)
return NULL;
if (!MultibyteCodec_Check(codec)) {
PyErr_SetString(PyExc_TypeError, "codec is unexpected type");
return NULL;
}
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|s:StreamReader",
streamkwarglist, &stream, &errors))
return NULL;
@ -1400,6 +1398,14 @@ mbstreamreader_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
if (self == NULL)
return NULL;
codec = PyObject_GetAttrString((PyObject *)type, "codec");
if (codec == NULL)
goto errorexit;
if (!MultibyteCodec_Check(codec)) {
PyErr_SetString(PyExc_TypeError, "codec is unexpected type");
goto errorexit;
}
self->codec = ((MultibyteCodecObject *)codec)->codec;
self->stream = stream;
Py_INCREF(stream);
@ -1411,10 +1417,12 @@ mbstreamreader_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
self->codec->decinit(&self->state, self->codec->config) != 0)
goto errorexit;
Py_DECREF(codec);
return (PyObject *)self;
errorexit:
Py_XDECREF(self);
Py_XDECREF(codec);
return NULL;
}
@ -1501,6 +1509,7 @@ mbstreamwriter_iwrite(MultibyteStreamWriterObject *self,
if (wr == NULL)
return -1;
Py_DECREF(wr);
return 0;
}
@ -1583,17 +1592,9 @@ static PyObject *
mbstreamwriter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
MultibyteStreamWriterObject *self;
PyObject *codec, *stream;
PyObject *stream, *codec = NULL;
char *errors = NULL;
codec = PyObject_GetAttrString((PyObject *)type, "codec");
if (codec == NULL)
return NULL;
if (!MultibyteCodec_Check(codec)) {
PyErr_SetString(PyExc_TypeError, "codec is unexpected type");
return NULL;
}
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|s:StreamWriter",
streamkwarglist, &stream, &errors))
return NULL;
@ -1602,6 +1603,14 @@ mbstreamwriter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
if (self == NULL)
return NULL;
codec = PyObject_GetAttrString((PyObject *)type, "codec");
if (codec == NULL)
goto errorexit;
if (!MultibyteCodec_Check(codec)) {
PyErr_SetString(PyExc_TypeError, "codec is unexpected type");
goto errorexit;
}
self->codec = ((MultibyteCodecObject *)codec)->codec;
self->stream = stream;
Py_INCREF(stream);
@ -1613,10 +1622,12 @@ mbstreamwriter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
self->codec->encinit(&self->state, self->codec->config) != 0)
goto errorexit;
Py_DECREF(codec);
return (PyObject *)self;
errorexit:
Py_XDECREF(self);
Py_XDECREF(codec);
return NULL;
}

View File

@ -123,10 +123,10 @@ typedef struct {
#define ERROR_IGNORE (PyObject *)(2)
#define ERROR_REPLACE (PyObject *)(3)
#define ERROR_ISCUSTOM(p) ((p) < ERROR_STRICT || ERROR_REPLACE < (p))
#define ERROR_DECREF(p) do { \
if (ERROR_ISCUSTOM(p)) { \
Py_DECREF(p); \
} \
#define ERROR_DECREF(p) do { \
if (p != NULL && ERROR_ISCUSTOM(p)) { \
Py_DECREF(p); \
} \
} while (0);
#define MBENC_FLUSH 0x0001 /* encode all characters encodable */