diff -r 8f4e2080e7a5 Modules/_datetimemodule.c --- a/Modules/_datetimemodule.c Tue Jan 03 11:19:48 2017 +0200 +++ b/Modules/_datetimemodule.c Tue Jan 03 23:44:31 2017 +0100 @@ -49,14 +49,17 @@ class datetime.datetime "PyDateTime_Date #define MAX_DELTA_DAYS 999999999 /* Rename the long macros in datetime.h to more reasonable short names. */ -#define GET_YEAR PyDateTime_GET_YEAR -#define GET_MONTH PyDateTime_GET_MONTH -#define GET_DAY PyDateTime_GET_DAY -#define DATE_GET_HOUR PyDateTime_DATE_GET_HOUR -#define DATE_GET_MINUTE PyDateTime_DATE_GET_MINUTE -#define DATE_GET_SECOND PyDateTime_DATE_GET_SECOND -#define DATE_GET_MICROSECOND PyDateTime_DATE_GET_MICROSECOND -#define DATE_GET_FOLD PyDateTime_DATE_GET_FOLD +#define CHECK(o) assert(PyType_IsSubtype(Py_TYPE(o), &PyDateTime_DateType) || PyType_IsSubtype(Py_TYPE(o), &PyDateTime_DateTimeType)) +#define GET_YEAR(o) (CHECK(o), PyDateTime_GET_YEAR(o)) +#define GET_MONTH(o) (CHECK(o), PyDateTime_GET_MONTH(o)) +#define GET_DAY(o) (CHECK(o), PyDateTime_GET_DAY(o)) + +#define DATE_CHECK(o) assert(PyType_IsSubtype(Py_TYPE(o), &PyDateTime_DateType)) +#define DATE_GET_HOUR(o) (DATE_CHECK(o), PyDateTime_DATE_GET_HOUR(o)) +#define DATE_GET_MINUTE(o) (DATE_CHECK(o), PyDateTime_DATE_GET_MINUTE(o)) +#define DATE_GET_SECOND(o) (DATE_CHECK(o), PyDateTime_DATE_GET_SECOND(o)) +#define DATE_GET_MICROSECOND(o) (DATE_CHECK(o), PyDateTime_DATE_GET_MICROSECOND(o)) +#define DATE_GET_FOLD(o) (DATE_CHECK(o), PyDateTime_DATE_GET_FOLD(o)) /* Date accessors for date and datetime. */ #define SET_YEAR(o, v) (((o)->data[0] = ((v) & 0xff00) >> 8), \ @@ -75,11 +78,12 @@ class datetime.datetime "PyDateTime_Date #define DATE_SET_FOLD(o, v) (PyDateTime_DATE_GET_FOLD(o) = (v)) /* Time accessors for time. */ -#define TIME_GET_HOUR PyDateTime_TIME_GET_HOUR -#define TIME_GET_MINUTE PyDateTime_TIME_GET_MINUTE -#define TIME_GET_SECOND PyDateTime_TIME_GET_SECOND -#define TIME_GET_MICROSECOND PyDateTime_TIME_GET_MICROSECOND -#define TIME_GET_FOLD PyDateTime_TIME_GET_FOLD +#define TIME_CHECK(o) assert(PyType_IsSubtype(Py_TYPE(o), &PyDateTime_TimeType)) +#define TIME_GET_HOUR(o) (TIME_CHECK(o), PyDateTime_TIME_GET_HOUR(o)) +#define TIME_GET_MINUTE(o) (TIME_CHECK(o), PyDateTime_TIME_GET_MINUTE(o)) +#define TIME_GET_SECOND(o) (TIME_CHECK(o), PyDateTime_TIME_GET_SECOND(o)) +#define TIME_GET_MICROSECOND(o) (TIME_CHECK(o), PyDateTime_TIME_GET_MICROSECOND(o)) +#define TIME_GET_FOLD(o) (TIME_CHECK(o), PyDateTime_TIME_GET_FOLD(o)) #define TIME_SET_HOUR(o, v) (PyDateTime_TIME_GET_HOUR(o) = (v)) #define TIME_SET_MINUTE(o, v) (PyDateTime_TIME_GET_MINUTE(o) = (v)) #define TIME_SET_SECOND(o, v) (PyDateTime_TIME_GET_SECOND(o) = (v))