mirror of
https://github.com/python/cpython.git
synced 2025-12-08 18:32:16 +00:00
gh-128421: make exception group methods thread safe (#129298)
This commit is contained in:
parent
be98fda7c6
commit
3f2cfd0462
2 changed files with 110 additions and 11 deletions
74
Objects/clinic/exceptions.c.h
generated
74
Objects/clinic/exceptions.c.h
generated
|
|
@ -308,4 +308,76 @@ BaseException___cause___set(PyObject *self, PyObject *value, void *Py_UNUSED(con
|
||||||
|
|
||||||
return return_value;
|
return return_value;
|
||||||
}
|
}
|
||||||
/*[clinic end generated code: output=8be99f8a7e527ba4 input=a9049054013a1b77]*/
|
|
||||||
|
PyDoc_STRVAR(BaseExceptionGroup_derive__doc__,
|
||||||
|
"derive($self, excs, /)\n"
|
||||||
|
"--\n"
|
||||||
|
"\n");
|
||||||
|
|
||||||
|
#define BASEEXCEPTIONGROUP_DERIVE_METHODDEF \
|
||||||
|
{"derive", (PyCFunction)BaseExceptionGroup_derive, METH_O, BaseExceptionGroup_derive__doc__},
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
BaseExceptionGroup_derive_impl(PyBaseExceptionGroupObject *self,
|
||||||
|
PyObject *excs);
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
BaseExceptionGroup_derive(PyBaseExceptionGroupObject *self, PyObject *excs)
|
||||||
|
{
|
||||||
|
PyObject *return_value = NULL;
|
||||||
|
|
||||||
|
Py_BEGIN_CRITICAL_SECTION(self);
|
||||||
|
return_value = BaseExceptionGroup_derive_impl((PyBaseExceptionGroupObject *)self, excs);
|
||||||
|
Py_END_CRITICAL_SECTION();
|
||||||
|
|
||||||
|
return return_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
PyDoc_STRVAR(BaseExceptionGroup_split__doc__,
|
||||||
|
"split($self, matcher_value, /)\n"
|
||||||
|
"--\n"
|
||||||
|
"\n");
|
||||||
|
|
||||||
|
#define BASEEXCEPTIONGROUP_SPLIT_METHODDEF \
|
||||||
|
{"split", (PyCFunction)BaseExceptionGroup_split, METH_O, BaseExceptionGroup_split__doc__},
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
BaseExceptionGroup_split_impl(PyBaseExceptionGroupObject *self,
|
||||||
|
PyObject *matcher_value);
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
BaseExceptionGroup_split(PyBaseExceptionGroupObject *self, PyObject *matcher_value)
|
||||||
|
{
|
||||||
|
PyObject *return_value = NULL;
|
||||||
|
|
||||||
|
Py_BEGIN_CRITICAL_SECTION(self);
|
||||||
|
return_value = BaseExceptionGroup_split_impl((PyBaseExceptionGroupObject *)self, matcher_value);
|
||||||
|
Py_END_CRITICAL_SECTION();
|
||||||
|
|
||||||
|
return return_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
PyDoc_STRVAR(BaseExceptionGroup_subgroup__doc__,
|
||||||
|
"subgroup($self, matcher_value, /)\n"
|
||||||
|
"--\n"
|
||||||
|
"\n");
|
||||||
|
|
||||||
|
#define BASEEXCEPTIONGROUP_SUBGROUP_METHODDEF \
|
||||||
|
{"subgroup", (PyCFunction)BaseExceptionGroup_subgroup, METH_O, BaseExceptionGroup_subgroup__doc__},
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
BaseExceptionGroup_subgroup_impl(PyBaseExceptionGroupObject *self,
|
||||||
|
PyObject *matcher_value);
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
BaseExceptionGroup_subgroup(PyBaseExceptionGroupObject *self, PyObject *matcher_value)
|
||||||
|
{
|
||||||
|
PyObject *return_value = NULL;
|
||||||
|
|
||||||
|
Py_BEGIN_CRITICAL_SECTION(self);
|
||||||
|
return_value = BaseExceptionGroup_subgroup_impl((PyBaseExceptionGroupObject *)self, matcher_value);
|
||||||
|
Py_END_CRITICAL_SECTION();
|
||||||
|
|
||||||
|
return return_value;
|
||||||
|
}
|
||||||
|
/*[clinic end generated code: output=19aed708dcaf7184 input=a9049054013a1b77]*/
|
||||||
|
|
|
||||||
|
|
@ -20,8 +20,9 @@
|
||||||
|
|
||||||
/*[clinic input]
|
/*[clinic input]
|
||||||
class BaseException "PyBaseExceptionObject *" "&PyExc_BaseException"
|
class BaseException "PyBaseExceptionObject *" "&PyExc_BaseException"
|
||||||
|
class BaseExceptionGroup "PyBaseExceptionGroupObject *" "&PyExc_BaseExceptionGroup"
|
||||||
[clinic start generated code]*/
|
[clinic start generated code]*/
|
||||||
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=90558eb0fbf8a3d0]*/
|
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=b7c45e78cff8edc3]*/
|
||||||
|
|
||||||
|
|
||||||
/* Compatibility aliases */
|
/* Compatibility aliases */
|
||||||
|
|
@ -1034,10 +1035,18 @@ BaseExceptionGroup_str(PyBaseExceptionGroupObject *self)
|
||||||
self->msg, num_excs, num_excs > 1 ? "s" : "");
|
self->msg, num_excs, num_excs > 1 ? "s" : "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*[clinic input]
|
||||||
|
@critical_section
|
||||||
|
BaseExceptionGroup.derive
|
||||||
|
excs: object
|
||||||
|
/
|
||||||
|
[clinic start generated code]*/
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
BaseExceptionGroup_derive(PyObject *self_, PyObject *excs)
|
BaseExceptionGroup_derive_impl(PyBaseExceptionGroupObject *self,
|
||||||
|
PyObject *excs)
|
||||||
|
/*[clinic end generated code: output=4307564218dfbf06 input=f72009d38e98cec1]*/
|
||||||
{
|
{
|
||||||
PyBaseExceptionGroupObject *self = _PyBaseExceptionGroupObject_cast(self_);
|
|
||||||
PyObject *init_args = PyTuple_Pack(2, self->msg, excs);
|
PyObject *init_args = PyTuple_Pack(2, self->msg, excs);
|
||||||
if (!init_args) {
|
if (!init_args) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
@ -1330,8 +1339,17 @@ done:
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*[clinic input]
|
||||||
|
@critical_section
|
||||||
|
BaseExceptionGroup.split
|
||||||
|
matcher_value: object
|
||||||
|
/
|
||||||
|
[clinic start generated code]*/
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
BaseExceptionGroup_split(PyObject *self, PyObject *matcher_value)
|
BaseExceptionGroup_split_impl(PyBaseExceptionGroupObject *self,
|
||||||
|
PyObject *matcher_value)
|
||||||
|
/*[clinic end generated code: output=d74db579da4df6e2 input=0c5cfbfed57e0052]*/
|
||||||
{
|
{
|
||||||
_exceptiongroup_split_matcher_type matcher_type;
|
_exceptiongroup_split_matcher_type matcher_type;
|
||||||
if (get_matcher_type(matcher_value, &matcher_type) < 0) {
|
if (get_matcher_type(matcher_value, &matcher_type) < 0) {
|
||||||
|
|
@ -1341,7 +1359,7 @@ BaseExceptionGroup_split(PyObject *self, PyObject *matcher_value)
|
||||||
_exceptiongroup_split_result split_result;
|
_exceptiongroup_split_result split_result;
|
||||||
bool construct_rest = true;
|
bool construct_rest = true;
|
||||||
if (exceptiongroup_split_recursive(
|
if (exceptiongroup_split_recursive(
|
||||||
self, matcher_type, matcher_value,
|
(PyObject *)self, matcher_type, matcher_value,
|
||||||
construct_rest, &split_result) < 0) {
|
construct_rest, &split_result) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -1356,8 +1374,17 @@ BaseExceptionGroup_split(PyObject *self, PyObject *matcher_value)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*[clinic input]
|
||||||
|
@critical_section
|
||||||
|
BaseExceptionGroup.subgroup
|
||||||
|
matcher_value: object
|
||||||
|
/
|
||||||
|
[clinic start generated code]*/
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
BaseExceptionGroup_subgroup(PyObject *self, PyObject *matcher_value)
|
BaseExceptionGroup_subgroup_impl(PyBaseExceptionGroupObject *self,
|
||||||
|
PyObject *matcher_value)
|
||||||
|
/*[clinic end generated code: output=07dbec8f77d4dd8e input=988ffdd755a151ce]*/
|
||||||
{
|
{
|
||||||
_exceptiongroup_split_matcher_type matcher_type;
|
_exceptiongroup_split_matcher_type matcher_type;
|
||||||
if (get_matcher_type(matcher_value, &matcher_type) < 0) {
|
if (get_matcher_type(matcher_value, &matcher_type) < 0) {
|
||||||
|
|
@ -1367,7 +1394,7 @@ BaseExceptionGroup_subgroup(PyObject *self, PyObject *matcher_value)
|
||||||
_exceptiongroup_split_result split_result;
|
_exceptiongroup_split_result split_result;
|
||||||
bool construct_rest = false;
|
bool construct_rest = false;
|
||||||
if (exceptiongroup_split_recursive(
|
if (exceptiongroup_split_recursive(
|
||||||
self, matcher_type, matcher_value,
|
(PyObject *)self, matcher_type, matcher_value,
|
||||||
construct_rest, &split_result) < 0) {
|
construct_rest, &split_result) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -1633,9 +1660,9 @@ static PyMemberDef BaseExceptionGroup_members[] = {
|
||||||
static PyMethodDef BaseExceptionGroup_methods[] = {
|
static PyMethodDef BaseExceptionGroup_methods[] = {
|
||||||
{"__class_getitem__", (PyCFunction)Py_GenericAlias,
|
{"__class_getitem__", (PyCFunction)Py_GenericAlias,
|
||||||
METH_O|METH_CLASS, PyDoc_STR("See PEP 585")},
|
METH_O|METH_CLASS, PyDoc_STR("See PEP 585")},
|
||||||
{"derive", (PyCFunction)BaseExceptionGroup_derive, METH_O},
|
BASEEXCEPTIONGROUP_DERIVE_METHODDEF
|
||||||
{"split", (PyCFunction)BaseExceptionGroup_split, METH_O},
|
BASEEXCEPTIONGROUP_SPLIT_METHODDEF
|
||||||
{"subgroup", (PyCFunction)BaseExceptionGroup_subgroup, METH_O},
|
BASEEXCEPTIONGROUP_SUBGROUP_METHODDEF
|
||||||
{NULL}
|
{NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue