bpo-1635741: Port time module to multiphase initialization (PEP 489) … · python/cpython@bd409bb
@@ -1736,82 +1736,64 @@ if it is 1, the time is given in the DST time zone;\n\
17361736if it is -1, mktime() should guess based on the date and time.\n");
17371737173817381739-1740-static struct PyModuleDef timemodule = {
1741-PyModuleDef_HEAD_INIT,
1742-"time",
1743-module_doc,
1744--1,
1745-time_methods,
1746-NULL,
1747-NULL,
1748-NULL,
1749-NULL
1750-};
1751-1752-PyMODINIT_FUNC
1753-PyInit_time(void)
1739+static int
1740+time_exec(PyObject *module)
17541741{
1755-PyObject *m;
1756-m = PyModule_Create(&timemodule);
1757-if (m == NULL)
1758-return NULL;
1759-17601742/* Set, or reset, module variables like time.timezone */
1761-if (init_timezone(m) < 0) {
1762-goto error;
1743+if (init_timezone(module) < 0) {
1744+return -1;
17631745 }
1764174617651747#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_CLOCK_SETTIME) || defined(HAVE_CLOCK_GETRES)
1766174817671749#ifdef CLOCK_REALTIME
1768-if (PyModule_AddIntMacro(m, CLOCK_REALTIME) < 0) {
1769-goto error;
1750+if (PyModule_AddIntMacro(module, CLOCK_REALTIME) < 0) {
1751+return -1;
17701752 }
17711753#endif
17721754#ifdef CLOCK_MONOTONIC
1773-if (PyModule_AddIntMacro(m, CLOCK_MONOTONIC) < 0) {
1774-goto error;
1755+if (PyModule_AddIntMacro(module, CLOCK_MONOTONIC) < 0) {
1756+return -1;
17751757 }
17761758#endif
17771759#ifdef CLOCK_MONOTONIC_RAW
1778-if (PyModule_AddIntMacro(m, CLOCK_MONOTONIC_RAW) < 0) {
1779-goto error;
1760+if (PyModule_AddIntMacro(module, CLOCK_MONOTONIC_RAW) < 0) {
1761+return -1;
17801762 }
17811763#endif
17821764#ifdef CLOCK_HIGHRES
1783-if (PyModule_AddIntMacro(m, CLOCK_HIGHRES) < 0) {
1784-goto error;
1765+if (PyModule_AddIntMacro(module, CLOCK_HIGHRES) < 0) {
1766+return -1;
17851767 }
17861768#endif
17871769#ifdef CLOCK_PROCESS_CPUTIME_ID
1788-if (PyModule_AddIntMacro(m, CLOCK_PROCESS_CPUTIME_ID) < 0) {
1789-goto error;
1770+if (PyModule_AddIntMacro(module, CLOCK_PROCESS_CPUTIME_ID) < 0) {
1771+return -1;
17901772 }
17911773#endif
17921774#ifdef CLOCK_THREAD_CPUTIME_ID
1793-if (PyModule_AddIntMacro(m, CLOCK_THREAD_CPUTIME_ID) < 0) {
1794-goto error;
1775+if (PyModule_AddIntMacro(module, CLOCK_THREAD_CPUTIME_ID) < 0) {
1776+return -1;
17951777 }
17961778#endif
17971779#ifdef CLOCK_PROF
1798-if (PyModule_AddIntMacro(m, CLOCK_PROF) < 0) {
1799-goto error;
1780+if (PyModule_AddIntMacro(module, CLOCK_PROF) < 0) {
1781+return -1;
18001782 }
18011783#endif
18021784#ifdef CLOCK_BOOTTIME
1803-if (PyModule_AddIntMacro(m, CLOCK_BOOTTIME) < 0) {
1804-goto error;
1785+if (PyModule_AddIntMacro(module, CLOCK_BOOTTIME) < 0) {
1786+return -1;
18051787 }
18061788#endif
18071789#ifdef CLOCK_UPTIME
1808-if (PyModule_AddIntMacro(m, CLOCK_UPTIME) < 0) {
1809-goto error;
1790+if (PyModule_AddIntMacro(module, CLOCK_UPTIME) < 0) {
1791+return -1;
18101792 }
18111793#endif
18121794#ifdef CLOCK_UPTIME_RAW
1813-if (PyModule_AddIntMacro(m, CLOCK_UPTIME_RAW) < 0) {
1814-goto error;
1795+if (PyModule_AddIntMacro(module, CLOCK_UPTIME_RAW) < 0) {
1796+return -1;
18151797 }
18161798#endif
18171799@@ -1820,16 +1802,16 @@ PyInit_time(void)
18201802if (!initialized) {
18211803if (PyStructSequence_InitType2(&StructTimeType,
18221804&struct_time_type_desc) < 0) {
1823-goto error;
1805+return -1;
18241806 }
18251807 }
1826-if (PyModule_AddIntConstant(m, "_STRUCT_TM_ITEMS", 11)) {
1827-goto error;
1808+if (PyModule_AddIntConstant(module, "_STRUCT_TM_ITEMS", 11)) {
1809+return -1;
18281810 }
18291811Py_INCREF(&StructTimeType);
1830-if (PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType)) {
1812+if (PyModule_AddObject(module, "struct_time", (PyObject*) &StructTimeType)) {
18311813Py_DECREF(&StructTimeType);
1832-goto error;
1814+return -1;
18331815 }
18341816initialized = 1;
18351817@@ -1840,11 +1822,30 @@ PyInit_time(void)
18401822utc_string = tm.tm_zone;
18411823#endif
184218241843-return m;
1825+return 0;
1826+}
184418271845-error:
1846-Py_DECREF(m);
1847-return NULL;
1828+static struct PyModuleDef_Slot time_slots[] = {
1829+ {Py_mod_exec, time_exec},
1830+ {0, NULL}
1831+};
1832+1833+static struct PyModuleDef timemodule = {
1834+PyModuleDef_HEAD_INIT,
1835+"time",
1836+module_doc,
1837+0,
1838+time_methods,
1839+time_slots,
1840+NULL,
1841+NULL,
1842+NULL
1843+};
1844+1845+PyMODINIT_FUNC
1846+PyInit_time(void)
1847+{
1848+return PyModuleDef_Init(&timemodule);
18481849}
1849185018501851/* Implement pysleep() for various platforms.