From 2f7832f7645cce03b1349a33d89c9b936b1420bc Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 30 Oct 2018 12:09:29 +0100 Subject: [PATCH 1/6] bpo-35081: Remove Py_BUILD_CORE from datetime.h Datetime macros like PyDate_Check() are now reimplemented in _datetimemodule.c, rather than having two implementations depending on Py_BUILD_CORE in datetime.h. These macros are not used outside _datetimemodule.c. --- Include/datetime.h | 22 ---------------------- Modules/_datetimemodule.c | 35 +++++++++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 30 deletions(-) diff --git a/Include/datetime.h b/Include/datetime.h index 059d5ecf7a2113..79e07f1efcdaff 100644 --- a/Include/datetime.h +++ b/Include/datetime.h @@ -180,26 +180,6 @@ typedef struct { #define PyDateTime_CAPSULE_NAME "datetime.datetime_CAPI" -#ifdef Py_BUILD_CORE - -/* Macros for type checking when building the Python core. */ -#define PyDate_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateType) -#define PyDate_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateType) - -#define PyDateTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateTimeType) -#define PyDateTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateTimeType) - -#define PyTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_TimeType) -#define PyTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TimeType) - -#define PyDelta_Check(op) PyObject_TypeCheck(op, &PyDateTime_DeltaType) -#define PyDelta_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DeltaType) - -#define PyTZInfo_Check(op) PyObject_TypeCheck(op, &PyDateTime_TZInfoType) -#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TZInfoType) - -#else - /* Define global variable for the C API and a macro for setting it. */ static PyDateTime_CAPI *PyDateTimeAPI = NULL; @@ -264,8 +244,6 @@ static PyDateTime_CAPI *PyDateTimeAPI = NULL; PyDateTimeAPI->Date_FromTimestamp( \ (PyObject*) (PyDateTimeAPI->DateType), args) -#endif /* Py_BUILD_CORE */ - #ifdef __cplusplus } #endif diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index bc4caa02d5f146..6fb46b3d33116e 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -3,6 +3,7 @@ */ #include "Python.h" +#include "datetime.h" #include "structmember.h" #include @@ -11,14 +12,32 @@ # include /* struct timeval */ #endif -/* Differentiate between building the core module and building extension - * modules. - */ -#ifndef Py_BUILD_CORE -#define Py_BUILD_CORE -#endif -#include "datetime.h" -#undef Py_BUILD_CORE + +#undef PyDate_Check +#undef PyDate_CheckExact +#define PyDate_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateType) +#define PyDate_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateType) + +#undef PyDateTime_Check +#undef PyDateTime_CheckExact +#define PyDateTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateTimeType) +#define PyDateTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateTimeType) + +#undef PyTime_Check +#undef PyTime_CheckExact +#define PyTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_TimeType) +#define PyTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TimeType) + +#undef PyDelta_Check +#undef PyDelta_CheckExact +#define PyDelta_Check(op) PyObject_TypeCheck(op, &PyDateTime_DeltaType) +#define PyDelta_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DeltaType) + +#undef PyTZInfo_Check +#undef PyTZInfo_CheckExact +#define PyTZInfo_Check(op) PyObject_TypeCheck(op, &PyDateTime_TZInfoType) +#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TZInfoType) + /*[clinic input] module datetime From 1858252d0d72f30dd881a6216aa75f725ea94fed Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 30 Oct 2018 14:30:22 +0100 Subject: [PATCH 2/6] Add #undef PyDateTime_TimeZone_UTC to C file --- Modules/_datetimemodule.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 6fb46b3d33116e..a820177a634d86 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -38,6 +38,8 @@ #define PyTZInfo_Check(op) PyObject_TypeCheck(op, &PyDateTime_TZInfoType) #define PyTZInfo_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TZInfoType) +#undef PyDateTime_TimeZone_UTC + /*[clinic input] module datetime From 22abaeea0ec2963bbf1816b6934b1a2be4c0fe66 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 30 Oct 2018 16:02:52 +0100 Subject: [PATCH 3/6] Add a comment --- Modules/_datetimemodule.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index a820177a634d86..62c6060db6eef6 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -12,6 +12,8 @@ # include /* struct timeval */ #endif +/* Redefine macros defined in datetime.h to use directly types, + rather than getting types from PyDateTimeAPI. */ #undef PyDate_Check #undef PyDate_CheckExact From 8a11d0648dbdca14407ee3720cbdc68723d2be7a Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 1 Nov 2018 00:08:11 +0100 Subject: [PATCH 4/6] PyDateTimeAPI variable must not be defined in _datetimemodule.c --- Include/datetime.h | 4 ++++ Modules/_datetimemodule.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/Include/datetime.h b/Include/datetime.h index 79e07f1efcdaff..dde31e17917407 100644 --- a/Include/datetime.h +++ b/Include/datetime.h @@ -180,8 +180,12 @@ typedef struct { #define PyDateTime_CAPSULE_NAME "datetime.datetime_CAPI" +/* When datetime.h is included from _datetimemodule.c, + the PyDateTimeAPI variable must not be defined. */ +#ifndef _PY_DATETIME_IMPL /* Define global variable for the C API and a macro for setting it. */ static PyDateTime_CAPI *PyDateTimeAPI = NULL; +#endif #define PyDateTime_IMPORT \ PyDateTimeAPI = (PyDateTime_CAPI *)PyCapsule_Import(PyDateTime_CAPSULE_NAME, 0) diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 62c6060db6eef6..0aa4a318ae95ef 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -2,6 +2,10 @@ * http://www.zope.org/Members/fdrake/DateTimeWiki/FrontPage */ +/* When datetime.h is included from _datetimemodule.c, + the PyDateTimeAPI variable must not be defined. */ +#define _PY_DATETIME_IMPL + #include "Python.h" #include "datetime.h" #include "structmember.h" From a2750c666a02a8d10604ad6e1d489c8eb2fb8192 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 1 Nov 2018 00:12:00 +0100 Subject: [PATCH 5/6] Extend the scope of _PY_DATETIME_IMPL --- Include/datetime.h | 5 +++-- Modules/_datetimemodule.c | 17 +---------------- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/Include/datetime.h b/Include/datetime.h index dde31e17917407..2af4088665b9d1 100644 --- a/Include/datetime.h +++ b/Include/datetime.h @@ -181,11 +181,10 @@ typedef struct { /* When datetime.h is included from _datetimemodule.c, - the PyDateTimeAPI variable must not be defined. */ + the macros are defines in _datetimemodule.c. */ #ifndef _PY_DATETIME_IMPL /* Define global variable for the C API and a macro for setting it. */ static PyDateTime_CAPI *PyDateTimeAPI = NULL; -#endif #define PyDateTime_IMPORT \ PyDateTimeAPI = (PyDateTime_CAPI *)PyCapsule_Import(PyDateTime_CAPSULE_NAME, 0) @@ -208,6 +207,8 @@ static PyDateTime_CAPI *PyDateTimeAPI = NULL; #define PyTZInfo_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TZInfoType) #define PyTZInfo_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TZInfoType) +#endif /* !defined(_PY_DATETIME_IMPL) */ + /* Macros for accessing constructors in a simplified fashion. */ #define PyDate_FromDate(year, month, day) \ diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 0aa4a318ae95ef..a986668332cc81 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -3,7 +3,7 @@ */ /* When datetime.h is included from _datetimemodule.c, - the PyDateTimeAPI variable must not be defined. */ + the macros are defines in _datetimemodule.c. */ #define _PY_DATETIME_IMPL #include "Python.h" @@ -16,36 +16,21 @@ # include /* struct timeval */ #endif -/* Redefine macros defined in datetime.h to use directly types, - rather than getting types from PyDateTimeAPI. */ - -#undef PyDate_Check -#undef PyDate_CheckExact #define PyDate_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateType) #define PyDate_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateType) -#undef PyDateTime_Check -#undef PyDateTime_CheckExact #define PyDateTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateTimeType) #define PyDateTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateTimeType) -#undef PyTime_Check -#undef PyTime_CheckExact #define PyTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_TimeType) #define PyTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TimeType) -#undef PyDelta_Check -#undef PyDelta_CheckExact #define PyDelta_Check(op) PyObject_TypeCheck(op, &PyDateTime_DeltaType) #define PyDelta_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DeltaType) -#undef PyTZInfo_Check -#undef PyTZInfo_CheckExact #define PyTZInfo_Check(op) PyObject_TypeCheck(op, &PyDateTime_TZInfoType) #define PyTZInfo_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TZInfoType) -#undef PyDateTime_TimeZone_UTC - /*[clinic input] module datetime From 69a455d2f7a4d2db0cc8a83a139b354b9755f148 Mon Sep 17 00:00:00 2001 From: Paul Ganssle Date: Thu, 1 Nov 2018 18:16:42 +0100 Subject: [PATCH 6/6] Update Include/datetime.h Co-Authored-By: vstinner --- Include/datetime.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/datetime.h b/Include/datetime.h index 2af4088665b9d1..4da4ef0d8b2d5d 100644 --- a/Include/datetime.h +++ b/Include/datetime.h @@ -181,7 +181,7 @@ typedef struct { /* When datetime.h is included from _datetimemodule.c, - the macros are defines in _datetimemodule.c. */ + the macros are defined in _datetimemodule.c. */ #ifndef _PY_DATETIME_IMPL /* Define global variable for the C API and a macro for setting it. */ static PyDateTime_CAPI *PyDateTimeAPI = NULL;