From d4211cd4461c461bfe191ee9a1f35b303763f635 Mon Sep 17 00:00:00 2001 From: daniel sonbolian Date: Tue, 28 Jan 2025 22:47:38 +0200 Subject: [PATCH] add missing pyframe ffi functions --- newsfragments/4881.added.md | 2 ++ pyo3-ffi/src/cpython/frameobject.rs | 9 +++++++ pyo3-ffi/src/pyframe.rs | 40 ++++++++++++++++++++++++++--- 3 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 newsfragments/4881.added.md diff --git a/newsfragments/4881.added.md b/newsfragments/4881.added.md new file mode 100644 index 00000000000..0cd7b5735d2 --- /dev/null +++ b/newsfragments/4881.added.md @@ -0,0 +1,2 @@ +added missing ffi functions for `PyFrameObject` but without +including unstable API from python 3.13 \ No newline at end of file diff --git a/pyo3-ffi/src/cpython/frameobject.rs b/pyo3-ffi/src/cpython/frameobject.rs index 6d2346f9288..2d7b5d47fdd 100644 --- a/pyo3-ffi/src/cpython/frameobject.rs +++ b/pyo3-ffi/src/cpython/frameobject.rs @@ -62,6 +62,9 @@ opaque_struct!(PyFrameObject); #[cfg_attr(windows, link(name = "pythonXY"))] extern "C" { pub static mut PyFrame_Type: PyTypeObject; + + #[cfg(Py_3_13)] + pub static mut PyFrameLocalsProxy_Type: PyTypeObject; } #[inline] @@ -69,6 +72,12 @@ pub unsafe fn PyFrame_Check(op: *mut PyObject) -> c_int { (Py_TYPE(op) == addr_of_mut!(PyFrame_Type)) as c_int } +#[cfg(Py_3_13)] +#[inline] +pub unsafe fn PyFrameLocalsProxy_Check(op: *mut PyObject) -> c_int { + (Py_TYPE(op) == addr_of_mut!(PyFrameLocalsProxy_Type)) as c_int +} + extern "C" { #[cfg(not(GraalPy))] #[cfg_attr(PyPy, link_name = "PyPyFrame_New")] diff --git a/pyo3-ffi/src/pyframe.rs b/pyo3-ffi/src/pyframe.rs index 4dd3d2b31a5..04409212723 100644 --- a/pyo3-ffi/src/pyframe.rs +++ b/pyo3-ffi/src/pyframe.rs @@ -1,16 +1,50 @@ +#[allow(unused_imports)] +use crate::object::PyObject; #[cfg(not(GraalPy))] #[cfg(any(Py_3_10, all(Py_3_9, not(Py_LIMITED_API))))] use crate::PyCodeObject; #[cfg(not(Py_LIMITED_API))] use crate::PyFrameObject; -use std::os::raw::c_int; +#[allow(unused_imports)] +use std::os::raw::{c_char, c_int}; #[cfg(Py_LIMITED_API)] opaque_struct!(PyFrameObject); +// skipped _PyInterpreterFrame from Include/cpython/pyframe.h + extern "C" { - pub fn PyFrame_GetLineNumber(f: *mut PyFrameObject) -> c_int; + pub fn PyFrame_GetLineNumber(frame: *mut PyFrameObject) -> c_int; + + #[cfg(Py_3_9)] + pub fn PyFrame_GetBack(frame: *mut PyFrameObject) -> *mut PyFrameObject; + #[cfg(not(GraalPy))] #[cfg(any(Py_3_10, all(Py_3_9, not(Py_LIMITED_API))))] - pub fn PyFrame_GetCode(f: *mut PyFrameObject) -> *mut PyCodeObject; + pub fn PyFrame_GetCode(frame: *mut PyFrameObject) -> *mut PyCodeObject; + + #[cfg(Py_3_11)] + pub fn PyFrame_GetGenerator(frame: *mut PyFrameObject) -> *mut PyObject; + + #[cfg(Py_3_11)] + pub fn PyFrame_GetBuiltins(frame: *mut PyFrameObject) -> *mut PyObject; + + #[cfg(Py_3_11)] + pub fn PyFrame_GetLocals(frame: *mut PyFrameObject) -> *mut PyObject; + + #[cfg(Py_3_11)] + pub fn PyFrame_GetGlobals(frame: *mut PyFrameObject) -> *mut PyObject; + + #[cfg(Py_3_11)] + pub fn PyFrame_GetLasti(frame: *mut PyFrameObject) -> c_int; + + #[cfg(Py_3_12)] + pub fn PyFrame_GetVar(frame: *mut PyFrameObject, name: *mut PyObject) -> *mut PyObject; + + #[cfg(Py_3_12)] + pub fn PyFrame_GetVarString(frame: *mut PyFrameObject, name: *mut c_char) -> *mut PyObject; + + // skipped PyUnstable_InterpreterFrame_GetCode from Include/cpython/pyframe.h + // skipped PyUnstable_InterpreterFrame_GetLasti from Include/cpython/pyframe.h + // skipped PyUnstable_InterpreterFrame_GetLine from Include/cpython/pyframe.h }