Skip to content

Commit 4aa5a09

Browse files
committed
apply victor's comment
1 parent 5312f2f commit 4aa5a09

File tree

1 file changed

+20
-10
lines changed

1 file changed

+20
-10
lines changed

Modules/_datetimemodule.c

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6477,9 +6477,9 @@ static PyMethodDef module_methods[] = {
64776477
* Clients get at C API via PyDateTime_IMPORT, defined in datetime.h.
64786478
*/
64796479
static inline PyDateTime_CAPI *
6480-
get_datetime_capi()
6480+
get_datetime_capi(void)
64816481
{
6482-
PyDateTime_CAPI *capi = PyMem_Calloc(1, sizeof(PyDateTime_CAPI));
6482+
PyDateTime_CAPI *capi = PyMem_Malloc(sizeof(PyDateTime_CAPI));
64836483
if (capi == NULL) {
64846484
PyErr_NoMemory();
64856485
return NULL;
@@ -6498,6 +6498,10 @@ get_datetime_capi()
64986498
capi->Date_FromTimestamp = datetime_date_fromtimestamp_capi;
64996499
capi->DateTime_FromDateAndTimeAndFold = new_datetime_ex2;
65006500
capi->Time_FromTimeAndFold = new_time_ex2;
6501+
// Make sure this function is called after PyDateTime_TimeZone_UTC has
6502+
// been initialized.
6503+
assert(PyDateTime_TimeZone_UTC != NULL);
6504+
capi->TimeZone_UTC = PyDateTime_TimeZone_UTC; // borrowed ref
65016505
return capi;
65026506
}
65036507

@@ -6511,11 +6515,6 @@ datetime_destructor(PyObject *op)
65116515
static int
65126516
_datetime_exec(PyObject *module)
65136517
{
6514-
PyDateTime_CAPI *CAPI = get_datetime_capi();
6515-
if (CAPI == NULL) {
6516-
return -1;
6517-
}
6518-
65196518
// `&...` is not a constant expression according to a strict reading
65206519
// of C standards. Fill tp_base at run-time rather than statically.
65216520
// See https://bugs.python.org/issue40777
@@ -6600,13 +6599,17 @@ _datetime_exec(PyObject *module)
66006599
}
66016600

66026601
PyDateTime_TimeZone_UTC = x;
6603-
CAPI->TimeZone_UTC = PyDateTime_TimeZone_UTC;
6602+
PyDateTime_CAPI *capi = get_datetime_capi();
6603+
if (capi == NULL) {
6604+
return -1;
6605+
}
66046606

66056607
/* bpo-37642: These attributes are rounded to the nearest minute for backwards
66066608
* compatibility, even though the constructor will accept a wider range of
66076609
* values. This may change in the future.*/
66086610
delta = new_delta(-1, 60, 0, 1); /* -23:59 */
66096611
if (delta == NULL) {
6612+
PyMem_Free(capi);
66106613
return -1;
66116614
}
66126615

@@ -6616,6 +6619,7 @@ _datetime_exec(PyObject *module)
66166619

66176620
delta = new_delta(0, (23 * 60 + 59) * 60, 0, 0); /* +23:59 */
66186621
if (delta == NULL) {
6622+
PyMem_Free(capi);
66196623
return -1;
66206624
}
66216625

@@ -6627,25 +6631,29 @@ _datetime_exec(PyObject *module)
66276631
PyDateTime_Epoch = new_datetime(1970, 1, 1, 0, 0, 0, 0,
66286632
PyDateTime_TimeZone_UTC, 0);
66296633
if (PyDateTime_Epoch == NULL) {
6634+
PyMem_Free(capi);
66306635
return -1;
66316636
}
66326637

66336638
/* module initialization */
66346639
if (PyModule_AddIntMacro(module, MINYEAR) < 0) {
6640+
PyMem_Free(capi);
66356641
return -1;
66366642
}
66376643
if (PyModule_AddIntMacro(module, MAXYEAR) < 0) {
6644+
PyMem_Free(capi);
66386645
return -1;
66396646
}
66406647

6641-
x = PyCapsule_New(CAPI, PyDateTime_CAPSULE_NAME, datetime_destructor);
6648+
x = PyCapsule_New(capi, PyDateTime_CAPSULE_NAME, datetime_destructor);
66426649
if (x == NULL) {
6643-
PyMem_Free(CAPI);
6650+
PyMem_Free(capi);
66446651
return -1;
66456652
}
66466653

66476654
if (PyModule_AddObject(module, "datetime_CAPI", x) < 0) {
66486655
Py_DECREF(x);
6656+
PyMem_Free(capi);
66496657
return -1;
66506658
}
66516659

@@ -6673,6 +6681,7 @@ _datetime_exec(PyObject *module)
66736681
seconds_per_day = PyLong_FromLong(24 * 3600);
66746682
if (us_per_ms == NULL || us_per_second == NULL ||
66756683
us_per_minute == NULL || seconds_per_day == NULL) {
6684+
PyMem_Free(capi);
66766685
return -1;
66776686
}
66786687

@@ -6683,6 +6692,7 @@ _datetime_exec(PyObject *module)
66836692
us_per_day = PyLong_FromDouble(86400000000.0);
66846693
us_per_week = PyLong_FromDouble(604800000000.0);
66856694
if (us_per_hour == NULL || us_per_day == NULL || us_per_week == NULL) {
6695+
PyMem_Free(capi);
66866696
return -1;
66876697
}
66886698
return 0;

0 commit comments

Comments
 (0)