Skip to content

Commit f389b37

Browse files
authored
bpo-46417: _thread uses PyStructSequence_NewType() (GH-30733)
The _thread module now creates its _ExceptHookArgs type as a heap type using PyStructSequence_NewType(), rather than using a static type.
1 parent 6415e2e commit f389b37

File tree

1 file changed

+14
-12
lines changed

1 file changed

+14
-12
lines changed

Modules/_threadmodule.c

+14-12
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ static struct PyModuleDef thread_module;
2828

2929

3030
typedef struct {
31+
PyTypeObject *excepthook_type;
3132
PyTypeObject *lock_type;
3233
PyTypeObject *local_type;
3334
PyTypeObject *local_dummy_type;
@@ -1473,8 +1474,6 @@ PyDoc_STRVAR(ExceptHookArgs__doc__,
14731474
\n\
14741475
Type used to pass arguments to threading.excepthook.");
14751476

1476-
static PyTypeObject ExceptHookArgsType;
1477-
14781477
static PyStructSequence_Field ExceptHookArgs_fields[] = {
14791478
{"exc_type", "Exception type"},
14801479
{"exc_value", "Exception value"},
@@ -1492,9 +1491,11 @@ static PyStructSequence_Desc ExceptHookArgs_desc = {
14921491

14931492

14941493
static PyObject *
1495-
thread_excepthook(PyObject *self, PyObject *args)
1494+
thread_excepthook(PyObject *module, PyObject *args)
14961495
{
1497-
if (!Py_IS_TYPE(args, &ExceptHookArgsType)) {
1496+
thread_module_state *state = get_thread_state(module);
1497+
1498+
if (!Py_IS_TYPE(args, state->excepthook_type)) {
14981499
PyErr_SetString(PyExc_TypeError,
14991500
"_thread.excepthook argument type "
15001501
"must be ExceptHookArgs");
@@ -1629,18 +1630,17 @@ thread_module_exec(PyObject *module)
16291630
return -1;
16301631
}
16311632

1632-
if (ExceptHookArgsType.tp_name == NULL) {
1633-
if (PyStructSequence_InitType2(&ExceptHookArgsType,
1634-
&ExceptHookArgs_desc) < 0) {
1635-
return -1;
1636-
}
1637-
}
1638-
16391633
// Add module attributes
16401634
if (PyDict_SetItemString(d, "error", ThreadError) < 0) {
16411635
return -1;
16421636
}
1643-
if (PyModule_AddType(module, &ExceptHookArgsType) < 0) {
1637+
1638+
// _ExceptHookArgs type
1639+
state->excepthook_type = PyStructSequence_NewType(&ExceptHookArgs_desc);
1640+
if (state->excepthook_type == NULL) {
1641+
return -1;
1642+
}
1643+
if (PyModule_AddType(module, state->excepthook_type) < 0) {
16441644
return -1;
16451645
}
16461646

@@ -1664,6 +1664,7 @@ static int
16641664
thread_module_traverse(PyObject *module, visitproc visit, void *arg)
16651665
{
16661666
thread_module_state *state = get_thread_state(module);
1667+
Py_VISIT(state->excepthook_type);
16671668
Py_VISIT(state->lock_type);
16681669
Py_VISIT(state->local_type);
16691670
Py_VISIT(state->local_dummy_type);
@@ -1674,6 +1675,7 @@ static int
16741675
thread_module_clear(PyObject *module)
16751676
{
16761677
thread_module_state *state = get_thread_state(module);
1678+
Py_CLEAR(state->excepthook_type);
16771679
Py_CLEAR(state->lock_type);
16781680
Py_CLEAR(state->local_type);
16791681
Py_CLEAR(state->local_dummy_type);

0 commit comments

Comments
 (0)