diff --git a/newsfragments/3835.added.md b/newsfragments/3835.added.md index 55871f4cdf7..2970a4c8db4 100644 --- a/newsfragments/3835.added.md +++ b/newsfragments/3835.added.md @@ -1 +1 @@ -Add `PyWeakRef`, `PyWeakProxy` and `PyWeakCallableProxy`. +Add `PyWeakref`, `PyWeakrefReference` and `PyWeakrefProxy`. diff --git a/src/prelude.rs b/src/prelude.rs index 6fcd911e973..f9c2e69f8a5 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -46,5 +46,4 @@ pub use crate::types::string::PyStringMethods; pub use crate::types::traceback::PyTracebackMethods; pub use crate::types::tuple::PyTupleMethods; pub use crate::types::typeobject::PyTypeMethods; -#[cfg(not(PyPy))] pub use crate::types::weakref::PyWeakrefMethods; diff --git a/src/types/mod.rs b/src/types/mod.rs index aed1f12f08c..d8f79c134dc 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -47,7 +47,6 @@ pub use self::string::{PyString, PyString as PyUnicode, PyStringMethods}; pub use self::traceback::{PyTraceback, PyTracebackMethods}; pub use self::tuple::{PyTuple, PyTupleMethods}; pub use self::typeobject::{PyType, PyTypeMethods}; -#[cfg(not(PyPy))] pub use self::weakref::{PyWeakref, PyWeakrefMethods, PyWeakrefProxy, PyWeakrefReference}; /// Iteration over Python collections. @@ -352,5 +351,4 @@ pub(crate) mod string; pub(crate) mod traceback; pub(crate) mod tuple; pub(crate) mod typeobject; -#[cfg(not(any(PyPy, GraalPy)))] // FIXME: Remove this soon pub(crate) mod weakref; diff --git a/src/types/weakref/reference.rs b/src/types/weakref/reference.rs index 0fbd7e7c75c..904e129b25b 100644 --- a/src/types/weakref/reference.rs +++ b/src/types/weakref/reference.rs @@ -13,6 +13,7 @@ use super::PyWeakrefMethods; #[repr(transparent)] pub struct PyWeakrefReference(PyAny); +#[cfg(not(any(PyPy, GraalPy, Py_LIMITED_API)))] pyobject_native_type!( PyWeakrefReference, ffi::PyWeakReference, @@ -21,6 +22,21 @@ pyobject_native_type!( #checkfunction=ffi::PyWeakref_CheckRefExact ); +// When targetting alternative or multiple interpreters, it is better to not use the internal API. +#[cfg(any(PyPy, GraalPy, Py_LIMITED_API))] +pyobject_native_type_named!(PyWeakrefReference); +#[cfg(any(PyPy, GraalPy, Py_LIMITED_API))] +pyobject_native_type_extract!(PyWeakrefReference); + +#[cfg(any(PyPy, GraalPy, Py_LIMITED_API))] +impl PyTypeCheck for PyWeakrefReference { + const NAME: &'static str = "weakref.ReferenceType"; + + fn type_check(object: &Bound<'_, PyAny>) -> bool { + unsafe { ffi::PyWeakref_CheckRef(object.as_ptr()) > 0 } + } +} + impl PyWeakrefReference { /// Deprecated form of [`PyWeakrefReference::new_bound`]. #[inline]