Skip to content

Commit 667ed82

Browse files
make exception group thread safe
1 parent e119526 commit 667ed82

File tree

2 files changed

+113
-19
lines changed

2 files changed

+113
-19
lines changed

Objects/clinic/exceptions.c.h

Lines changed: 73 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Objects/exceptions.c

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@
2020

2121
/*[clinic input]
2222
class BaseException "PyBaseExceptionObject *" "&PyExc_BaseException"
23+
class BaseExceptionGroup "PyBaseExceptionGroupObject *" "&PyExc_BaseExceptionGroup"
2324
[clinic start generated code]*/
24-
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=90558eb0fbf8a3d0]*/
25+
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=b7c45e78cff8edc3]*/
2526

2627

2728
/* Compatibility aliases */
@@ -1034,18 +1035,21 @@ BaseExceptionGroup_str(PyBaseExceptionGroupObject *self)
10341035
self->msg, num_excs, num_excs > 1 ? "s" : "");
10351036
}
10361037

1038+
/*[clinic input]
1039+
@critical_section
1040+
BaseExceptionGroup.derive
1041+
excs: object
1042+
/
1043+
[clinic start generated code]*/
1044+
10371045
static PyObject *
1038-
BaseExceptionGroup_derive(PyObject *self_, PyObject *excs)
1046+
BaseExceptionGroup_derive_impl(PyBaseExceptionGroupObject *self,
1047+
PyObject *excs)
1048+
/*[clinic end generated code: output=4307564218dfbf06 input=f72009d38e98cec1]*/
10391049
{
1040-
PyBaseExceptionGroupObject *self = _PyBaseExceptionGroupObject_cast(self_);
1041-
PyObject *init_args = PyTuple_Pack(2, self->msg, excs);
1042-
if (!init_args) {
1043-
return NULL;
1044-
}
1045-
PyObject *eg = PyObject_CallObject(
1046-
PyExc_BaseExceptionGroup, init_args);
1047-
Py_DECREF(init_args);
1048-
return eg;
1050+
PyObject *stack[] = {self->msg, excs};
1051+
size_t nargsf = 2 | PY_VECTORCALL_ARGUMENTS_OFFSET;
1052+
return PyObject_Vectorcall(PyExc_BaseExceptionGroup, stack, nargsf, NULL);
10491053
}
10501054

10511055
static int
@@ -1330,8 +1334,17 @@ exceptiongroup_split_recursive(PyObject *exc,
13301334
return retval;
13311335
}
13321336

1337+
/*[clinic input]
1338+
@critical_section
1339+
BaseExceptionGroup.split
1340+
matcher_value: object
1341+
/
1342+
[clinic start generated code]*/
1343+
13331344
static PyObject *
1334-
BaseExceptionGroup_split(PyObject *self, PyObject *matcher_value)
1345+
BaseExceptionGroup_split_impl(PyBaseExceptionGroupObject *self,
1346+
PyObject *matcher_value)
1347+
/*[clinic end generated code: output=d74db579da4df6e2 input=0c5cfbfed57e0052]*/
13351348
{
13361349
_exceptiongroup_split_matcher_type matcher_type;
13371350
if (get_matcher_type(matcher_value, &matcher_type) < 0) {
@@ -1341,7 +1354,7 @@ BaseExceptionGroup_split(PyObject *self, PyObject *matcher_value)
13411354
_exceptiongroup_split_result split_result;
13421355
bool construct_rest = true;
13431356
if (exceptiongroup_split_recursive(
1344-
self, matcher_type, matcher_value,
1357+
(PyObject *)self, matcher_type, matcher_value,
13451358
construct_rest, &split_result) < 0) {
13461359
return NULL;
13471360
}
@@ -1356,8 +1369,17 @@ BaseExceptionGroup_split(PyObject *self, PyObject *matcher_value)
13561369
return result;
13571370
}
13581371

1372+
/*[clinic input]
1373+
@critical_section
1374+
BaseExceptionGroup.subgroup
1375+
matcher_value: object
1376+
/
1377+
[clinic start generated code]*/
1378+
13591379
static PyObject *
1360-
BaseExceptionGroup_subgroup(PyObject *self, PyObject *matcher_value)
1380+
BaseExceptionGroup_subgroup_impl(PyBaseExceptionGroupObject *self,
1381+
PyObject *matcher_value)
1382+
/*[clinic end generated code: output=07dbec8f77d4dd8e input=988ffdd755a151ce]*/
13611383
{
13621384
_exceptiongroup_split_matcher_type matcher_type;
13631385
if (get_matcher_type(matcher_value, &matcher_type) < 0) {
@@ -1367,7 +1389,7 @@ BaseExceptionGroup_subgroup(PyObject *self, PyObject *matcher_value)
13671389
_exceptiongroup_split_result split_result;
13681390
bool construct_rest = false;
13691391
if (exceptiongroup_split_recursive(
1370-
self, matcher_type, matcher_value,
1392+
(PyObject *)self, matcher_type, matcher_value,
13711393
construct_rest, &split_result) < 0) {
13721394
return NULL;
13731395
}
@@ -1633,9 +1655,9 @@ static PyMemberDef BaseExceptionGroup_members[] = {
16331655
static PyMethodDef BaseExceptionGroup_methods[] = {
16341656
{"__class_getitem__", (PyCFunction)Py_GenericAlias,
16351657
METH_O|METH_CLASS, PyDoc_STR("See PEP 585")},
1636-
{"derive", (PyCFunction)BaseExceptionGroup_derive, METH_O},
1637-
{"split", (PyCFunction)BaseExceptionGroup_split, METH_O},
1638-
{"subgroup", (PyCFunction)BaseExceptionGroup_subgroup, METH_O},
1658+
BASEEXCEPTIONGROUP_DERIVE_METHODDEF
1659+
BASEEXCEPTIONGROUP_SPLIT_METHODDEF
1660+
BASEEXCEPTIONGROUP_SUBGROUP_METHODDEF
16391661
{NULL}
16401662
};
16411663

0 commit comments

Comments
 (0)