]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-40777: Initialize PyDateTime_IsoCalendarDateType.tp_base at run-time (GH-20493)
authorPetr Viktorin <encukou@gmail.com>
Thu, 28 May 2020 16:14:46 +0000 (18:14 +0200)
committerGitHub <noreply@github.com>
Thu, 28 May 2020 16:14:46 +0000 (09:14 -0700)
Recent changes to _datetimemodule broke compilation on mingw; see the comments in this change for details.

FWIW, @corona10: this issue is why `PyType_FromModuleAndSpec` & friends take the `bases` argument at run time.

Misc/NEWS.d/next/Library/2020-05-28-17-32-29.bpo-40777.1kJU6N.rst [new file with mode: 0644]
Modules/_datetimemodule.c

diff --git a/Misc/NEWS.d/next/Library/2020-05-28-17-32-29.bpo-40777.1kJU6N.rst b/Misc/NEWS.d/next/Library/2020-05-28-17-32-29.bpo-40777.1kJU6N.rst
new file mode 100644 (file)
index 0000000..761bc83
--- /dev/null
@@ -0,0 +1,2 @@
+Initialize PyDateTime_IsoCalendarDateType.tp_base at run-time to avoid
+errors on some compilers.
index 7a5efd23b9e45e6b8f54c504d17fa8ee2dba075c..acdde83dc845a5d36a22675175e936313224741a 100644 (file)
@@ -3325,7 +3325,7 @@ static PyTypeObject PyDateTime_IsoCalendarDateType = {
     .tp_doc = iso_calendar_date__doc__,
     .tp_methods = iso_calendar_date_methods,
     .tp_getset = iso_calendar_date_getset,
-    .tp_base = &PyTuple_Type,
+    // .tp_base = &PyTuple_Type,  // filled in PyInit__datetime
     .tp_new = iso_calendar_date_new,
 };
 
@@ -4079,7 +4079,7 @@ static PyTypeObject PyDateTime_TimeZoneType = {
     timezone_methods,                 /* tp_methods */
     0,                                /* tp_members */
     0,                                /* tp_getset */
-    &PyDateTime_TZInfoType,           /* tp_base */
+    0,                                /* tp_base; filled in PyInit__datetime */
     0,                                /* tp_dict */
     0,                                /* tp_descr_get */
     0,                                /* tp_descr_set */
@@ -6458,7 +6458,8 @@ static PyTypeObject PyDateTime_DateTimeType = {
     datetime_methods,                           /* tp_methods */
     0,                                          /* tp_members */
     datetime_getset,                            /* tp_getset */
-    &PyDateTime_DateType,                       /* tp_base */
+    0,                                          /* tp_base; filled in
+                                                   PyInit__datetime */
     0,                                          /* tp_dict */
     0,                                          /* tp_descr_get */
     0,                                          /* tp_descr_set */
@@ -6524,6 +6525,12 @@ PyInit__datetime(void)
     if (m == NULL)
         return NULL;
 
+    // `&...` is not a constant expression according to a strict reading
+    // of C standards. Fill tp_base at run-time rather than statically.
+    // See https://bugs.python.org/issue40777
+    PyDateTime_IsoCalendarDateType.tp_base = &PyTuple_Type;
+    PyDateTime_TimeZoneType.tp_base = &PyDateTime_TZInfoType;
+    PyDateTime_DateTimeType.tp_base = &PyDateTime_DateType;
 
     PyTypeObject *types[] = {
         &PyDateTime_DateType,