bpo-40521: Make the empty frozenset per interpreter (GH-21068)

Each interpreter now has its own empty frozenset singleton.
This commit is contained in:
Victor Stinner 2020-06-23 14:07:52 +02:00 • committed by GitHub
parent b4e85cadfb
commit 261cfedf76
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 24 additions and 19 deletions

View file

@ -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