]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Fix refleaks in test_unicode and test_string related to the new format code.
authorNeal Norwitz <nnorwitz@gmail.com>
Mon, 27 Aug 2007 07:24:17 +0000 (07:24 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Mon, 27 Aug 2007 07:24:17 +0000 (07:24 +0000)
Stop polluting namespace.

Include/unicodeobject.h
Objects/stringlib/string_format.h
Objects/unicodeobject.c
Python/sysmodule.c

index bc94a53e06a3e43ec03cadde2b7e7181af0ab7f6..8184f3af77b5d73b45026a0efba060527b0bdd97 100644 (file)
@@ -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
 }
index 4ae7e578f24b111657fb72a59846bedf9f10cc3c..c2916fdd5667e744b0737f13db7441e8c5c60014 100644 (file)
@@ -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 */
index 1421bb2742f5cd49a6b97ba431fc88dd41c8df75..84f55b5e9f61ada58ee1b8b1553be347b9027497 100644 (file)
@@ -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 **************************/
index 0c84db02f5bd759279d33216459f02a34ebe7d89..3d9acd719573decd0790bd389677543d41163f95 100644 (file)
@@ -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);
 }