ffi: fix PyFrameObject definition

This commit is contained in:
David Hewitt 2022-06-02 17:10:30 +01:00
parent 4f490a01d6
commit f8a9837c3a
2 changed files with 29 additions and 28 deletions

View File

@ -46,6 +46,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Fix FFI definition `PyGenObject` having multiple incorrect members on various Python versions. [#2423](https://github.com/PyO3/pyo3/pull/2423)
- Fix FFI definition `PySyntaxErrorObject` missing members `end_lineno` and `end_offset` on Python 3.10 and up. [#2423](https://github.com/PyO3/pyo3/pull/2423)
- Fix FFI definition `PyHeapTypeObject` missing member `ht_module` on Python 3.9 and up. [#2423](https://github.com/PyO3/pyo3/pull/2423)
- Fix FFI definition `PyFrameObject` having multiple incorrect members on various Python versions. [#2424](https://github.com/PyO3/pyo3/pull/2424)
## [0.16.5] - 2022-05-15

View File

@ -1,10 +1,11 @@
use crate::cpython::code::{PyCodeObject, CO_MAXBLOCKS};
use crate::cpython::code::PyCodeObject;
use crate::object::*;
use crate::pystate::PyThreadState;
use std::os::raw::{c_char, c_int};
// skipped _framestate
// skipped PyFrameState
pub type PyFrameState = c_char;
#[repr(C)]
#[derive(Copy, Clone)]
@ -14,41 +15,40 @@ pub struct PyTryBlock {
pub b_level: c_int,
}
/// struct _frame as typedef'ed in pyframe.h
#[repr(C)]
#[derive(Copy, Clone)]
#[cfg(not(Py_3_11))]
pub struct PyFrameObject {
pub ob_base: PyVarObject,
pub f_back: *mut PyFrameObject, /* previous frame, or NULL */
pub f_code: *mut PyCodeObject, /* code segment */
pub f_builtins: *mut PyObject, /* builtin symbol table (PyDictObject) */
pub f_globals: *mut PyObject, /* global symbol table (PyDictObject) */
pub f_locals: *mut PyObject, /* local symbol table (any mapping) */
pub f_valuestack: *mut *mut PyObject, /* points after the last local */
/* Next free slot in f_valuestack. Frame creation sets to f_valuestack.
Frame evaluation usually NULLs it, but a frame that yields sets it
to the current stack top. */
pub f_stacktop: *mut *mut PyObject,
pub f_trace: *mut PyObject, /* Trace function */
pub f_back: *mut PyFrameObject,
pub f_code: *mut PyCodeObject,
pub f_builtins: *mut PyObject,
pub f_globals: *mut PyObject,
pub f_locals: *mut PyObject,
pub f_valuestack: *mut *mut PyObject,
#[cfg(not(Py_3_10))]
pub f_stacktop: *mut *mut PyObject,
pub f_trace: *mut PyObject,
pub f_stackdepth: c_int,
pub f_trace_lines: c_char,
pub f_trace_opcodes: c_char,
pub f_exc_type: *mut PyObject,
pub f_exc_value: *mut PyObject,
pub f_exc_traceback: *mut PyObject,
pub f_gen: *mut PyObject,
pub f_lasti: c_int, /* Last instruction if called */
/* Call PyFrame_GetLineNumber() instead of reading this field
directly. As of 2.3 f_lineno is only valid when tracing is
active (i.e. when f_trace is set). At other times we use
PyCode_Addr2Line to calculate the line from the current
bytecode index. */
pub f_lineno: c_int, /* Current line number */
pub f_iblock: c_int, /* index in f_blockstack */
pub f_executing: c_char, /* whether the frame is still executing */
pub f_blockstack: [PyTryBlock; CO_MAXBLOCKS], /* for try and loop blocks */
pub f_localsplus: [*mut PyObject; 1], /* locals+stack, dynamically sized */
pub f_lasti: c_int,
pub f_lineno: c_int,
pub f_iblock: c_int,
#[cfg(not(Py_3_10))]
pub f_executing: c_char,
pub f_state: PyFrameState,
pub f_blockstack: [PyTryBlock; crate::CO_MAXBLOCKS],
pub f_localsplus: [*mut PyObject; 1],
}
#[cfg(Py_3_11)]
opaque_struct!(PyFrameObject);
// skipped _PyFrame_IsRunnable
// skipped _PyFrame_IsExecuting
// skipped _PyFrameHasCompleted