mirror of https://github.com/python/cpython
Ensure that PySet_Add() operates on a newly created frozenset, like PyTuple_SetItem does.
Add PyFrozenSet_Check(), which was not needed before; The list of Py*Set_Check* macros seems to be complete now. Add missing NEWS entries about all this.
This commit is contained in:
parent
e6a8074892
commit
cab3d98ca1
|
@ -58,6 +58,13 @@ the constructor functions work with any iterable Python object.
|
||||||
|
|
||||||
.. versionadded:: 2.6
|
.. versionadded:: 2.6
|
||||||
|
|
||||||
|
.. cfunction:: int PyFrozenSet_Check(PyObject *p)
|
||||||
|
|
||||||
|
Return true if *p* is a :class:`frozenset` object or an instance of a
|
||||||
|
subtype.
|
||||||
|
|
||||||
|
.. versionadded:: 2.6
|
||||||
|
|
||||||
.. cfunction:: int PyAnySet_Check(PyObject *p)
|
.. cfunction:: int PyAnySet_Check(PyObject *p)
|
||||||
|
|
||||||
Return true if *p* is a :class:`set` object, a :class:`frozenset` object, or an
|
Return true if *p* is a :class:`set` object, a :class:`frozenset` object, or an
|
||||||
|
|
|
@ -74,7 +74,11 @@ PyAPI_DATA(PyTypeObject) PyFrozenSet_Type;
|
||||||
PyType_IsSubtype(Py_TYPE(ob), &PySet_Type) || \
|
PyType_IsSubtype(Py_TYPE(ob), &PySet_Type) || \
|
||||||
PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type))
|
PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type))
|
||||||
#define PySet_Check(ob) \
|
#define PySet_Check(ob) \
|
||||||
(Py_TYPE(ob) == &PySet_Type || PyType_IsSubtype(Py_TYPE(ob), &PySet_Type))
|
(Py_TYPE(ob) == &PySet_Type || \
|
||||||
|
PyType_IsSubtype(Py_TYPE(ob), &PySet_Type))
|
||||||
|
#define PyFrozenSet_Check(ob) \
|
||||||
|
(Py_TYPE(ob) == &PyFrozenSet_Type || \\
|
||||||
|
PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type))
|
||||||
|
|
||||||
PyAPI_FUNC(PyObject *) PySet_New(PyObject *);
|
PyAPI_FUNC(PyObject *) PySet_New(PyObject *);
|
||||||
PyAPI_FUNC(PyObject *) PyFrozenSet_New(PyObject *);
|
PyAPI_FUNC(PyObject *) PyFrozenSet_New(PyObject *);
|
||||||
|
|
|
@ -1471,6 +1471,12 @@ Build
|
||||||
C API
|
C API
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
- ``PySet_Add()`` can now modify a newly created frozenset. Similarly to
|
||||||
|
``PyTuple_SetItem``, it can be used to populate a brand new frozenset; but
|
||||||
|
it does not steal a reference to the added item.
|
||||||
|
|
||||||
|
- Added ``PySet_Check()`` and ``PyFrozenSet_Check()`` to the set API.
|
||||||
|
|
||||||
- Backport of PyUnicode_FromString(), _FromStringAndSize(), _Format and
|
- Backport of PyUnicode_FromString(), _FromStringAndSize(), _Format and
|
||||||
_FormatV from Python 3.0. Made PyLong_AsSsize_t and PyLong_FromSsize_t
|
_FormatV from Python 3.0. Made PyLong_AsSsize_t and PyLong_FromSsize_t
|
||||||
public functions.
|
public functions.
|
||||||
|
|
|
@ -2188,7 +2188,8 @@ PySet_Discard(PyObject *set, PyObject *key)
|
||||||
int
|
int
|
||||||
PySet_Add(PyObject *anyset, PyObject *key)
|
PySet_Add(PyObject *anyset, PyObject *key)
|
||||||
{
|
{
|
||||||
if (!PyAnySet_Check(anyset)) {
|
if (!PySet_Check(anyset) &&
|
||||||
|
(!PyFrozenSet_Check(anyset) || Py_REFCNT(anyset) != 1)) {
|
||||||
PyErr_BadInternalCall();
|
PyErr_BadInternalCall();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -2306,6 +2307,10 @@ test_c_api(PySetObject *so)
|
||||||
f = PyFrozenSet_New(dup);
|
f = PyFrozenSet_New(dup);
|
||||||
assertRaises(PySet_Clear(f) == -1, PyExc_SystemError);
|
assertRaises(PySet_Clear(f) == -1, PyExc_SystemError);
|
||||||
assertRaises(_PySet_Update(f, dup) == -1, PyExc_SystemError);
|
assertRaises(_PySet_Update(f, dup) == -1, PyExc_SystemError);
|
||||||
|
assert(PySet_Add(f, elem) == 0);
|
||||||
|
Py_INCREF(f);
|
||||||
|
assertRaises(PySet_Add(f, elem) == -1, PyExc_SystemError);
|
||||||
|
Py_DECREF(f);
|
||||||
Py_DECREF(f);
|
Py_DECREF(f);
|
||||||
|
|
||||||
/* Exercise direct iteration */
|
/* Exercise direct iteration */
|
||||||
|
|
Loading…
Reference in New Issue