Issue #9012: "Separate compilation of time and datetime modules."
Segregated code shared between time and datetime modules into Modules/_time.c. Added a new header file, Modules/_time.h, which will be used instead of Include/timefuncs.h for declarations shared between time and datetime modules.
This commit is contained in:
parent
294f27141f
commit
d95a586d77
|
@ -0,0 +1,28 @@
|
||||||
|
#include "Python.h"
|
||||||
|
#include "_time.h"
|
||||||
|
|
||||||
|
/* Exposed in timefuncs.h. */
|
||||||
|
time_t
|
||||||
|
_PyTime_DoubleToTimet(double x)
|
||||||
|
{
|
||||||
|
time_t result;
|
||||||
|
double diff;
|
||||||
|
|
||||||
|
result = (time_t)x;
|
||||||
|
/* How much info did we lose? time_t may be an integral or
|
||||||
|
* floating type, and we don't know which. If it's integral,
|
||||||
|
* we don't know whether C truncates, rounds, returns the floor,
|
||||||
|
* etc. If we lost a second or more, the C rounding is
|
||||||
|
* unreasonable, or the input just doesn't fit in a time_t;
|
||||||
|
* call it an error regardless. Note that the original cast to
|
||||||
|
* time_t can cause a C error too, but nothing we can do to
|
||||||
|
* worm around that.
|
||||||
|
*/
|
||||||
|
diff = x - (double)result;
|
||||||
|
if (diff <= -1.0 || diff >= 1.0) {
|
||||||
|
PyErr_SetString(PyExc_ValueError,
|
||||||
|
"timestamp out of range for platform time_t");
|
||||||
|
result = (time_t)-1;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
/* XXX: It is probably best to move timefuncs.h content in here, and
|
||||||
|
remove it but user code may rely on it. */
|
||||||
|
#include "timefuncs.h"
|
|
@ -90,32 +90,6 @@ static double floattime(void);
|
||||||
/* For Y2K check */
|
/* For Y2K check */
|
||||||
static PyObject *moddict;
|
static PyObject *moddict;
|
||||||
|
|
||||||
/* Exposed in timefuncs.h. */
|
|
||||||
time_t
|
|
||||||
_PyTime_DoubleToTimet(double x)
|
|
||||||
{
|
|
||||||
time_t result;
|
|
||||||
double diff;
|
|
||||||
|
|
||||||
result = (time_t)x;
|
|
||||||
/* How much info did we lose? time_t may be an integral or
|
|
||||||
* floating type, and we don't know which. If it's integral,
|
|
||||||
* we don't know whether C truncates, rounds, returns the floor,
|
|
||||||
* etc. If we lost a second or more, the C rounding is
|
|
||||||
* unreasonable, or the input just doesn't fit in a time_t;
|
|
||||||
* call it an error regardless. Note that the original cast to
|
|
||||||
* time_t can cause a C error too, but nothing we can do to
|
|
||||||
* worm around that.
|
|
||||||
*/
|
|
||||||
diff = x - (double)result;
|
|
||||||
if (diff <= -1.0 || diff >= 1.0) {
|
|
||||||
PyErr_SetString(PyExc_ValueError,
|
|
||||||
"timestamp out of range for platform time_t");
|
|
||||||
result = (time_t)-1;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
time_time(PyObject *self, PyObject *unused)
|
time_time(PyObject *self, PyObject *unused)
|
||||||
{
|
{
|
||||||
|
|
4
setup.py
4
setup.py
|
@ -450,9 +450,9 @@ class PyBuildExt(build_ext):
|
||||||
depends=['_math.h'],
|
depends=['_math.h'],
|
||||||
libraries=math_libs) )
|
libraries=math_libs) )
|
||||||
# time operations and variables
|
# time operations and variables
|
||||||
exts.append( Extension('time', ['timemodule.c'],
|
exts.append( Extension('time', ['timemodule.c', '_time.c'],
|
||||||
libraries=math_libs) )
|
libraries=math_libs) )
|
||||||
exts.append( Extension('datetime', ['datetimemodule.c', 'timemodule.c'],
|
exts.append( Extension('datetime', ['datetimemodule.c', '_time.c'],
|
||||||
libraries=math_libs) )
|
libraries=math_libs) )
|
||||||
# fast iterator tools implemented in C
|
# fast iterator tools implemented in C
|
||||||
exts.append( Extension("itertools", ["itertoolsmodule.c"]) )
|
exts.append( Extension("itertools", ["itertoolsmodule.c"]) )
|
||||||
|
|
Loading…
Reference in New Issue