@@ -165,7 +165,21 @@ _get_current_state(PyObject **p_mod)
165165{
166166 PyInterpreterState * interp = PyInterpreterState_Get ();
167167 PyObject * mod = get_current_module (interp , NULL );
168- assert (mod != NULL );
168+ if (mod == NULL ) {
169+ assert (!PyErr_Occurred ());
170+ if (PyErr_Occurred ()) {
171+ return NULL ;
172+ }
173+ /* The static types can outlive the module,
174+ * so we must re-import the module. */
175+ mod = PyImport_ImportModule ("_datetime" );
176+ if (mod == NULL ) {
177+ assert (_Py_IsInterpreterFinalizing (interp ));
178+ /* Ask users to take care about the unlikely case
179+ * that happened after restarting the interpreter. */
180+ return NULL ;
181+ }
182+ }
169183 datetime_state * st = get_module_state (mod );
170184 * p_mod = mod ;
171185 return st ;
@@ -2085,6 +2099,9 @@ delta_to_microseconds(PyDateTime_Delta *self)
20852099
20862100 PyObject * current_mod = NULL ;
20872101 datetime_state * st = GET_CURRENT_STATE (current_mod );
2102+ if (current_mod == NULL ) {
2103+ return NULL ;
2104+ }
20882105
20892106 x1 = PyLong_FromLong (GET_TD_DAYS (self ));
20902107 if (x1 == NULL )
@@ -2164,6 +2181,9 @@ microseconds_to_delta_ex(PyObject *pyus, PyTypeObject *type)
21642181
21652182 PyObject * current_mod = NULL ;
21662183 datetime_state * st = GET_CURRENT_STATE (current_mod );
2184+ if (current_mod == NULL ) {
2185+ return NULL ;
2186+ }
21672187
21682188 tuple = checked_divmod (pyus , CONST_US_PER_SECOND (st ));
21692189 if (tuple == NULL ) {
@@ -2749,6 +2769,9 @@ delta_new(PyTypeObject *type, PyObject *args, PyObject *kw)
27492769
27502770 PyObject * current_mod = NULL ;
27512771 datetime_state * st = GET_CURRENT_STATE (current_mod );
2772+ if (current_mod == NULL ) {
2773+ return NULL ;
2774+ }
27522775
27532776 /* Argument objects. */
27542777 PyObject * day = NULL ;
@@ -2968,6 +2991,9 @@ delta_total_seconds(PyObject *op, PyObject *Py_UNUSED(dummy))
29682991
29692992 PyObject * current_mod = NULL ;
29702993 datetime_state * st = GET_CURRENT_STATE (current_mod );
2994+ if (current_mod == NULL ) {
2995+ return NULL ;
2996+ }
29712997
29722998 total_seconds = PyNumber_TrueDivide (total_microseconds , CONST_US_PER_SECOND (st ));
29732999
@@ -3751,6 +3777,9 @@ date_isocalendar(PyObject *self, PyObject *Py_UNUSED(dummy))
37513777
37523778 PyObject * current_mod = NULL ;
37533779 datetime_state * st = GET_CURRENT_STATE (current_mod );
3780+ if (current_mod == NULL ) {
3781+ return NULL ;
3782+ }
37543783
37553784 PyObject * v = iso_calendar_date_new_impl (ISOCALENDAR_DATE_TYPE (st ),
37563785 year , week + 1 , day + 1 );
@@ -6576,6 +6605,9 @@ local_timezone(PyDateTime_DateTime *utc_time)
65766605
65776606 PyObject * current_mod = NULL ;
65786607 datetime_state * st = GET_CURRENT_STATE (current_mod );
6608+ if (current_mod == NULL ) {
6609+ return NULL ;
6610+ }
65796611
65806612 delta = datetime_subtract ((PyObject * )utc_time , CONST_EPOCH (st ));
65816613 RELEASE_CURRENT_STATE (st , current_mod );
@@ -6820,6 +6852,9 @@ datetime_timestamp(PyObject *op, PyObject *Py_UNUSED(dummy))
68206852 if (HASTZINFO (self ) && self -> tzinfo != Py_None ) {
68216853 PyObject * current_mod = NULL ;
68226854 datetime_state * st = GET_CURRENT_STATE (current_mod );
6855+ if (current_mod == NULL ) {
6856+ return NULL ;
6857+ }
68236858
68246859 PyObject * delta ;
68256860 delta = datetime_subtract (op , CONST_EPOCH (st ));
0 commit comments