mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	[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 3e8b60905e)
Co-authored-by: Erlend E. Aasland <erlend@python.org>
Co-authored-by: Eric Snow <ericsnowcurrently@gmail.com>
			
			
This commit is contained in:
		
							parent
							
								
									660125f864
								
							
						
					
					
						commit
						d58ebf073c
					
				
					 2 changed files with 32 additions and 15 deletions
				
			
		|  | @ -47,6 +47,26 @@ | ||||||
|     pass |     pass | ||||||
| # | # | ||||||
| 
 | 
 | ||||||
|  | # This is copied from test_import/__init__.py. | ||||||
|  | # XXX Move it to support/__init__.py. | ||||||
|  | def no_rerun(reason): | ||||||
|  |     """Skip rerunning for a particular test. | ||||||
|  | 
 | ||||||
|  |     WARNING: Use this decorator with care; skipping rerunning makes it | ||||||
|  |     impossible to find reference leaks. Provide a clear reason for skipping the | ||||||
|  |     test using the 'reason' parameter. | ||||||
|  |     """ | ||||||
|  |     def deco(func): | ||||||
|  |         _has_run = False | ||||||
|  |         def wrapper(self): | ||||||
|  |             nonlocal _has_run | ||||||
|  |             if _has_run: | ||||||
|  |                 self.skipTest(reason) | ||||||
|  |             func(self) | ||||||
|  |             _has_run = True | ||||||
|  |         return wrapper | ||||||
|  |     return deco | ||||||
|  | 
 | ||||||
| pickle_loads = {pickle.loads, pickle._loads} | pickle_loads = {pickle.loads, pickle._loads} | ||||||
| 
 | 
 | ||||||
| pickle_choices = [(pickle, pickle, proto) | pickle_choices = [(pickle, pickle, proto) | ||||||
|  | @ -6383,6 +6403,7 @@ class IranTest(ZoneInfoTest): | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @unittest.skipIf(_testcapi is None, 'need _testcapi module') | @unittest.skipIf(_testcapi is None, 'need _testcapi module') | ||||||
|  | @no_rerun("the encapsulated datetime C API does not support reloading") | ||||||
| class CapiTest(unittest.TestCase): | class CapiTest(unittest.TestCase): | ||||||
|     def setUp(self): |     def setUp(self): | ||||||
|         # Since the C API is not present in the _Pure tests, skip all tests |         # Since the C API is not present in the _Pure tests, skip all tests | ||||||
|  |  | ||||||
|  | @ -6970,30 +6970,26 @@ _datetime_exec(PyObject *module) | ||||||
| } | } | ||||||
| #undef DATETIME_ADD_MACRO | #undef DATETIME_ADD_MACRO | ||||||
| 
 | 
 | ||||||
| static struct PyModuleDef datetimemodule = { | static PyModuleDef_Slot module_slots[] = { | ||||||
|  |     {Py_mod_exec, _datetime_exec}, | ||||||
|  |     {Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED}, | ||||||
|  |     {Py_mod_gil, Py_MOD_GIL_NOT_USED}, | ||||||
|  |     {0, NULL}, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static PyModuleDef datetimemodule = { | ||||||
|     .m_base = PyModuleDef_HEAD_INIT, |     .m_base = PyModuleDef_HEAD_INIT, | ||||||
|     .m_name = "_datetime", |     .m_name = "_datetime", | ||||||
|     .m_doc = "Fast implementation of the datetime type.", |     .m_doc = "Fast implementation of the datetime type.", | ||||||
|     .m_size = -1, |     .m_size = 0, | ||||||
|     .m_methods = module_methods, |     .m_methods = module_methods, | ||||||
|  |     .m_slots = module_slots, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| PyMODINIT_FUNC | PyMODINIT_FUNC | ||||||
| PyInit__datetime(void) | PyInit__datetime(void) | ||||||
| { | { | ||||||
|     PyObject *mod = PyModule_Create(&datetimemodule); |     return PyModuleDef_Init(&datetimemodule); | ||||||
|     if (mod == NULL) |  | ||||||
|         return NULL; |  | ||||||
| #ifdef Py_GIL_DISABLED |  | ||||||
|     PyUnstable_Module_SetGIL(mod, Py_MOD_GIL_NOT_USED); |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
|     if (_datetime_exec(mod) < 0) { |  | ||||||
|         Py_DECREF(mod); |  | ||||||
|         return NULL; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     return mod; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* ---------------------------------------------------------------------------
 | /* ---------------------------------------------------------------------------
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Miss Islington (bot)
						Miss Islington (bot)