Skip to content

Commit

Permalink
add missing pyframe ffi functions
Browse files Browse the repository at this point in the history
  • Loading branch information
dsal3389 committed Jan 30, 2025
1 parent f89b5f7 commit d4211cd
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 3 deletions.
2 changes: 2 additions & 0 deletions newsfragments/4881.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
added missing ffi functions for `PyFrameObject` but without
including unstable API from python 3.13
9 changes: 9 additions & 0 deletions pyo3-ffi/src/cpython/frameobject.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,13 +62,22 @@ 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]
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")]
Expand Down
40 changes: 37 additions & 3 deletions pyo3-ffi/src/pyframe.rs
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit d4211cd

Please sign in to comment.