diff --git a/Objects/unionobject.c b/Objects/unionobject.c index 0b7d4c72bff..66435924b6c 100644 --- a/Objects/unionobject.c +++ b/Objects/unionobject.c @@ -322,16 +322,28 @@ static PyMemberDef union_members[] = { {0} }; +// Populate __parameters__ if needed. +static int +union_init_parameters(unionobject *alias) +{ + int result = 0; + Py_BEGIN_CRITICAL_SECTION(alias); + if (alias->parameters == NULL) { + alias->parameters = _Py_make_parameters(alias->args); + if (alias->parameters == NULL) { + result = -1; + } + } + Py_END_CRITICAL_SECTION(); + return result; +} + static PyObject * union_getitem(PyObject *self, PyObject *item) { unionobject *alias = (unionobject *)self; - // Populate __parameters__ if needed. - if (alias->parameters == NULL) { - alias->parameters = _Py_make_parameters(alias->args); - if (alias->parameters == NULL) { - return NULL; - } + if (union_init_parameters(alias) < 0) { + return NULL; } PyObject *newargs = _Py_subs_parameters(self, alias->args, alias->parameters, item); @@ -352,11 +364,8 @@ static PyObject * union_parameters(PyObject *self, void *Py_UNUSED(unused)) { unionobject *alias = (unionobject *)self; - if (alias->parameters == NULL) { - alias->parameters = _Py_make_parameters(alias->args); - if (alias->parameters == NULL) { - return NULL; - } + if (union_init_parameters(alias) < 0) { + return NULL; } return Py_NewRef(alias->parameters); }