Kaydet (Commit) 0d12672b authored tarafından Paul Ganssle's avatar Paul Ganssle Kaydeden (comit) Victor Stinner

bpo-35081: Remove Py_BUILD_CORE from datetime.h (GH-10416)

Datetime macros like PyDate_Check() have two implementations, one using
the C API capsule and one using direct access to the datetime type
symbols defined in _datetimemodule.c. Since the direct access versions
of the macros are only used in _datetimemodule.c, they have been moved
out of "datetime.h" and into _datetimemodule.c.

The _PY_DATETIME_IMPL macro is currently necessary in order to avoid
both duplicate definitions of these macros in _datetimemodule.c and
unnecessary declarations of C API capsule-related macros and varibles in
datetime.h.
Co-Authored-By: 's avatarVictor Stinner <vstinner@redhat.com>
üst 3015fb8c
...@@ -180,26 +180,11 @@ typedef struct { ...@@ -180,26 +180,11 @@ typedef struct {
#define PyDateTime_CAPSULE_NAME "datetime.datetime_CAPI" #define PyDateTime_CAPSULE_NAME "datetime.datetime_CAPI"
#ifdef Py_BUILD_CORE /* This block is only used as part of the public API and should not be
* included in _datetimemodule.c, which does not use the C API capsule.
/* Macros for type checking when building the Python core. */ * See bpo-35081 for more details.
#define PyDate_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateType) * */
#define PyDate_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateType) #ifndef _PY_DATETIME_IMPL
#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. */ /* Define global variable for the C API and a macro for setting it. */
static PyDateTime_CAPI *PyDateTimeAPI = NULL; static PyDateTime_CAPI *PyDateTimeAPI = NULL;
...@@ -225,6 +210,7 @@ static PyDateTime_CAPI *PyDateTimeAPI = NULL; ...@@ -225,6 +210,7 @@ static PyDateTime_CAPI *PyDateTimeAPI = NULL;
#define PyTZInfo_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TZInfoType) #define PyTZInfo_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TZInfoType)
#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TZInfoType) #define PyTZInfo_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TZInfoType)
/* Macros for accessing constructors in a simplified fashion. */ /* Macros for accessing constructors in a simplified fashion. */
#define PyDate_FromDate(year, month, day) \ #define PyDate_FromDate(year, month, day) \
PyDateTimeAPI->Date_FromDate(year, month, day, PyDateTimeAPI->DateType) PyDateTimeAPI->Date_FromDate(year, month, day, PyDateTimeAPI->DateType)
...@@ -264,7 +250,7 @@ static PyDateTime_CAPI *PyDateTimeAPI = NULL; ...@@ -264,7 +250,7 @@ static PyDateTime_CAPI *PyDateTimeAPI = NULL;
PyDateTimeAPI->Date_FromTimestamp( \ PyDateTimeAPI->Date_FromTimestamp( \
(PyObject*) (PyDateTimeAPI->DateType), args) (PyObject*) (PyDateTimeAPI->DateType), args)
#endif /* Py_BUILD_CORE */ #endif /* !defined(_PY_DATETIME_IMPL) */
#ifdef __cplusplus #ifdef __cplusplus
} }
......
...@@ -2,7 +2,13 @@ ...@@ -2,7 +2,13 @@
* http://www.zope.org/Members/fdrake/DateTimeWiki/FrontPage * http://www.zope.org/Members/fdrake/DateTimeWiki/FrontPage
*/ */
/* bpo-35081: Defining this prevents including the C API capsule;
* internal versions of the Py*_Check macros which do not require
* the capsule are defined below */
#define _PY_DATETIME_IMPL
#include "Python.h" #include "Python.h"
#include "datetime.h"
#include "structmember.h" #include "structmember.h"
#include <time.h> #include <time.h>
...@@ -11,14 +17,21 @@ ...@@ -11,14 +17,21 @@
# include <winsock2.h> /* struct timeval */ # include <winsock2.h> /* struct timeval */
#endif #endif
/* Differentiate between building the core module and building extension #define PyDate_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateType)
* modules. #define PyDate_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateType)
*/
#ifndef Py_BUILD_CORE #define PyDateTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateTimeType)
#define Py_BUILD_CORE #define PyDateTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateTimeType)
#endif
#include "datetime.h" #define PyTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_TimeType)
#undef Py_BUILD_CORE #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)
/*[clinic input] /*[clinic input]
module datetime module datetime
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment