summaryrefslogtreecommitdiffstats
path: root/Objects/setobject.c
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2020-06-23 12:07:52 (GMT)
committerGitHub <noreply@github.com>2020-06-23 12:07:52 (GMT)
commit261cfedf7657a515e04428bba58eba2a9bb88208 (patch)
treef242ee74773b9e46c63f0bf99e1ddc6b932a00b6 /Objects/setobject.c
parentb4e85cadfbc2b1b24ec5f3159e351dbacedaa5e0 (diff)
downloadcpython-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.c25
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