Skip to content

Commit 3e8b609

Browse files
gh-117398: Add multiphase support to _datetime (gh-119373)
This is minimal support. Subinterpreters are not supported yet. That will be addressed in a later change. Co-authored-by: Eric Snow <ericsnowcurrently@gmail.com>
1 parent ae7b176 commit 3e8b609

File tree

2 files changed

+32
-15
lines changed

2 files changed

+32
-15
lines changed

Lib/test/datetimetester.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,26 @@
4747
pass
4848
#
4949

50+
# This is copied from test_import/__init__.py.
51+
# XXX Move it to support/__init__.py.
52+
def no_rerun(reason):
53+
"""Skip rerunning for a particular test.
54+
55+
WARNING: Use this decorator with care; skipping rerunning makes it
56+
impossible to find reference leaks. Provide a clear reason for skipping the
57+
test using the 'reason' parameter.
58+
"""
59+
def deco(func):
60+
_has_run = False
61+
def wrapper(self):
62+
nonlocal _has_run
63+
if _has_run:
64+
self.skipTest(reason)
65+
func(self)
66+
_has_run = True
67+
return wrapper
68+
return deco
69+
5070
pickle_loads = {pickle.loads, pickle._loads}
5171

5272
pickle_choices = [(pickle, pickle, proto)
@@ -6383,6 +6403,7 @@ class IranTest(ZoneInfoTest):
63836403

63846404

63856405
@unittest.skipIf(_testcapi is None, 'need _testcapi module')
6406+
@no_rerun("the encapsulated datetime C API does not support reloading")
63866407
class CapiTest(unittest.TestCase):
63876408
def setUp(self):
63886409
# Since the C API is not present in the _Pure tests, skip all tests

Modules/_datetimemodule.c

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7040,30 +7040,26 @@ _datetime_exec(PyObject *module)
70407040
}
70417041
#undef DATETIME_ADD_MACRO
70427042

7043-
static struct PyModuleDef datetimemodule = {
7043+
static PyModuleDef_Slot module_slots[] = {
7044+
{Py_mod_exec, _datetime_exec},
7045+
{Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED},
7046+
{Py_mod_gil, Py_MOD_GIL_NOT_USED},
7047+
{0, NULL},
7048+
};
7049+
7050+
static PyModuleDef datetimemodule = {
70447051
.m_base = PyModuleDef_HEAD_INIT,
70457052
.m_name = "_datetime",
70467053
.m_doc = "Fast implementation of the datetime type.",
7047-
.m_size = -1,
7054+
.m_size = 0,
70487055
.m_methods = module_methods,
7056+
.m_slots = module_slots,
70497057
};
70507058

70517059
PyMODINIT_FUNC
70527060
PyInit__datetime(void)
70537061
{
7054-
PyObject *mod = PyModule_Create(&datetimemodule);
7055-
if (mod == NULL)
7056-
return NULL;
7057-
#ifdef Py_GIL_DISABLED
7058-
PyUnstable_Module_SetGIL(mod, Py_MOD_GIL_NOT_USED);
7059-
#endif
7060-
7061-
if (_datetime_exec(mod) < 0) {
7062-
Py_DECREF(mod);
7063-
return NULL;
7064-
}
7065-
7066-
return mod;
7062+
return PyModuleDef_Init(&datetimemodule);
70677063
}
70687064

70697065
/* ---------------------------------------------------------------------------

0 commit comments

Comments
 (0)