1#[cfg(not(PyPy))]
8use crate::PyCapsule_Import;
9#[cfg(GraalPy)]
10use crate::{PyLong_AsLong, PyLong_Check, PyObject_GetAttrString, Py_DecRef};
11use crate::{PyObject, PyObject_TypeCheck, PyTypeObject, Py_TYPE};
12use std::os::raw::c_char;
13use std::os::raw::c_int;
14use std::ptr;
15use std::sync::Once;
16use std::{cell::UnsafeCell, ffi::CStr};
17#[cfg(not(PyPy))]
18use {crate::Py_hash_t, std::os::raw::c_uchar};
19const _PyDateTime_DATE_DATASIZE: usize = 4;
21const _PyDateTime_TIME_DATASIZE: usize = 6;
22const _PyDateTime_DATETIME_DATASIZE: usize = 10;
23
24#[repr(C)]
25#[derive(Debug)]
26pub struct PyDateTime_Delta {
28 pub ob_base: PyObject,
29 #[cfg(not(PyPy))]
30 pub hashcode: Py_hash_t,
31 pub days: c_int,
32 pub seconds: c_int,
33 pub microseconds: c_int,
34}
35
36#[cfg(not(any(PyPy, GraalPy)))]
40#[repr(C)]
41#[derive(Debug)]
42pub struct _PyDateTime_BaseTime {
44 pub ob_base: PyObject,
45 pub hashcode: Py_hash_t,
46 pub hastzinfo: c_char,
47 pub data: [c_uchar; _PyDateTime_TIME_DATASIZE],
48}
49
50#[repr(C)]
51#[derive(Debug)]
52pub struct PyDateTime_Time {
54 pub ob_base: PyObject,
55 #[cfg(not(PyPy))]
56 pub hashcode: Py_hash_t,
57 pub hastzinfo: c_char,
58 #[cfg(not(PyPy))]
59 pub data: [c_uchar; _PyDateTime_TIME_DATASIZE],
60 #[cfg(not(PyPy))]
61 pub fold: c_uchar,
62 pub tzinfo: *mut PyObject,
67}
68
69#[repr(C)]
70#[derive(Debug)]
71pub struct PyDateTime_Date {
73 pub ob_base: PyObject,
74 #[cfg(not(PyPy))]
75 pub hashcode: Py_hash_t,
76 #[cfg(not(PyPy))]
77 pub hastzinfo: c_char,
78 #[cfg(not(PyPy))]
79 pub data: [c_uchar; _PyDateTime_DATE_DATASIZE],
80}
81
82#[cfg(not(any(PyPy, GraalPy)))]
83#[repr(C)]
84#[derive(Debug)]
85pub struct _PyDateTime_BaseDateTime {
87 pub ob_base: PyObject,
88 pub hashcode: Py_hash_t,
89 pub hastzinfo: c_char,
90 pub data: [c_uchar; _PyDateTime_DATETIME_DATASIZE],
91}
92
93#[repr(C)]
94#[derive(Debug)]
95pub struct PyDateTime_DateTime {
97 pub ob_base: PyObject,
98 #[cfg(not(PyPy))]
99 pub hashcode: Py_hash_t,
100 pub hastzinfo: c_char,
101 #[cfg(not(PyPy))]
102 pub data: [c_uchar; _PyDateTime_DATETIME_DATASIZE],
103 #[cfg(not(PyPy))]
104 pub fold: c_uchar,
105 pub tzinfo: *mut PyObject,
110}
111
112#[inline]
116#[cfg(not(any(PyPy, GraalPy)))]
117pub unsafe fn PyDateTime_GET_YEAR(o: *mut PyObject) -> c_int {
120 let data = (*(o as *mut PyDateTime_Date)).data;
122 (c_int::from(data[0]) << 8) | c_int::from(data[1])
123}
124
125#[inline]
126#[cfg(not(any(PyPy, GraalPy)))]
127pub unsafe fn PyDateTime_GET_MONTH(o: *mut PyObject) -> c_int {
130 let data = (*(o as *mut PyDateTime_Date)).data;
131 c_int::from(data[2])
132}
133
134#[inline]
135#[cfg(not(any(PyPy, GraalPy)))]
136pub unsafe fn PyDateTime_GET_DAY(o: *mut PyObject) -> c_int {
139 let data = (*(o as *mut PyDateTime_Date)).data;
140 c_int::from(data[3])
141}
142
143#[cfg(not(any(PyPy, GraalPy)))]
145macro_rules! _PyDateTime_GET_HOUR {
146 ($o: expr, $offset:expr) => {
147 c_int::from((*$o).data[$offset + 0])
148 };
149}
150
151#[cfg(not(any(PyPy, GraalPy)))]
152macro_rules! _PyDateTime_GET_MINUTE {
153 ($o: expr, $offset:expr) => {
154 c_int::from((*$o).data[$offset + 1])
155 };
156}
157
158#[cfg(not(any(PyPy, GraalPy)))]
159macro_rules! _PyDateTime_GET_SECOND {
160 ($o: expr, $offset:expr) => {
161 c_int::from((*$o).data[$offset + 2])
162 };
163}
164
165#[cfg(not(any(PyPy, GraalPy)))]
166macro_rules! _PyDateTime_GET_MICROSECOND {
167 ($o: expr, $offset:expr) => {
168 (c_int::from((*$o).data[$offset + 3]) << 16)
169 | (c_int::from((*$o).data[$offset + 4]) << 8)
170 | (c_int::from((*$o).data[$offset + 5]))
171 };
172}
173
174#[cfg(not(any(PyPy, GraalPy)))]
175macro_rules! _PyDateTime_GET_FOLD {
176 ($o: expr) => {
177 (*$o).fold
178 };
179}
180
181#[cfg(not(any(PyPy, GraalPy)))]
182macro_rules! _PyDateTime_GET_TZINFO {
183 ($o: expr) => {
184 if (*$o).hastzinfo != 0 {
185 (*$o).tzinfo
186 } else {
187 $crate::Py_None()
188 }
189 };
190}
191
192#[inline]
194#[cfg(not(any(PyPy, GraalPy)))]
195pub unsafe fn PyDateTime_DATE_GET_HOUR(o: *mut PyObject) -> c_int {
198 _PyDateTime_GET_HOUR!((o as *mut PyDateTime_DateTime), _PyDateTime_DATE_DATASIZE)
199}
200
201#[inline]
202#[cfg(not(any(PyPy, GraalPy)))]
203pub unsafe fn PyDateTime_DATE_GET_MINUTE(o: *mut PyObject) -> c_int {
206 _PyDateTime_GET_MINUTE!((o as *mut PyDateTime_DateTime), _PyDateTime_DATE_DATASIZE)
207}
208
209#[inline]
210#[cfg(not(any(PyPy, GraalPy)))]
211pub unsafe fn PyDateTime_DATE_GET_SECOND(o: *mut PyObject) -> c_int {
214 _PyDateTime_GET_SECOND!((o as *mut PyDateTime_DateTime), _PyDateTime_DATE_DATASIZE)
215}
216
217#[inline]
218#[cfg(not(any(PyPy, GraalPy)))]
219pub unsafe fn PyDateTime_DATE_GET_MICROSECOND(o: *mut PyObject) -> c_int {
222 _PyDateTime_GET_MICROSECOND!((o as *mut PyDateTime_DateTime), _PyDateTime_DATE_DATASIZE)
223}
224
225#[inline]
226#[cfg(not(any(PyPy, GraalPy)))]
227pub unsafe fn PyDateTime_DATE_GET_FOLD(o: *mut PyObject) -> c_uchar {
230 _PyDateTime_GET_FOLD!(o as *mut PyDateTime_DateTime)
231}
232
233#[inline]
234#[cfg(not(any(PyPy, GraalPy)))]
235pub unsafe fn PyDateTime_DATE_GET_TZINFO(o: *mut PyObject) -> *mut PyObject {
239 _PyDateTime_GET_TZINFO!(o as *mut PyDateTime_DateTime)
240}
241
242#[inline]
244#[cfg(not(any(PyPy, GraalPy)))]
245pub unsafe fn PyDateTime_TIME_GET_HOUR(o: *mut PyObject) -> c_int {
248 _PyDateTime_GET_HOUR!((o as *mut PyDateTime_Time), 0)
249}
250
251#[inline]
252#[cfg(not(any(PyPy, GraalPy)))]
253pub unsafe fn PyDateTime_TIME_GET_MINUTE(o: *mut PyObject) -> c_int {
256 _PyDateTime_GET_MINUTE!((o as *mut PyDateTime_Time), 0)
257}
258
259#[inline]
260#[cfg(not(any(PyPy, GraalPy)))]
261pub unsafe fn PyDateTime_TIME_GET_SECOND(o: *mut PyObject) -> c_int {
264 _PyDateTime_GET_SECOND!((o as *mut PyDateTime_Time), 0)
265}
266
267#[inline]
268#[cfg(not(any(PyPy, GraalPy)))]
269pub unsafe fn PyDateTime_TIME_GET_MICROSECOND(o: *mut PyObject) -> c_int {
272 _PyDateTime_GET_MICROSECOND!((o as *mut PyDateTime_Time), 0)
273}
274
275#[cfg(not(any(PyPy, GraalPy)))]
276#[inline]
277pub unsafe fn PyDateTime_TIME_GET_FOLD(o: *mut PyObject) -> c_uchar {
280 _PyDateTime_GET_FOLD!(o as *mut PyDateTime_Time)
281}
282
283#[inline]
284#[cfg(not(any(PyPy, GraalPy)))]
285pub unsafe fn PyDateTime_TIME_GET_TZINFO(o: *mut PyObject) -> *mut PyObject {
289 _PyDateTime_GET_TZINFO!(o as *mut PyDateTime_Time)
290}
291
292#[cfg(not(any(PyPy, GraalPy)))]
294macro_rules! _access_field {
295 ($obj:expr, $type: ident, $field:ident) => {
296 (*($obj as *mut $type)).$field
297 };
298}
299
300#[cfg(not(any(PyPy, GraalPy)))]
302macro_rules! _access_delta_field {
303 ($obj:expr, $field:ident) => {
304 _access_field!($obj, PyDateTime_Delta, $field)
305 };
306}
307
308#[inline]
309#[cfg(not(any(PyPy, GraalPy)))]
310pub unsafe fn PyDateTime_DELTA_GET_DAYS(o: *mut PyObject) -> c_int {
317 _access_delta_field!(o, days)
318}
319
320#[inline]
321#[cfg(not(any(PyPy, GraalPy)))]
322pub unsafe fn PyDateTime_DELTA_GET_SECONDS(o: *mut PyObject) -> c_int {
329 _access_delta_field!(o, seconds)
330}
331
332#[inline]
333#[cfg(not(any(PyPy, GraalPy)))]
334pub unsafe fn PyDateTime_DELTA_GET_MICROSECONDS(o: *mut PyObject) -> c_int {
341 _access_delta_field!(o, microseconds)
342}
343
344#[inline]
347#[cfg(GraalPy)]
348pub unsafe fn _get_attr(obj: *mut PyObject, field: &std::ffi::CStr) -> c_int {
349 let result = PyObject_GetAttrString(obj, field.as_ptr());
350 Py_DecRef(result); if PyLong_Check(result) == 1 {
352 PyLong_AsLong(result) as c_int
353 } else {
354 0
355 }
356}
357
358#[inline]
359#[cfg(GraalPy)]
360pub unsafe fn PyDateTime_GET_YEAR(o: *mut PyObject) -> c_int {
361 _get_attr(o, c_str!("year"))
362}
363
364#[inline]
365#[cfg(GraalPy)]
366pub unsafe fn PyDateTime_GET_MONTH(o: *mut PyObject) -> c_int {
367 _get_attr(o, c_str!("month"))
368}
369
370#[inline]
371#[cfg(GraalPy)]
372pub unsafe fn PyDateTime_GET_DAY(o: *mut PyObject) -> c_int {
373 _get_attr(o, c_str!("day"))
374}
375
376#[inline]
377#[cfg(GraalPy)]
378pub unsafe fn PyDateTime_DATE_GET_HOUR(o: *mut PyObject) -> c_int {
379 _get_attr(o, c_str!("hour"))
380}
381
382#[inline]
383#[cfg(GraalPy)]
384pub unsafe fn PyDateTime_DATE_GET_MINUTE(o: *mut PyObject) -> c_int {
385 _get_attr(o, c_str!("minute"))
386}
387
388#[inline]
389#[cfg(GraalPy)]
390pub unsafe fn PyDateTime_DATE_GET_SECOND(o: *mut PyObject) -> c_int {
391 _get_attr(o, c_str!("second"))
392}
393
394#[inline]
395#[cfg(GraalPy)]
396pub unsafe fn PyDateTime_DATE_GET_MICROSECOND(o: *mut PyObject) -> c_int {
397 _get_attr(o, c_str!("microsecond"))
398}
399
400#[inline]
401#[cfg(GraalPy)]
402pub unsafe fn PyDateTime_DATE_GET_FOLD(o: *mut PyObject) -> c_int {
403 _get_attr(o, c_str!("fold"))
404}
405
406#[inline]
407#[cfg(GraalPy)]
408pub unsafe fn PyDateTime_DATE_GET_TZINFO(o: *mut PyObject) -> *mut PyObject {
409 let res = PyObject_GetAttrString(o, c_str!("tzinfo").as_ptr().cast());
410 Py_DecRef(res); res
412}
413
414#[inline]
415#[cfg(GraalPy)]
416pub unsafe fn PyDateTime_TIME_GET_HOUR(o: *mut PyObject) -> c_int {
417 _get_attr(o, c_str!("hour"))
418}
419
420#[inline]
421#[cfg(GraalPy)]
422pub unsafe fn PyDateTime_TIME_GET_MINUTE(o: *mut PyObject) -> c_int {
423 _get_attr(o, c_str!("minute"))
424}
425
426#[inline]
427#[cfg(GraalPy)]
428pub unsafe fn PyDateTime_TIME_GET_SECOND(o: *mut PyObject) -> c_int {
429 _get_attr(o, c_str!("second"))
430}
431
432#[inline]
433#[cfg(GraalPy)]
434pub unsafe fn PyDateTime_TIME_GET_MICROSECOND(o: *mut PyObject) -> c_int {
435 _get_attr(o, c_str!("microsecond"))
436}
437
438#[inline]
439#[cfg(GraalPy)]
440pub unsafe fn PyDateTime_TIME_GET_FOLD(o: *mut PyObject) -> c_int {
441 _get_attr(o, c_str!("fold"))
442}
443
444#[inline]
445#[cfg(GraalPy)]
446pub unsafe fn PyDateTime_TIME_GET_TZINFO(o: *mut PyObject) -> *mut PyObject {
447 let res = PyObject_GetAttrString(o, c_str!("tzinfo").as_ptr().cast());
448 Py_DecRef(res); res
450}
451
452#[inline]
453#[cfg(GraalPy)]
454pub unsafe fn PyDateTime_DELTA_GET_DAYS(o: *mut PyObject) -> c_int {
455 _get_attr(o, c_str!("days"))
456}
457
458#[inline]
459#[cfg(GraalPy)]
460pub unsafe fn PyDateTime_DELTA_GET_SECONDS(o: *mut PyObject) -> c_int {
461 _get_attr(o, c_str!("seconds"))
462}
463
464#[inline]
465#[cfg(GraalPy)]
466pub unsafe fn PyDateTime_DELTA_GET_MICROSECONDS(o: *mut PyObject) -> c_int {
467 _get_attr(o, c_str!("microseconds"))
468}
469
470#[cfg(PyPy)]
471extern "C" {
472 #[link_name = "PyPyDateTime_GET_YEAR"]
474 pub fn PyDateTime_GET_YEAR(o: *mut PyObject) -> c_int;
475 #[link_name = "PyPyDateTime_GET_MONTH"]
476 pub fn PyDateTime_GET_MONTH(o: *mut PyObject) -> c_int;
477 #[link_name = "PyPyDateTime_GET_DAY"]
478 pub fn PyDateTime_GET_DAY(o: *mut PyObject) -> c_int;
479
480 #[link_name = "PyPyDateTime_DATE_GET_HOUR"]
481 pub fn PyDateTime_DATE_GET_HOUR(o: *mut PyObject) -> c_int;
482 #[link_name = "PyPyDateTime_DATE_GET_MINUTE"]
483 pub fn PyDateTime_DATE_GET_MINUTE(o: *mut PyObject) -> c_int;
484 #[link_name = "PyPyDateTime_DATE_GET_SECOND"]
485 pub fn PyDateTime_DATE_GET_SECOND(o: *mut PyObject) -> c_int;
486 #[link_name = "PyPyDateTime_DATE_GET_MICROSECOND"]
487 pub fn PyDateTime_DATE_GET_MICROSECOND(o: *mut PyObject) -> c_int;
488 #[link_name = "PyPyDateTime_GET_FOLD"]
489 pub fn PyDateTime_DATE_GET_FOLD(o: *mut PyObject) -> c_int;
490 #[link_name = "PyPyDateTime_DATE_GET_TZINFO"]
491 #[cfg(Py_3_10)]
492 pub fn PyDateTime_DATE_GET_TZINFO(o: *mut PyObject) -> *mut PyObject;
493
494 #[link_name = "PyPyDateTime_TIME_GET_HOUR"]
495 pub fn PyDateTime_TIME_GET_HOUR(o: *mut PyObject) -> c_int;
496 #[link_name = "PyPyDateTime_TIME_GET_MINUTE"]
497 pub fn PyDateTime_TIME_GET_MINUTE(o: *mut PyObject) -> c_int;
498 #[link_name = "PyPyDateTime_TIME_GET_SECOND"]
499 pub fn PyDateTime_TIME_GET_SECOND(o: *mut PyObject) -> c_int;
500 #[link_name = "PyPyDateTime_TIME_GET_MICROSECOND"]
501 pub fn PyDateTime_TIME_GET_MICROSECOND(o: *mut PyObject) -> c_int;
502 #[link_name = "PyPyDateTime_TIME_GET_FOLD"]
503 pub fn PyDateTime_TIME_GET_FOLD(o: *mut PyObject) -> c_int;
504 #[link_name = "PyPyDateTime_TIME_GET_TZINFO"]
505 #[cfg(Py_3_10)]
506 pub fn PyDateTime_TIME_GET_TZINFO(o: *mut PyObject) -> *mut PyObject;
507
508 #[link_name = "PyPyDateTime_DELTA_GET_DAYS"]
509 pub fn PyDateTime_DELTA_GET_DAYS(o: *mut PyObject) -> c_int;
510 #[link_name = "PyPyDateTime_DELTA_GET_SECONDS"]
511 pub fn PyDateTime_DELTA_GET_SECONDS(o: *mut PyObject) -> c_int;
512 #[link_name = "PyPyDateTime_DELTA_GET_MICROSECONDS"]
513 pub fn PyDateTime_DELTA_GET_MICROSECONDS(o: *mut PyObject) -> c_int;
514}
515
516#[repr(C)]
517#[derive(Debug, Copy, Clone)]
518pub struct PyDateTime_CAPI {
519 pub DateType: *mut PyTypeObject,
520 pub DateTimeType: *mut PyTypeObject,
521 pub TimeType: *mut PyTypeObject,
522 pub DeltaType: *mut PyTypeObject,
523 pub TZInfoType: *mut PyTypeObject,
524 pub TimeZone_UTC: *mut PyObject,
525 pub Date_FromDate: unsafe extern "C" fn(
526 year: c_int,
527 month: c_int,
528 day: c_int,
529 cls: *mut PyTypeObject,
530 ) -> *mut PyObject,
531 pub DateTime_FromDateAndTime: unsafe extern "C" fn(
532 year: c_int,
533 month: c_int,
534 day: c_int,
535 hour: c_int,
536 minute: c_int,
537 second: c_int,
538 microsecond: c_int,
539 tzinfo: *mut PyObject,
540 cls: *mut PyTypeObject,
541 ) -> *mut PyObject,
542 pub Time_FromTime: unsafe extern "C" fn(
543 hour: c_int,
544 minute: c_int,
545 second: c_int,
546 microsecond: c_int,
547 tzinfo: *mut PyObject,
548 cls: *mut PyTypeObject,
549 ) -> *mut PyObject,
550 pub Delta_FromDelta: unsafe extern "C" fn(
551 days: c_int,
552 seconds: c_int,
553 microseconds: c_int,
554 normalize: c_int,
555 cls: *mut PyTypeObject,
556 ) -> *mut PyObject,
557 pub TimeZone_FromTimeZone:
558 unsafe extern "C" fn(offset: *mut PyObject, name: *mut PyObject) -> *mut PyObject,
559
560 pub DateTime_FromTimestamp: unsafe extern "C" fn(
561 cls: *mut PyTypeObject,
562 args: *mut PyObject,
563 kwargs: *mut PyObject,
564 ) -> *mut PyObject,
565 pub Date_FromTimestamp:
566 unsafe extern "C" fn(cls: *mut PyTypeObject, args: *mut PyObject) -> *mut PyObject,
567 pub DateTime_FromDateAndTimeAndFold: unsafe extern "C" fn(
568 year: c_int,
569 month: c_int,
570 day: c_int,
571 hour: c_int,
572 minute: c_int,
573 second: c_int,
574 microsecond: c_int,
575 tzinfo: *mut PyObject,
576 fold: c_int,
577 cls: *mut PyTypeObject,
578 ) -> *mut PyObject,
579 pub Time_FromTimeAndFold: unsafe extern "C" fn(
580 hour: c_int,
581 minute: c_int,
582 second: c_int,
583 microsecond: c_int,
584 tzinfo: *mut PyObject,
585 fold: c_int,
586 cls: *mut PyTypeObject,
587 ) -> *mut PyObject,
588}
589
590unsafe impl Sync for PyDateTime_CAPI {}
592
593pub const PyDateTime_CAPSULE_NAME: &CStr = c_str!("datetime.datetime_CAPI");
594
595#[inline]
601pub unsafe fn PyDateTimeAPI() -> *mut PyDateTime_CAPI {
602 *PyDateTimeAPI_impl.ptr.get()
603}
604
605pub unsafe fn PyDateTime_IMPORT() {
607 if !PyDateTimeAPI_impl.once.is_completed() {
608 #[cfg(PyPy)]
611 let py_datetime_c_api = PyDateTime_Import();
612
613 #[cfg(not(PyPy))]
614 let py_datetime_c_api =
615 PyCapsule_Import(PyDateTime_CAPSULE_NAME.as_ptr(), 1) as *mut PyDateTime_CAPI;
616
617 if py_datetime_c_api.is_null() {
618 return;
619 }
620
621 PyDateTimeAPI_impl.once.call_once(|| {
625 *PyDateTimeAPI_impl.ptr.get() = py_datetime_c_api;
626 });
627 }
628}
629
630#[inline]
631pub unsafe fn PyDateTime_TimeZone_UTC() -> *mut PyObject {
632 (*PyDateTimeAPI()).TimeZone_UTC
633}
634
635#[inline]
641pub unsafe fn PyDate_Check(op: *mut PyObject) -> c_int {
643 PyObject_TypeCheck(op, (*PyDateTimeAPI()).DateType) as c_int
644}
645
646#[inline]
647pub unsafe fn PyDate_CheckExact(op: *mut PyObject) -> c_int {
649 (Py_TYPE(op) == (*PyDateTimeAPI()).DateType) as c_int
650}
651
652#[inline]
653pub unsafe fn PyDateTime_Check(op: *mut PyObject) -> c_int {
655 PyObject_TypeCheck(op, (*PyDateTimeAPI()).DateTimeType) as c_int
656}
657
658#[inline]
659pub unsafe fn PyDateTime_CheckExact(op: *mut PyObject) -> c_int {
661 (Py_TYPE(op) == (*PyDateTimeAPI()).DateTimeType) as c_int
662}
663
664#[inline]
665pub unsafe fn PyTime_Check(op: *mut PyObject) -> c_int {
667 PyObject_TypeCheck(op, (*PyDateTimeAPI()).TimeType) as c_int
668}
669
670#[inline]
671pub unsafe fn PyTime_CheckExact(op: *mut PyObject) -> c_int {
673 (Py_TYPE(op) == (*PyDateTimeAPI()).TimeType) as c_int
674}
675
676#[inline]
677pub unsafe fn PyDelta_Check(op: *mut PyObject) -> c_int {
679 PyObject_TypeCheck(op, (*PyDateTimeAPI()).DeltaType) as c_int
680}
681
682#[inline]
683pub unsafe fn PyDelta_CheckExact(op: *mut PyObject) -> c_int {
685 (Py_TYPE(op) == (*PyDateTimeAPI()).DeltaType) as c_int
686}
687
688#[inline]
689pub unsafe fn PyTZInfo_Check(op: *mut PyObject) -> c_int {
691 PyObject_TypeCheck(op, (*PyDateTimeAPI()).TZInfoType) as c_int
692}
693
694#[inline]
695pub unsafe fn PyTZInfo_CheckExact(op: *mut PyObject) -> c_int {
697 (Py_TYPE(op) == (*PyDateTimeAPI()).TZInfoType) as c_int
698}
699
700pub unsafe fn PyTimeZone_FromOffset(offset: *mut PyObject) -> *mut PyObject {
708 ((*PyDateTimeAPI()).TimeZone_FromTimeZone)(offset, std::ptr::null_mut())
709}
710
711pub unsafe fn PyTimeZone_FromOffsetAndName(
712 offset: *mut PyObject,
713 name: *mut PyObject,
714) -> *mut PyObject {
715 ((*PyDateTimeAPI()).TimeZone_FromTimeZone)(offset, name)
716}
717
718#[cfg(not(PyPy))]
719pub unsafe fn PyDateTime_FromTimestamp(args: *mut PyObject) -> *mut PyObject {
720 let f = (*PyDateTimeAPI()).DateTime_FromTimestamp;
721 f((*PyDateTimeAPI()).DateTimeType, args, std::ptr::null_mut())
722}
723
724#[cfg(not(PyPy))]
725pub unsafe fn PyDate_FromTimestamp(args: *mut PyObject) -> *mut PyObject {
726 let f = (*PyDateTimeAPI()).Date_FromTimestamp;
727 f((*PyDateTimeAPI()).DateType, args)
728}
729
730#[cfg(PyPy)]
731extern "C" {
732 #[link_name = "PyPyDate_FromTimestamp"]
733 pub fn PyDate_FromTimestamp(args: *mut PyObject) -> *mut PyObject;
734 #[link_name = "PyPyDateTime_FromTimestamp"]
735 pub fn PyDateTime_FromTimestamp(args: *mut PyObject) -> *mut PyObject;
736}
737
738#[cfg(PyPy)]
739extern "C" {
740 #[link_name = "_PyPyDateTime_Import"]
741 pub fn PyDateTime_Import() -> *mut PyDateTime_CAPI;
742}
743
744struct PyDateTimeAPISingleton {
747 once: Once,
748 ptr: UnsafeCell<*mut PyDateTime_CAPI>,
749}
750unsafe impl Sync for PyDateTimeAPISingleton {}
751
752static PyDateTimeAPI_impl: PyDateTimeAPISingleton = PyDateTimeAPISingleton {
753 once: Once::new(),
754 ptr: UnsafeCell::new(ptr::null_mut()),
755};