pyo3_ffi/cpython/
frameobject.rs

1#[cfg(not(GraalPy))]
2use crate::cpython::code::PyCodeObject;
3use crate::object::*;
4#[cfg(not(GraalPy))]
5use crate::pystate::PyThreadState;
6#[cfg(not(any(PyPy, GraalPy, Py_3_11)))]
7use std::os::raw::c_char;
8use std::os::raw::c_int;
9use std::ptr::addr_of_mut;
10
11#[cfg(not(any(PyPy, GraalPy, Py_3_11)))]
12pub type PyFrameState = c_char;
13
14#[repr(C)]
15#[derive(Copy, Clone)]
16#[cfg(not(any(PyPy, GraalPy, Py_3_11)))]
17pub struct PyTryBlock {
18    pub b_type: c_int,
19    pub b_handler: c_int,
20    pub b_level: c_int,
21}
22
23#[repr(C)]
24#[cfg(not(any(PyPy, GraalPy, Py_3_11)))]
25pub struct PyFrameObject {
26    pub ob_base: PyVarObject,
27    pub f_back: *mut PyFrameObject,
28    pub f_code: *mut PyCodeObject,
29    pub f_builtins: *mut PyObject,
30    pub f_globals: *mut PyObject,
31    pub f_locals: *mut PyObject,
32    pub f_valuestack: *mut *mut PyObject,
33
34    #[cfg(not(Py_3_10))]
35    pub f_stacktop: *mut *mut PyObject,
36    pub f_trace: *mut PyObject,
37    #[cfg(Py_3_10)]
38    pub f_stackdepth: c_int,
39    pub f_trace_lines: c_char,
40    pub f_trace_opcodes: c_char,
41
42    pub f_gen: *mut PyObject,
43
44    pub f_lasti: c_int,
45    pub f_lineno: c_int,
46    pub f_iblock: c_int,
47    #[cfg(not(Py_3_10))]
48    pub f_executing: c_char,
49    #[cfg(Py_3_10)]
50    pub f_state: PyFrameState,
51    pub f_blockstack: [PyTryBlock; crate::CO_MAXBLOCKS],
52    pub f_localsplus: [*mut PyObject; 1],
53}
54
55#[cfg(any(PyPy, GraalPy, Py_3_11))]
56opaque_struct!(PyFrameObject);
57
58// skipped _PyFrame_IsRunnable
59// skipped _PyFrame_IsExecuting
60// skipped _PyFrameHasCompleted
61
62#[cfg_attr(windows, link(name = "pythonXY"))]
63extern "C" {
64    pub static mut PyFrame_Type: PyTypeObject;
65}
66
67#[inline]
68pub unsafe fn PyFrame_Check(op: *mut PyObject) -> c_int {
69    (Py_TYPE(op) == addr_of_mut!(PyFrame_Type)) as c_int
70}
71
72extern "C" {
73    #[cfg(not(GraalPy))]
74    #[cfg_attr(PyPy, link_name = "PyPyFrame_New")]
75    pub fn PyFrame_New(
76        tstate: *mut PyThreadState,
77        code: *mut PyCodeObject,
78        globals: *mut PyObject,
79        locals: *mut PyObject,
80    ) -> *mut PyFrameObject;
81    // skipped _PyFrame_New_NoTrack
82
83    pub fn PyFrame_BlockSetup(f: *mut PyFrameObject, _type: c_int, handler: c_int, level: c_int);
84    #[cfg(not(any(PyPy, GraalPy, Py_3_11)))]
85    pub fn PyFrame_BlockPop(f: *mut PyFrameObject) -> *mut PyTryBlock;
86
87    pub fn PyFrame_LocalsToFast(f: *mut PyFrameObject, clear: c_int);
88    pub fn PyFrame_FastToLocalsWithError(f: *mut PyFrameObject) -> c_int;
89    pub fn PyFrame_FastToLocals(f: *mut PyFrameObject);
90
91    // skipped _PyFrame_DebugMallocStats
92    // skipped PyFrame_GetBack
93
94    #[cfg(not(Py_3_9))]
95    pub fn PyFrame_ClearFreeList() -> c_int;
96}