Skip to content

Commit 5c25927

Browse files
Give each module its own heap types.
1 parent 62b3d5e commit 5c25927

File tree

1 file changed

+37
-21
lines changed

1 file changed

+37
-21
lines changed

Modules/_datetimemodule.c

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6968,27 +6968,8 @@ create_timezone_from_delta(int days, int sec, int ms, int normalize)
69686968
}
69696969

69706970
static int
6971-
copy_state(datetime_state *st, datetime_state *from)
6972-
{
6973-
*st = (datetime_state){
6974-
.isocalendar_date_type
6975-
= (PyTypeObject *)Py_NewRef(from->isocalendar_date_type),
6976-
.us_per_ms = Py_NewRef(from->us_per_ms),
6977-
.us_per_second = Py_NewRef(from->us_per_second),
6978-
.us_per_minute = Py_NewRef(from->us_per_minute),
6979-
.us_per_hour = Py_NewRef(from->us_per_hour),
6980-
.us_per_day = Py_NewRef(from->us_per_day),
6981-
.us_per_week = Py_NewRef(from->us_per_week),
6982-
.seconds_per_day = Py_NewRef(from->seconds_per_day),
6983-
.epoch = Py_NewRef(from->epoch),
6984-
};
6985-
return 0;
6986-
}
6987-
6988-
static int
6989-
init_state(datetime_state *st, PyObject *module)
6971+
init_heap_types(datetime_state *st, PyObject *module)
69906972
{
6991-
/* Per-module heap types. */
69926973
#define ADD_TYPE(FIELD, SPEC, BASE) \
69936974
do { \
69946975
PyObject *cls = PyType_FromModuleAndSpec( \
@@ -7002,6 +6983,15 @@ init_state(datetime_state *st, PyObject *module)
70026983
ADD_TYPE(isocalendar_date_type, &isocal_spec, &PyTuple_Type);
70036984
#undef ADD_TYPE
70046985

6986+
return 0;
6987+
}
6988+
6989+
static int
6990+
init_state(datetime_state *st)
6991+
{
6992+
/* st->isocalendar_date_type was set via init_heap_types(). */
6993+
assert(st->isocalendar_date_type != NULL);
6994+
70056995
st->us_per_ms = PyLong_FromLong(1000);
70066996
if (st->us_per_ms == NULL) {
70076997
return -1;
@@ -7045,6 +7035,28 @@ init_state(datetime_state *st, PyObject *module)
70457035
return 0;
70467036
}
70477037

7038+
static int
7039+
copy_state(datetime_state *st, datetime_state *from)
7040+
{
7041+
/* isocalendar_date_type is set via init_heap_types(). */
7042+
assert(st->isocalendar_date_type != NULL);
7043+
assert(st->isocalendar_date_type != from->isocalendar_date_type);
7044+
7045+
*st = (datetime_state){
7046+
.isocalendar_date_type = st->isocalendar_date_type,
7047+
.us_per_ms = Py_NewRef(from->us_per_ms),
7048+
.us_per_second = Py_NewRef(from->us_per_second),
7049+
.us_per_minute = Py_NewRef(from->us_per_minute),
7050+
.us_per_hour = Py_NewRef(from->us_per_hour),
7051+
.us_per_day = Py_NewRef(from->us_per_day),
7052+
.us_per_week = Py_NewRef(from->us_per_week),
7053+
.seconds_per_day = Py_NewRef(from->seconds_per_day),
7054+
.epoch = Py_NewRef(from->epoch),
7055+
};
7056+
7057+
return 0;
7058+
}
7059+
70487060
static int
70497061
traverse_state(datetime_state *st, visitproc visit, void *arg)
70507062
{
@@ -7105,14 +7117,18 @@ _datetime_exec(PyObject *module)
71057117
}
71067118
}
71077119

7120+
if (init_heap_types(st, module) < 0) {
7121+
goto error;
7122+
}
7123+
71087124
if (old_module != NULL) {
71097125
datetime_state *st_old = get_module_state(old_module);
71107126
if (copy_state(st, st_old) < 0) {
71117127
goto error;
71127128
}
71137129
}
71147130
else {
7115-
if (init_state(st, module) < 0) {
7131+
if (init_state(st) < 0) {
71167132
goto error;
71177133
}
71187134
}

0 commit comments

Comments
 (0)