mirror of https://github.com/python/cpython
Fix refleaks in test_unicode and test_string related to the new format code.
Stop polluting namespace.
This commit is contained in:
parent
2bad970293
commit
8a4eb298e2
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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,
|
||||
tuple = PyTuple_Pack(5, is_markup_bool, literal_str,
|
||||
field_name_str, format_spec_str,
|
||||
conversion_str);
|
||||
if (result == NULL)
|
||||
goto error;
|
||||
|
||||
return result;
|
||||
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 **************************/
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue