Skip to content

Commit d58ebf0

Browse files
miss-islingtonerlend-aaslandericsnowcurrently
authored
[3.13] gh-117398: Add multiphase support to _datetime (gh-119373) (gh-119636)
This is minimal support. Subinterpreters are not supported yet. That will be addressed in a later change. (cherry picked from commit 3e8b609) Co-authored-by: Erlend E. Aasland <[email protected]> Co-authored-by: Eric Snow <[email protected]>
1 parent 660125f commit d58ebf0

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
@@ -6970,30 +6970,26 @@ _datetime_exec(PyObject *module)
69706970
}
69716971
#undef DATETIME_ADD_MACRO
69726972

6973-
static struct PyModuleDef datetimemodule = {
6973+
static PyModuleDef_Slot module_slots[] = {
6974+
{Py_mod_exec, _datetime_exec},
6975+
{Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED},
6976+
{Py_mod_gil, Py_MOD_GIL_NOT_USED},
6977+
{0, NULL},
6978+
};
6979+
6980+
static PyModuleDef datetimemodule = {
69746981
.m_base = PyModuleDef_HEAD_INIT,
69756982
.m_name = "_datetime",
69766983
.m_doc = "Fast implementation of the datetime type.",
6977-
.m_size = -1,
6984+
.m_size = 0,
69786985
.m_methods = module_methods,
6986+
.m_slots = module_slots,
69796987
};
69806988

69816989
PyMODINIT_FUNC
69826990
PyInit__datetime(void)
69836991
{
6984-
PyObject *mod = PyModule_Create(&datetimemodule);
6985-
if (mod == NULL)
6986-
return NULL;
6987-
#ifdef Py_GIL_DISABLED
6988-
PyUnstable_Module_SetGIL(mod, Py_MOD_GIL_NOT_USED);
6989-
#endif
6990-
6991-
if (_datetime_exec(mod) < 0) {
6992-
Py_DECREF(mod);
6993-
return NULL;
6994-
}
6995-
6996-
return mod;
6992+
return PyModuleDef_Init(&datetimemodule);
69976993
}
69986994

69996995
/* ---------------------------------------------------------------------------

0 commit comments

Comments
 (0)