bpo-36025: Fix PyDate_FromTimestamp API (GH-11922)

In the process of converting the date.fromtimestamp function to use
argument clinic in GH-8535, the C API for PyDate_FromTimestamp was
inadvertently changed to expect a timestamp object rather than an
argument tuple.

This PR fixes this backwards-incompatible change by adding a new wrapper
function for the C API function that unwraps the argument tuple and
passes it to the underlying function.

This PR also adds tests for both PyDate_FromTimestamp and
PyDateTime_FromTimestamp to prevent any further regressions.
This commit is contained in:
Paul Ganssle 2019-04-27 15:39:40 -04:00 committed by Berker Peksag
parent 5c403b2035
commit 4d8c8c0ad6
4 changed files with 126 additions and 2 deletions

View file

@ -2921,6 +2921,23 @@ datetime_date_fromtimestamp(PyTypeObject *type, PyObject *timestamp)
return date_fromtimestamp((PyObject *) type, timestamp);
}
/* bpo-36025: This is a wrapper for API compatibility with the public C API,
* which expects a function that takes an *args tuple, whereas the argument
* clinic generates code that takes METH_O.
*/
static PyObject *
datetime_date_fromtimestamp_capi(PyObject *cls, PyObject *args)
{
PyObject *timestamp;
PyObject *result = NULL;
if (PyArg_UnpackTuple(args, "fromtimestamp", 1, 1, &timestamp)) {
result = date_fromtimestamp(cls, timestamp);
}
return result;
}
/* Return new date from proleptic Gregorian ordinal. Raises ValueError if
* the ordinal is out of range.
*/
@ -6275,7 +6292,7 @@ static PyDateTime_CAPI CAPI = {
new_delta_ex,
new_timezone,
datetime_fromtimestamp,
date_fromtimestamp,
datetime_date_fromtimestamp_capi,
new_datetime_ex2,
new_time_ex2
};