Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit a835158

Browse filesBrowse files
committed
add a test case
1 parent 501c3e9 commit a835158
Copy full SHA for a835158

File tree

2 files changed

+75
-0
lines changed
Filter options

2 files changed

+75
-0
lines changed

‎Lib/test/test_capi/test_misc.py

Copy file name to clipboardExpand all lines: Lib/test/test_capi/test_misc.py
+16Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2203,6 +2203,22 @@ def test_module_state_shared_in_global(self):
22032203
subinterp_attr_id = os.read(r, 100)
22042204
self.assertEqual(main_attr_id, subinterp_attr_id)
22052205

2206+
@unittest.skipIf(_testmultiphase is None, "test requires _testmultiphase module")
2207+
def test_datetime_capi_client(self):
2208+
script = textwrap.dedent("""
2209+
import importlib.machinery
2210+
import importlib.util
2211+
fullname = '_test_datetime_capi_client'
2212+
origin = importlib.util.find_spec('_testmultiphase').origin
2213+
loader = importlib.machinery.ExtensionFileLoader(fullname, origin)
2214+
spec = importlib.util.spec_from_loader(fullname, loader)
2215+
module = importlib.util.module_from_spec(spec)
2216+
spec.loader.exec_module(module)
2217+
""")
2218+
exec(script) # run main interp first
2219+
ret = support.run_in_subinterp(script)
2220+
self.assertEqual(ret, 0)
2221+
22062222

22072223
@requires_subinterpreters
22082224
class InterpreterConfigTests(unittest.TestCase):

‎Modules/_testmultiphase.c

Copy file name to clipboardExpand all lines: Modules/_testmultiphase.c
+59Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -952,3 +952,62 @@ PyInit__test_shared_gil_only(void)
952952
{
953953
return PyModuleDef_Init(&shared_gil_only_def);
954954
}
955+
956+
957+
#include "datetime.h"
958+
959+
static int
960+
datetime_capi_client_exec(PyObject *m)
961+
{
962+
int ismain = PyInterpreterState_Get() == PyInterpreterState_Main();
963+
if (ismain) {
964+
_pydatetimeapi_main = NULL;
965+
}
966+
967+
PyDateTime_IMPORT;
968+
if (PyDateTimeAPI == NULL) {
969+
return -1;
970+
}
971+
if (PyDateTimeAPI != PyCapsule_Import(PyDateTime_CAPSULE_NAME, 0)) {
972+
return -1;
973+
}
974+
if (ismain) {
975+
if (PyDateTimeAPI != _pydatetimeapi_main) {
976+
return -1;
977+
}
978+
}
979+
else {
980+
if (PyDateTimeAPI == _pydatetimeapi_main) {
981+
PyObject *module = PyImport_ImportModule("_datetime");
982+
if (module == NULL) {
983+
return -1;
984+
}
985+
PyModuleDef *def = PyModule_GetDef(module);
986+
Py_DECREF(module);
987+
if (def) {
988+
// multi-phase init
989+
return -1;
990+
}
991+
else {
992+
// legacy init (shared module)
993+
return 0;
994+
}
995+
}
996+
}
997+
return 0;
998+
}
999+
1000+
static PyModuleDef_Slot datetime_capi_client_slots[] = {
1001+
{Py_mod_exec, datetime_capi_client_exec},
1002+
{Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
1003+
{0, NULL},
1004+
};
1005+
1006+
static PyModuleDef datetime_capi_client_def = TEST_MODULE_DEF(
1007+
"_testmultiphase_datetime_capi_client", datetime_capi_client_slots, NULL);
1008+
1009+
PyMODINIT_FUNC
1010+
PyInit__test_datetime_capi_client(void)
1011+
{
1012+
return PyModuleDef_Init(&datetime_capi_client_def);
1013+
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.