Spaces:
Build error
Build error
File size: 1,365 Bytes
64772a4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
"""
Cython implementation of (parts of) the standard library time module.
"""
from libc.stdint cimport int64_t
from cpython.exc cimport PyErr_SetFromErrno
cdef extern from "Python.h":
ctypedef int64_t _PyTime_t
_PyTime_t _PyTime_GetSystemClock() nogil
double _PyTime_AsSecondsDouble(_PyTime_t t) nogil
from libc.time cimport (
tm,
time_t,
localtime as libc_localtime,
)
cdef inline double time() noexcept nogil:
cdef:
_PyTime_t tic
tic = _PyTime_GetSystemClock()
return _PyTime_AsSecondsDouble(tic)
cdef inline int _raise_from_errno() except -1 with gil:
PyErr_SetFromErrno(RuntimeError)
return <int> -1 # Let the C compiler know that this function always raises.
cdef inline tm localtime() except * nogil:
"""
Analogue to the stdlib time.localtime. The returned struct
has some entries that the stdlib version does not: tm_gmtoff, tm_zone
"""
cdef:
time_t tic = <time_t>time()
tm* result
result = libc_localtime(&tic)
if result is NULL:
_raise_from_errno()
# Fix 0-based date values (and the 1900-based year).
# See tmtotuple() in https://github.com/python/cpython/blob/master/Modules/timemodule.c
result.tm_year += 1900
result.tm_mon += 1
result.tm_wday = (result.tm_wday + 6) % 7
result.tm_yday += 1
return result[0]
|