]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-1635741: Port faulthandler module to multiphase initialization (GH-21294)
authorDong-hee Na <donghee.na92@gmail.com>
Fri, 3 Jul 2020 16:36:47 +0000 (01:36 +0900)
committerGitHub <noreply@github.com>
Fri, 3 Jul 2020 16:36:47 +0000 (01:36 +0900)
Misc/NEWS.d/next/Core and Builtins/2020-07-03-23-10-02.bpo-1635741.F5coWe.rst [new file with mode: 0644]
Modules/faulthandler.c

diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-07-03-23-10-02.bpo-1635741.F5coWe.rst b/Misc/NEWS.d/next/Core and Builtins/2020-07-03-23-10-02.bpo-1635741.F5coWe.rst
new file mode 100644 (file)
index 0000000..927c8e5
--- /dev/null
@@ -0,0 +1 @@
+Port :mod:`faulthandler` to multiphase initialization.
index e7a285033051dfc511440574f7f255ef325b1573..67fe1ca9ffffd2a1c8d66207304d1403d6ffeca4 100644 (file)
@@ -1291,59 +1291,55 @@ static PyMethodDef module_methods[] = {
     {NULL, NULL}  /* sentinel */
 };
 
-static struct PyModuleDef module_def = {
-    PyModuleDef_HEAD_INIT,
-    "faulthandler",
-    module_doc,
-    0, /* non-negative size to be able to unload the module */
-    module_methods,
-    NULL,
-    faulthandler_traverse,
-    NULL,
-    NULL
-};
-
-PyMODINIT_FUNC
-PyInit_faulthandler(void)
-{
-    PyObject *m = PyModule_Create(&module_def);
-    if (m == NULL)
-        return NULL;
-
+static int
+PyExec_faulthandler(PyObject *module) {
     /* Add constants for unit tests */
 #ifdef MS_WINDOWS
     /* RaiseException() codes (prefixed by an underscore) */
-    if (PyModule_AddIntConstant(m, "_EXCEPTION_ACCESS_VIOLATION",
+    if (PyModule_AddIntConstant(module, "_EXCEPTION_ACCESS_VIOLATION",
                                 EXCEPTION_ACCESS_VIOLATION)) {
-        goto error;
+        return -1;
     }
-    if (PyModule_AddIntConstant(m, "_EXCEPTION_INT_DIVIDE_BY_ZERO",
+    if (PyModule_AddIntConstant(module, "_EXCEPTION_INT_DIVIDE_BY_ZERO",
                                 EXCEPTION_INT_DIVIDE_BY_ZERO)) {
-        goto error;
+        return -1;
     }
-    if (PyModule_AddIntConstant(m, "_EXCEPTION_STACK_OVERFLOW",
+    if (PyModule_AddIntConstant(module, "_EXCEPTION_STACK_OVERFLOW",
                                 EXCEPTION_STACK_OVERFLOW)) {
-        goto error;
+        return -1;
     }
 
     /* RaiseException() flags (prefixed by an underscore) */
-    if (PyModule_AddIntConstant(m, "_EXCEPTION_NONCONTINUABLE",
+    if (PyModule_AddIntConstant(module, "_EXCEPTION_NONCONTINUABLE",
                                 EXCEPTION_NONCONTINUABLE)) {
-        goto error;
+        return -1;
     }
-    if (PyModule_AddIntConstant(m, "_EXCEPTION_NONCONTINUABLE_EXCEPTION",
+    if (PyModule_AddIntConstant(module, "_EXCEPTION_NONCONTINUABLE_EXCEPTION",
                                 EXCEPTION_NONCONTINUABLE_EXCEPTION)) {
-        goto error;
+        return -1;
     }
 #endif
+    return 0;
+}
 
-    return m;
+static PyModuleDef_Slot faulthandler_slots[] = {
+    {Py_mod_exec, PyExec_faulthandler},
+    {0, NULL}
+};
 
-#ifdef MS_WINDOWS
-error:
-    Py_DECREF(m);
-    return NULL;
-#endif
+static struct PyModuleDef module_def = {
+    PyModuleDef_HEAD_INIT,
+    .m_name = "faulthandler",
+    .m_doc = module_doc,
+    .m_methods = module_methods,
+    .m_traverse = faulthandler_traverse,
+    .m_slots = faulthandler_slots
+};
+
+PyMODINIT_FUNC
+PyInit_faulthandler(void)
+{
+    return PyModuleDef_Init(&module_def);
 }
 
 static int