From 74e87d18cef54adb5d584b713619161577859b02 Mon Sep 17 00:00:00 2001 From: Charlie Lin Date: Sat, 25 Apr 2026 10:03:49 -0500 Subject: [PATCH 01/11] Add Py_SET_SIZE and Py_RETURN_NOTIMPLEMENTED functions --- pyo3-ffi/src/object.rs | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/pyo3-ffi/src/object.rs b/pyo3-ffi/src/object.rs index 8e712c23dc1..ae807a8a6ee 100644 --- a/pyo3-ffi/src/object.rs +++ b/pyo3-ffi/src/object.rs @@ -3,6 +3,8 @@ use crate::pyport::{Py_hash_t, Py_ssize_t}; use crate::refcount; #[cfg(Py_GIL_DISABLED)] use crate::PyMutex; +#[cfg(all(not(GraalPy), not(all(Py_3_13, Py_LIMITED_API))))] +use crate::Py_NewRef; use std::ffi::{c_char, c_int, c_uint, c_ulong, c_void}; use std::mem; #[cfg(Py_GIL_DISABLED)] @@ -233,6 +235,8 @@ pub unsafe fn Py_SIZE(ob: *mut PyObject) -> Py_ssize_t { #[cfg(all(Py_LIMITED_API, Py_3_15))] extern_libpython! { pub fn Py_IS_TYPE(ob: *mut PyObject, tp: *mut PyTypeObject) -> c_int; + pub fn Py_SET_SIZE(ob: *mut PyVarObject, size: Py_ssize_t); + pub fn Py_SET_TYPE(ob: *mut PyObject, type: *mut PyTypeObject); } #[inline] @@ -241,9 +245,11 @@ pub unsafe fn Py_IS_TYPE(ob: *mut PyObject, tp: *mut PyTypeObject) -> c_int { (Py_TYPE(ob) == tp) as c_int } -// skipped Py_SET_TYPE - -// skipped Py_SET_SIZE +#[inline] +#[cfg(not(all(Py_LIMITED_API, Py_3_15)))] +pub unsafe fn Py_SET_SIZE(ob: *mut PyVarObject, size: Py_ssize_t { + (*ob).ob_size = size +} pub type unaryfunc = unsafe extern "C" fn(*mut PyObject) -> *mut PyObject; pub type binaryfunc = unsafe extern "C" fn(*mut PyObject, *mut PyObject) -> *mut PyObject; @@ -643,7 +649,14 @@ pub unsafe fn Py_IsNone(x: *mut PyObject) -> c_int { Py_Is(x, Py_None()) } -// skipped Py_RETURN_NONE +#[inline] +pub unsafe fn Py_RETURN_NONE() -> *mut PyObject { + #[cfg(all(not(GraalPy), not(all(Py_3_13, Py_LIMITED_API))))] + Py_NewRef(Py_None()) + + #[cfg(all(not(GraalPy), all(Py_3_13, Py_LIMITED_API)))] + Py_None() +} extern_libpython! { #[cfg(all(not(GraalPy), not(all(Py_3_13, Py_LIMITED_API))))] @@ -666,7 +679,14 @@ pub unsafe fn Py_NotImplemented() -> *mut PyObject { return _Py_NotImplementedStructReference; } -// skipped Py_RETURN_NOTIMPLEMENTED +#[inline] +pub unsafe fn Py_RETURN_NOTIMPLEMENTED() -> *mut PyObject { + #[cfg(all(not(GraalPy), not(all(Py_3_13, Py_LIMITED_API))))] + Py_NewRef(Py_NotImplemented()) + + #[cfg(all(not(GraalPy), all(Py_3_13, Py_LIMITED_API)))] + Py_NotImplemented() +} /* Rich comparison opcodes */ pub const Py_LT: c_int = 0; From 6133810b315c1e1c5ae365d3019db89a0f2b01f1 Mon Sep 17 00:00:00 2001 From: Charlie Lin Date: Sat, 25 Apr 2026 10:04:32 -0500 Subject: [PATCH 02/11] news --- newsfragments/6003.added.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 newsfragments/6003.added.md diff --git a/newsfragments/6003.added.md b/newsfragments/6003.added.md new file mode 100644 index 00000000000..27b83267ddf --- /dev/null +++ b/newsfragments/6003.added.md @@ -0,0 +1 @@ +Add `Py_SET_SIZE` and `Py_RETURN_NOTIMPLEMENTED` functions From da7723f9e8e94bc724bd8359114cc247c1d4f913 Mon Sep 17 00:00:00 2001 From: Charlie Lin Date: Sat, 25 Apr 2026 10:06:19 -0500 Subject: [PATCH 03/11] Update object.rs --- pyo3-ffi/src/object.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyo3-ffi/src/object.rs b/pyo3-ffi/src/object.rs index ae807a8a6ee..4b5d8e128a0 100644 --- a/pyo3-ffi/src/object.rs +++ b/pyo3-ffi/src/object.rs @@ -247,7 +247,7 @@ pub unsafe fn Py_IS_TYPE(ob: *mut PyObject, tp: *mut PyTypeObject) -> c_int { #[inline] #[cfg(not(all(Py_LIMITED_API, Py_3_15)))] -pub unsafe fn Py_SET_SIZE(ob: *mut PyVarObject, size: Py_ssize_t { +pub unsafe fn Py_SET_SIZE(ob: *mut PyVarObject, size: Py_ssize_t) { (*ob).ob_size = size } From 8c8a8bde6563d56f7b93b7da0f67b9f24cdca57e Mon Sep 17 00:00:00 2001 From: Charlie Lin Date: Sat, 25 Apr 2026 10:09:06 -0500 Subject: [PATCH 04/11] Fix return statements in Py_RETURN_NONE and Py_RETURN_NOTIMPLEMENTED --- pyo3-ffi/src/object.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyo3-ffi/src/object.rs b/pyo3-ffi/src/object.rs index 4b5d8e128a0..f82cb2d6fae 100644 --- a/pyo3-ffi/src/object.rs +++ b/pyo3-ffi/src/object.rs @@ -652,10 +652,10 @@ pub unsafe fn Py_IsNone(x: *mut PyObject) -> c_int { #[inline] pub unsafe fn Py_RETURN_NONE() -> *mut PyObject { #[cfg(all(not(GraalPy), not(all(Py_3_13, Py_LIMITED_API))))] - Py_NewRef(Py_None()) + return Py_NewRef(Py_None()); #[cfg(all(not(GraalPy), all(Py_3_13, Py_LIMITED_API)))] - Py_None() + return Py_None(); } extern_libpython! { @@ -682,10 +682,10 @@ pub unsafe fn Py_NotImplemented() -> *mut PyObject { #[inline] pub unsafe fn Py_RETURN_NOTIMPLEMENTED() -> *mut PyObject { #[cfg(all(not(GraalPy), not(all(Py_3_13, Py_LIMITED_API))))] - Py_NewRef(Py_NotImplemented()) + return Py_NewRef(Py_NotImplemented()); #[cfg(all(not(GraalPy), all(Py_3_13, Py_LIMITED_API)))] - Py_NotImplemented() + return Py_NotImplemented(); } /* Rich comparison opcodes */ From eedc8185f3a9dfafa9d27e6609abcd4a76da6b7c Mon Sep 17 00:00:00 2001 From: Charlie Lin Date: Sat, 25 Apr 2026 10:10:48 -0500 Subject: [PATCH 05/11] Update object.rs --- pyo3-ffi/src/object.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyo3-ffi/src/object.rs b/pyo3-ffi/src/object.rs index f82cb2d6fae..13fb589fc3a 100644 --- a/pyo3-ffi/src/object.rs +++ b/pyo3-ffi/src/object.rs @@ -236,7 +236,7 @@ pub unsafe fn Py_SIZE(ob: *mut PyObject) -> Py_ssize_t { extern_libpython! { pub fn Py_IS_TYPE(ob: *mut PyObject, tp: *mut PyTypeObject) -> c_int; pub fn Py_SET_SIZE(ob: *mut PyVarObject, size: Py_ssize_t); - pub fn Py_SET_TYPE(ob: *mut PyObject, type: *mut PyTypeObject); + pub fn Py_SET_TYPE(ob: *mut PyObject, tp: *mut PyTypeObject); } #[inline] From 379db597968a1c7f2b222de16a214f5667b5ceae Mon Sep 17 00:00:00 2001 From: Charlie Lin Date: Sat, 25 Apr 2026 10:49:38 -0500 Subject: [PATCH 06/11] Import pyo3_ffi in object.rs --- pyo3-ffi/src/object.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyo3-ffi/src/object.rs b/pyo3-ffi/src/object.rs index 13fb589fc3a..f910d1a1ec0 100644 --- a/pyo3-ffi/src/object.rs +++ b/pyo3-ffi/src/object.rs @@ -4,7 +4,7 @@ use crate::refcount; #[cfg(Py_GIL_DISABLED)] use crate::PyMutex; #[cfg(all(not(GraalPy), not(all(Py_3_13, Py_LIMITED_API))))] -use crate::Py_NewRef; +use pyo3_ffi::*; use std::ffi::{c_char, c_int, c_uint, c_ulong, c_void}; use std::mem; #[cfg(Py_GIL_DISABLED)] From 6ad80340e9ebb1ee1318e8e385cb7c5ecc102c1a Mon Sep 17 00:00:00 2001 From: Charlie Lin Date: Sat, 25 Apr 2026 11:04:42 -0500 Subject: [PATCH 07/11] Refactor conditional compilation for Py_RETURN_* functions --- pyo3-ffi/src/object.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pyo3-ffi/src/object.rs b/pyo3-ffi/src/object.rs index f910d1a1ec0..ad1f825d6e9 100644 --- a/pyo3-ffi/src/object.rs +++ b/pyo3-ffi/src/object.rs @@ -3,8 +3,8 @@ use crate::pyport::{Py_hash_t, Py_ssize_t}; use crate::refcount; #[cfg(Py_GIL_DISABLED)] use crate::PyMutex; -#[cfg(all(not(GraalPy), not(all(Py_3_13, Py_LIMITED_API))))] -use pyo3_ffi::*; +#[cfg(all(not(Py_3_13), PY_LIMITED_API))] +use crate::Py_NewRef; use std::ffi::{c_char, c_int, c_uint, c_ulong, c_void}; use std::mem; #[cfg(Py_GIL_DISABLED)] @@ -651,10 +651,10 @@ pub unsafe fn Py_IsNone(x: *mut PyObject) -> c_int { #[inline] pub unsafe fn Py_RETURN_NONE() -> *mut PyObject { - #[cfg(all(not(GraalPy), not(all(Py_3_13, Py_LIMITED_API))))] + #[cfg(all(not(Py_3_13), PY_LIMITED_API))] return Py_NewRef(Py_None()); - #[cfg(all(not(GraalPy), all(Py_3_13, Py_LIMITED_API)))] + #[cfg(Py_3_13)] return Py_None(); } @@ -681,10 +681,10 @@ pub unsafe fn Py_NotImplemented() -> *mut PyObject { #[inline] pub unsafe fn Py_RETURN_NOTIMPLEMENTED() -> *mut PyObject { - #[cfg(all(not(GraalPy), not(all(Py_3_13, Py_LIMITED_API))))] + #[cfg(all(not(Py_3_13), PY_LIMITED_API))] return Py_NewRef(Py_NotImplemented()); - #[cfg(all(not(GraalPy), all(Py_3_13, Py_LIMITED_API)))] + #[cfg(Py_3_13)] return Py_NotImplemented(); } From 091ddfd29fbb4d4576837d6d3bf0f82c943eed81 Mon Sep 17 00:00:00 2001 From: Charlie Lin Date: Sat, 25 Apr 2026 11:09:35 -0500 Subject: [PATCH 08/11] Update object.rs --- pyo3-ffi/src/object.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pyo3-ffi/src/object.rs b/pyo3-ffi/src/object.rs index ad1f825d6e9..5758a807ff4 100644 --- a/pyo3-ffi/src/object.rs +++ b/pyo3-ffi/src/object.rs @@ -3,7 +3,7 @@ use crate::pyport::{Py_hash_t, Py_ssize_t}; use crate::refcount; #[cfg(Py_GIL_DISABLED)] use crate::PyMutex; -#[cfg(all(not(Py_3_13), PY_LIMITED_API))] +#[cfg(all(not(Py_3_13), Py_LIMITED_API))] use crate::Py_NewRef; use std::ffi::{c_char, c_int, c_uint, c_ulong, c_void}; use std::mem; @@ -651,7 +651,7 @@ pub unsafe fn Py_IsNone(x: *mut PyObject) -> c_int { #[inline] pub unsafe fn Py_RETURN_NONE() -> *mut PyObject { - #[cfg(all(not(Py_3_13), PY_LIMITED_API))] + #[cfg(all(not(Py_3_13), Py_LIMITED_API))] return Py_NewRef(Py_None()); #[cfg(Py_3_13)] @@ -681,7 +681,7 @@ pub unsafe fn Py_NotImplemented() -> *mut PyObject { #[inline] pub unsafe fn Py_RETURN_NOTIMPLEMENTED() -> *mut PyObject { - #[cfg(all(not(Py_3_13), PY_LIMITED_API))] + #[cfg(all(not(Py_3_13), Py_LIMITED_API))] return Py_NewRef(Py_NotImplemented()); #[cfg(Py_3_13)] From f5a89ff9fba7a2e064b6aa53507dda4740f92065 Mon Sep 17 00:00:00 2001 From: Charlie Lin Date: Sat, 25 Apr 2026 11:18:06 -0500 Subject: [PATCH 09/11] Update conditional compilation for Py_RETURN macros --- pyo3-ffi/src/object.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pyo3-ffi/src/object.rs b/pyo3-ffi/src/object.rs index 5758a807ff4..2dbce9ca86e 100644 --- a/pyo3-ffi/src/object.rs +++ b/pyo3-ffi/src/object.rs @@ -3,7 +3,7 @@ use crate::pyport::{Py_hash_t, Py_ssize_t}; use crate::refcount; #[cfg(Py_GIL_DISABLED)] use crate::PyMutex; -#[cfg(all(not(Py_3_13), Py_LIMITED_API))] +#[cfg(all(not(Py_3_13), Py_3_10, Py_LIMITED_API, not(PyPy)))] use crate::Py_NewRef; use std::ffi::{c_char, c_int, c_uint, c_ulong, c_void}; use std::mem; @@ -651,10 +651,10 @@ pub unsafe fn Py_IsNone(x: *mut PyObject) -> c_int { #[inline] pub unsafe fn Py_RETURN_NONE() -> *mut PyObject { - #[cfg(all(not(Py_3_13), Py_LIMITED_API))] + #[cfg(all(not(Py_3_13), Py_3_10, Py_LIMITED_API, not(PyPy)))] return Py_NewRef(Py_None()); - #[cfg(Py_3_13)] + #[cfg(Py_3_10)] return Py_None(); } @@ -681,10 +681,10 @@ pub unsafe fn Py_NotImplemented() -> *mut PyObject { #[inline] pub unsafe fn Py_RETURN_NOTIMPLEMENTED() -> *mut PyObject { - #[cfg(all(not(Py_3_13), Py_LIMITED_API))] + #[cfg(all(not(Py_3_13), Py_3_10, Py_LIMITED_API, not(PyPy)))] return Py_NewRef(Py_NotImplemented()); - #[cfg(Py_3_13)] + #[cfg(Py_3_10)] return Py_NotImplemented(); } From e82ab6631e1e231e38e5b496422ef3c72ae90e73 Mon Sep 17 00:00:00 2001 From: Charlie Lin Date: Sat, 25 Apr 2026 11:26:11 -0500 Subject: [PATCH 10/11] Refactor Py_RETURN_NONE and Py_RETURN_NOTIMPLEMENTED --- pyo3-ffi/src/object.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/pyo3-ffi/src/object.rs b/pyo3-ffi/src/object.rs index 2dbce9ca86e..61838c8e432 100644 --- a/pyo3-ffi/src/object.rs +++ b/pyo3-ffi/src/object.rs @@ -652,10 +652,14 @@ pub unsafe fn Py_IsNone(x: *mut PyObject) -> c_int { #[inline] pub unsafe fn Py_RETURN_NONE() -> *mut PyObject { #[cfg(all(not(Py_3_13), Py_3_10, Py_LIMITED_API, not(PyPy)))] - return Py_NewRef(Py_None()); + { + Py_NewRef(Py_None()) + } #[cfg(Py_3_10)] - return Py_None(); + { + Py_None() + } } extern_libpython! { @@ -682,10 +686,14 @@ pub unsafe fn Py_NotImplemented() -> *mut PyObject { #[inline] pub unsafe fn Py_RETURN_NOTIMPLEMENTED() -> *mut PyObject { #[cfg(all(not(Py_3_13), Py_3_10, Py_LIMITED_API, not(PyPy)))] - return Py_NewRef(Py_NotImplemented()); + { + Py_NewRef(Py_NotImplemented()) + } #[cfg(Py_3_10)] - return Py_NotImplemented(); + { + Py_NotImplemented() + } } /* Rich comparison opcodes */ From 5a0134ed90aaa696343b1847be9797a48cc5fc1e Mon Sep 17 00:00:00 2001 From: Charlie Lin Date: Sat, 25 Apr 2026 11:33:27 -0500 Subject: [PATCH 11/11] Refactor Py_RETURN_NONE and Py_RETURN_NOTIMPLEMENTED --- pyo3-ffi/src/object.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pyo3-ffi/src/object.rs b/pyo3-ffi/src/object.rs index 61838c8e432..0ee83bfc8f4 100644 --- a/pyo3-ffi/src/object.rs +++ b/pyo3-ffi/src/object.rs @@ -653,7 +653,8 @@ pub unsafe fn Py_IsNone(x: *mut PyObject) -> c_int { pub unsafe fn Py_RETURN_NONE() -> *mut PyObject { #[cfg(all(not(Py_3_13), Py_3_10, Py_LIMITED_API, not(PyPy)))] { - Py_NewRef(Py_None()) + let obj = Py_None(); + Py_NewRef(obj) } #[cfg(Py_3_10)] @@ -687,7 +688,8 @@ pub unsafe fn Py_NotImplemented() -> *mut PyObject { pub unsafe fn Py_RETURN_NOTIMPLEMENTED() -> *mut PyObject { #[cfg(all(not(Py_3_13), Py_3_10, Py_LIMITED_API, not(PyPy)))] { - Py_NewRef(Py_NotImplemented()) + let obj = Py_NotImplemented(); + Py_NewRef(obj) } #[cfg(Py_3_10)]