From 8a4eb298e25580241feb190cb3c3cc492fa65369 Mon Sep 17 00:00:00 2001 From: Neal Norwitz Date: Mon, 27 Aug 2007 07:24:17 +0000 Subject: Fix refleaks in test_unicode and test_string related to the new format code. Stop polluting namespace. --- Include/unicodeobject.h | 6 ++--- Objects/stringlib/string_format.h | 1 + Objects/unicodeobject.c | 50 ++++++++++++++++----------------------- Python/sysmodule.c | 8 +++---- 4 files changed, 27 insertions(+), 38 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index bc94a53..8184f3a 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -1437,10 +1437,8 @@ PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strchr( const Py_UNICODE *s, Py_UNICODE c ); -PyObject * -_unicodeformatter_iterator(PyObject *str); -PyObject * -_unicodeformatter_field_name_split(PyObject *field_name); +PyObject *_PyUnicode_FormatterIterator(PyObject *str); +PyObject *_PyUnicode_FormatterFieldNameSplit(PyObject *field_name); #ifdef __cplusplus } diff --git a/Objects/stringlib/string_format.h b/Objects/stringlib/string_format.h index 4ae7e57..c2916fd 100644 --- a/Objects/stringlib/string_format.h +++ b/Objects/stringlib/string_format.h @@ -416,6 +416,7 @@ get_field_object(SubString *input, PyObject *args, PyObject *kwargs) Py_DECREF(key); goto error; } + Py_DECREF(key); Py_INCREF(obj); } else { /* look up in args */ diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 1421bb2..84f55b5 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9206,11 +9206,11 @@ formatteriter_next(formatteriterobject *it) PyObject *field_name_str = NULL; PyObject *format_spec_str = NULL; PyObject *conversion_str = NULL; - PyObject *result = NULL; + PyObject *tuple = NULL; is_markup_bool = PyBool_FromLong(is_markup); if (!is_markup_bool) - goto error; + return NULL; if (is_markup) { /* field_name, format_spec, and conversion are @@ -9251,22 +9251,16 @@ formatteriter_next(formatteriterobject *it) Py_INCREF(format_spec_str); Py_INCREF(conversion_str); } - /* return a tuple of values */ - result = PyTuple_Pack(5, is_markup_bool, literal_str, - field_name_str, format_spec_str, - conversion_str); - if (result == NULL) - goto error; - - return result; + tuple = PyTuple_Pack(5, is_markup_bool, literal_str, + field_name_str, format_spec_str, + conversion_str); error: Py_XDECREF(is_markup_bool); Py_XDECREF(literal_str); Py_XDECREF(field_name_str); Py_XDECREF(format_spec_str); Py_XDECREF(conversion_str); - Py_XDECREF(result); - return NULL; + return tuple; } } @@ -9308,10 +9302,11 @@ PyTypeObject PyFormatterIter_Type = { }; PyObject * -_unicodeformatter_iterator(PyObject *str) +_PyUnicode_FormatterIterator(PyObject *str) { formatteriterobject *it; + assert(PyUnicode_Check(str)); it = PyObject_New(formatteriterobject, &PyFormatterIter_Type); if (it == NULL) return NULL; @@ -9440,21 +9435,24 @@ static PyTypeObject PyFieldNameIter_Type = { 0}; PyObject * -_unicodeformatter_field_name_split(PyObject *field_name) +_PyUnicode_FormatterFieldNameSplit(PyObject *field_name) { SubString first; Py_ssize_t first_idx; fieldnameiterobject *it; PyObject *first_obj = NULL; - PyObject *it_obj = NULL; - PyObject *result; + PyObject *result = NULL; + assert(PyUnicode_Check(field_name)); it = PyObject_New(fieldnameiterobject, &PyFieldNameIter_Type); if (it == NULL) - goto error; - it->str = NULL; - it_obj = (PyObject *)it; + return NULL; + + /* take ownership, give the object to the iterator. this is + just to keep the field_name alive */ + Py_INCREF(field_name); + it->str = field_name; if (!field_name_split(STRINGLIB_STR(field_name), STRINGLIB_LEN(field_name), @@ -9470,21 +9468,13 @@ _unicodeformatter_field_name_split(PyObject *field_name) if (first_obj == NULL) goto error; - /* take ownership, give the object to the iterator. this is - just to keep the field_name alive */ - Py_INCREF(field_name); - it->str = field_name; - /* return a tuple of values */ - result = PyTuple_Pack(2, first_obj, it_obj); - if (result == NULL) - goto error; + result = PyTuple_Pack(2, first_obj, it); - return result; error: - Py_XDECREF(it_obj); + Py_XDECREF(it); Py_XDECREF(first_obj); - return NULL; + return result; } /********************* Unicode Iterator **************************/ diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 0c84db0..3d9acd7 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -663,7 +663,7 @@ sys_current_frames(PyObject *self, PyObject *noargs) /* sys_formatter_iterator is used to implement string.Formatter.vformat. it parses a string and returns tuples describing the parsed elements. see unicodeobject.c's - _unicodeformatter_iterator for details */ + _PyUnicode_FormatterIterator for details */ static PyObject * sys_formatter_iterator(PyObject *self, PyObject *args) { @@ -680,14 +680,14 @@ sys_formatter_iterator(PyObject *self, PyObject *args) return NULL; } - return _unicodeformatter_iterator(str); + return _PyUnicode_FormatterIterator(str); } /* sys_formatter_field_name_split is used to implement string.Formatter.vformat. it takes an PEP 3101 "field name", and returns a tuple of (first, rest): "first", the part before the first '.' or '['; and "rest", an iterator for the rest of the field - name. see unicodeobjects' _unicode_formatter_field_name_split for + name. see unicodeobjects' _PyUnicode_FormatterFieldNameSplit for details */ static PyObject * sys_formatter_field_name_split(PyObject *self, PyObject *args) @@ -704,7 +704,7 @@ sys_formatter_field_name_split(PyObject *self, PyObject *args) return NULL; } - return _unicodeformatter_field_name_split(field_name); + return _PyUnicode_FormatterFieldNameSplit(field_name); } -- cgit v0.12