diff options
author | Victor Stinner <vstinner@python.org> | 2020-06-23 12:07:52 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-23 12:07:52 (GMT) |
commit | 261cfedf7657a515e04428bba58eba2a9bb88208 (patch) | |
tree | f242ee74773b9e46c63f0bf99e1ddc6b932a00b6 /Objects/setobject.c | |
parent | b4e85cadfbc2b1b24ec5f3159e351dbacedaa5e0 (diff) | |
download | cpython-261cfedf7657a515e04428bba58eba2a9bb88208.zip cpython-261cfedf7657a515e04428bba58eba2a9bb88208.tar.gz cpython-261cfedf7657a515e04428bba58eba2a9bb88208.tar.bz2 |
bpo-40521: Make the empty frozenset per interpreter (GH-21068)
Each interpreter now has its own empty frozenset singleton.
Diffstat (limited to 'Objects/setobject.c')
-rw-r--r-- | Objects/setobject.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/Objects/setobject.c b/Objects/setobject.c index 76b1944..69bfc7d 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -975,12 +975,11 @@ make_new_set_basetype(PyTypeObject *type, PyObject *iterable) return make_new_set(type, iterable); } -/* The empty frozenset is a singleton */ -static PyObject *emptyfrozenset = NULL; - static PyObject * make_new_frozenset(PyTypeObject *type, PyObject *iterable) { + PyObject *res; + if (type != &PyFrozenSet_Type) { return make_new_set(type, iterable); } @@ -991,7 +990,7 @@ make_new_frozenset(PyTypeObject *type, PyObject *iterable) Py_INCREF(iterable); return iterable; } - PyObject *res = make_new_set((PyTypeObject *)type, iterable); + res = make_new_set((PyTypeObject *)type, iterable); if (res == NULL || PySet_GET_SIZE(res) != 0) { return res; } @@ -1000,11 +999,17 @@ make_new_frozenset(PyTypeObject *type, PyObject *iterable) } // The empty frozenset is a singleton - if (emptyfrozenset == NULL) { - emptyfrozenset = make_new_set((PyTypeObject *)type, NULL); + PyInterpreterState *interp = _PyInterpreterState_GET(); + res = interp->empty_frozenset; + if (res == NULL) { + interp->empty_frozenset = make_new_set((PyTypeObject *)type, NULL); + res = interp->empty_frozenset; + if (res == NULL) { + return NULL; + } } - Py_XINCREF(emptyfrozenset); - return emptyfrozenset; + Py_INCREF(res); + return res; } static PyObject * @@ -2300,9 +2305,9 @@ PySet_Add(PyObject *anyset, PyObject *key) } void -_PySet_Fini(void) +_PySet_Fini(PyThreadState *tstate) { - Py_CLEAR(emptyfrozenset); + Py_CLEAR(tstate->interp->empty_frozenset); } int |