From b0568507cecea07b02cc34cbd96380044190bade Mon Sep 17 00:00:00 2001 From: David Hewitt Date: Sat, 19 Oct 2024 22:01:02 +0100 Subject: [PATCH] ffi: add FFI definition `PyDateTime_CAPSULE_NAME` --- newsfragments/4634.added.md | 1 + pyo3-ffi/src/datetime.rs | 22 +++++++++------------- 2 files changed, 10 insertions(+), 13 deletions(-) create mode 100644 newsfragments/4634.added.md diff --git a/newsfragments/4634.added.md b/newsfragments/4634.added.md new file mode 100644 index 00000000000..886e56911bd --- /dev/null +++ b/newsfragments/4634.added.md @@ -0,0 +1 @@ +Add FFI definition `PyDateTime_CAPSULE_NAME`. diff --git a/pyo3-ffi/src/datetime.rs b/pyo3-ffi/src/datetime.rs index 7283b6d4e52..a24a60a3300 100644 --- a/pyo3-ffi/src/datetime.rs +++ b/pyo3-ffi/src/datetime.rs @@ -7,11 +7,11 @@ #[cfg(GraalPy)] use crate::{PyLong_AsLong, PyLong_Check, PyObject_GetAttrString, Py_DecRef}; use crate::{PyObject, PyObject_TypeCheck, PyTypeObject, Py_TYPE}; -use std::cell::UnsafeCell; #[cfg(not(GraalPy))] use std::os::raw::c_char; use std::os::raw::c_int; use std::ptr; +use std::{cell::UnsafeCell, ffi::CStr}; #[cfg(not(PyPy))] use {crate::PyCapsule_Import, std::ffi::CString}; #[cfg(not(any(PyPy, GraalPy)))] @@ -593,6 +593,8 @@ pub struct PyDateTime_CAPI { // Python already shares this object between threads, so it's no more evil for us to do it too! unsafe impl Sync for PyDateTime_CAPI {} +pub const PyDateTime_CAPSULE_NAME: &CStr = c_str!("datetime.datetime_CAPI"); + /// Returns a pointer to a `PyDateTime_CAPI` instance /// /// # Note @@ -603,11 +605,6 @@ pub unsafe fn PyDateTimeAPI() -> *mut PyDateTime_CAPI { *PyDateTimeAPI_impl.0.get() } -#[inline] -pub unsafe fn PyDateTime_TimeZone_UTC() -> *mut PyObject { - (*PyDateTimeAPI()).TimeZone_UTC -} - /// Populates the `PyDateTimeAPI` object pub unsafe fn PyDateTime_IMPORT() { // PyPy expects the C-API to be initialized via PyDateTime_Import, so trying to use @@ -616,17 +613,16 @@ pub unsafe fn PyDateTime_IMPORT() { let py_datetime_c_api = PyDateTime_Import(); #[cfg(not(PyPy))] - let py_datetime_c_api = { - // PyDateTime_CAPSULE_NAME is a macro in C - let PyDateTime_CAPSULE_NAME = CString::new("datetime.datetime_CAPI").unwrap(); - - PyCapsule_Import(PyDateTime_CAPSULE_NAME.as_ptr(), 1) as *mut PyDateTime_CAPI - }; + let py_datetime_c_api = + PyCapsule_Import(PyDateTime_CAPSULE_NAME.as_ptr(), 1) as *mut PyDateTime_CAPI; *PyDateTimeAPI_impl.0.get() = py_datetime_c_api; } -// skipped non-limited PyDateTime_TimeZone_UTC +#[inline] +pub unsafe fn PyDateTime_TimeZone_UTC() -> *mut PyObject { + (*PyDateTimeAPI()).TimeZone_UTC +} /// Type Check macros ///