Skip to content

Commit 6880f34

Browse files
committed
Update and pass tests
1 parent aa86807 commit 6880f34

File tree

2 files changed

+54
-14
lines changed

2 files changed

+54
-14
lines changed

Lib/test/datetimetester.py

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7273,7 +7273,7 @@ def test_update_type_cache(self):
72737273
res = script_helper.assert_python_ok('-c', script)
72747274
self.assertFalse(res.err)
72757275

7276-
def test_module_state_at_shutdown(self):
7276+
def test_static_type_at_shutdown1(self):
72777277
# gh-132413
72787278
script = textwrap.dedent("""
72797279
import sys
@@ -7284,7 +7284,7 @@ def gen():
72847284
yield
72857285
finally:
72867286
assert not sys.modules
7287-
td = _datetime.timedelta(days=1) # crash
7287+
td = _datetime.timedelta(days=1)
72887288
assert td.days == 1
72897289
assert not sys.modules
72907290
@@ -7294,19 +7294,17 @@ def gen():
72947294
res = script_helper.assert_python_ok('-c', script)
72957295
self.assertFalse(res.err)
72967296

7297-
def test_module_state_at_shutdown2(self):
7297+
def test_static_type_at_shutdown2(self):
72987298
script = textwrap.dedent("""
72997299
import sys
7300-
import _datetime
7301-
timedelta = _datetime.timedelta
7302-
del _datetime
7303-
del sys.modules["_datetime"]
7300+
from _datetime import timedelta
73047301
73057302
def gen():
73067303
try:
73077304
yield
73087305
finally:
7309-
td = timedelta(days=1) # crash
7306+
assert not sys.modules
7307+
td = timedelta(days=1)
73107308
assert td.days == 1
73117309
assert not sys.modules
73127310
@@ -7316,15 +7314,34 @@ def gen():
73167314
res = script_helper.assert_python_ok('-c', script)
73177315
self.assertFalse(res.err)
73187316

7319-
def test_module_state_after_gc(self):
7317+
def test_static_type_at_shutdown3(self):
73207318
script = textwrap.dedent("""
7319+
import gc
73217320
import sys
7321+
from _datetime import timedelta
7322+
del sys.modules['_datetime']
7323+
gc.collect()
7324+
7325+
def gen():
7326+
try:
7327+
yield
7328+
finally:
7329+
timedelta(days=1)
7330+
7331+
it = gen()
7332+
next(it)
7333+
""")
7334+
res = script_helper.assert_python_ok('-c', script)
7335+
self.assertIn(b'ImportError: sys.meta_path is None', res.err)
7336+
7337+
def test_static_type_before_shutdown(self):
7338+
script = textwrap.dedent("""
73227339
import gc
7323-
import _datetime
7324-
timedelta = _datetime.timedelta
7340+
import sys
7341+
from _datetime import timedelta
73257342
del sys.modules['_datetime']
7326-
del _datetime
73277343
gc.collect()
7344+
73287345
timedelta(days=1)
73297346
assert '_datetime' in sys.modules
73307347
""")
@@ -7339,8 +7356,9 @@ def test_module_free(self):
73397356
ws = weakref.WeakSet()
73407357
for _ in range(3):
73417358
import _datetime
7359+
td = _datetime.timedelta
73427360
ws.add(_datetime)
7343-
del sys.modules["_datetime"]
7361+
del sys.modules['_datetime']
73447362
del _datetime
73457363
gc.collect()
73467364
assert len(ws) == 0

Modules/_datetimemodule.c

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,11 +150,12 @@ _get_current_state(PyObject **p_mod)
150150
return st;
151151
}
152152

153-
assert(!_Py_IsInterpreterFinalizing(interp));
154153
/* The static types can outlive the module,
155154
* so we must re-import the module. */
156155
PyObject *mod = PyImport_ImportModule("_datetime");
157156
if (mod == NULL) {
157+
assert(_Py_IsInterpreterFinalizing(interp));
158+
/* It is not preferable to reload the module implicitly here. */
158159
return NULL;
159160
}
160161
st = get_module_state(mod);
@@ -2047,6 +2048,9 @@ delta_to_microseconds(PyDateTime_Delta *self)
20472048

20482049
PyObject *current_mod = NULL;
20492050
datetime_state *st = GET_CURRENT_STATE(current_mod);
2051+
if (current_mod == NULL) {
2052+
return NULL;
2053+
}
20502054

20512055
x1 = PyLong_FromLong(GET_TD_DAYS(self));
20522056
if (x1 == NULL)
@@ -2126,6 +2130,9 @@ microseconds_to_delta_ex(PyObject *pyus, PyTypeObject *type)
21262130

21272131
PyObject *current_mod = NULL;
21282132
datetime_state *st = GET_CURRENT_STATE(current_mod);
2133+
if (current_mod == NULL) {
2134+
return NULL;
2135+
}
21292136

21302137
tuple = checked_divmod(pyus, CONST_US_PER_SECOND(st));
21312138
if (tuple == NULL) {
@@ -2711,6 +2718,9 @@ delta_new(PyTypeObject *type, PyObject *args, PyObject *kw)
27112718

27122719
PyObject *current_mod = NULL;
27132720
datetime_state *st = GET_CURRENT_STATE(current_mod);
2721+
if (current_mod == NULL) {
2722+
return NULL;
2723+
}
27142724

27152725
/* Argument objects. */
27162726
PyObject *day = NULL;
@@ -2930,6 +2940,9 @@ delta_total_seconds(PyObject *op, PyObject *Py_UNUSED(dummy))
29302940

29312941
PyObject *current_mod = NULL;
29322942
datetime_state *st = GET_CURRENT_STATE(current_mod);
2943+
if (current_mod == NULL) {
2944+
return NULL;
2945+
}
29332946

29342947
total_seconds = PyNumber_TrueDivide(total_microseconds, CONST_US_PER_SECOND(st));
29352948

@@ -3713,6 +3726,9 @@ date_isocalendar(PyObject *self, PyObject *Py_UNUSED(dummy))
37133726

37143727
PyObject *current_mod = NULL;
37153728
datetime_state *st = GET_CURRENT_STATE(current_mod);
3729+
if (current_mod == NULL) {
3730+
return NULL;
3731+
}
37163732

37173733
PyObject *v = iso_calendar_date_new_impl(ISOCALENDAR_DATE_TYPE(st),
37183734
year, week + 1, day + 1);
@@ -6538,6 +6554,9 @@ local_timezone(PyDateTime_DateTime *utc_time)
65386554

65396555
PyObject *current_mod = NULL;
65406556
datetime_state *st = GET_CURRENT_STATE(current_mod);
6557+
if (current_mod == NULL) {
6558+
return NULL;
6559+
}
65416560

65426561
delta = datetime_subtract((PyObject *)utc_time, CONST_EPOCH(st));
65436562
RELEASE_CURRENT_STATE(st, current_mod);
@@ -6782,6 +6801,9 @@ datetime_timestamp(PyObject *op, PyObject *Py_UNUSED(dummy))
67826801
if (HASTZINFO(self) && self->tzinfo != Py_None) {
67836802
PyObject *current_mod = NULL;
67846803
datetime_state *st = GET_CURRENT_STATE(current_mod);
6804+
if (current_mod == NULL) {
6805+
return NULL;
6806+
}
67856807

67866808
PyObject *delta;
67876809
delta = datetime_subtract(op, CONST_EPOCH(st));

0 commit comments

Comments
 (0)