python27-sys: Add struct definitions for PyCodeObject and PyFrameObject.
Closes #21.
This commit is contained in:
parent
cb938e1906
commit
93b522404e
|
@ -1,7 +1,8 @@
|
|||
use libc::{c_void, c_char, c_int};
|
||||
use pyport::Py_ssize_t;
|
||||
use object::PyObject;
|
||||
use pystate::{PyFrameObject, PyThreadState, Py_tracefunc};
|
||||
use frameobject::PyFrameObject;
|
||||
use pystate::{PyThreadState, Py_tracefunc};
|
||||
use pythonrun::PyCompilerFlags;
|
||||
|
||||
extern "C" {
|
||||
|
|
|
@ -1,8 +1,33 @@
|
|||
use libc::{c_char, c_int};
|
||||
use libc::{c_char, c_int, c_void};
|
||||
use pyport::Py_ssize_t;
|
||||
use object::*;
|
||||
|
||||
#[allow(missing_copy_implementations)]
|
||||
pub enum PyCodeObject { /* hidden representation */ }
|
||||
#[repr(C)]
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct PyCodeObject {
|
||||
#[cfg(py_sys_config="Py_TRACE_REFS")]
|
||||
pub _ob_next: *mut PyObject,
|
||||
#[cfg(py_sys_config="Py_TRACE_REFS")]
|
||||
pub _ob_prev: *mut PyObject,
|
||||
pub ob_refcnt: Py_ssize_t,
|
||||
pub ob_type: *mut PyTypeObject,
|
||||
pub co_argcount: c_int,
|
||||
pub co_nlocals: c_int,
|
||||
pub co_stacksize: c_int,
|
||||
pub co_flags: c_int,
|
||||
pub co_code: *mut PyObject,
|
||||
pub co_consts: *mut PyObject,
|
||||
pub co_names: *mut PyObject,
|
||||
pub co_varnames: *mut PyObject,
|
||||
pub co_freevars: *mut PyObject,
|
||||
pub co_cellvars: *mut PyObject,
|
||||
pub co_filename: *mut PyObject,
|
||||
pub co_name: *mut PyObject,
|
||||
pub co_firstlineno: c_int,
|
||||
pub co_lnotab: *mut PyObject,
|
||||
pub co_zombieframe: *mut c_void,
|
||||
pub co_weakreflist: *mut PyObject,
|
||||
}
|
||||
|
||||
/* Masks for co_flags */
|
||||
pub const CO_OPTIMIZED : c_int = 0x0001;
|
||||
|
@ -24,6 +49,8 @@ pub const CO_FUTURE_WITH_STATEMENT : c_int = 0x8000;
|
|||
pub const CO_FUTURE_PRINT_FUNCTION : c_int = 0x10000;
|
||||
pub const CO_FUTURE_UNICODE_LITERALS : c_int = 0x20000;
|
||||
|
||||
pub const CO_MAXBLOCKS : usize = 20;
|
||||
|
||||
extern "C" {
|
||||
pub static mut PyCode_Type: PyTypeObject;
|
||||
|
||||
|
@ -50,7 +77,11 @@ extern "C" {
|
|||
|
||||
#[inline(always)]
|
||||
pub unsafe fn PyCode_Check(op : *mut PyObject) -> c_int {
|
||||
let u : *mut PyTypeObject = &mut PyCode_Type;
|
||||
(Py_TYPE(op) == u) as c_int
|
||||
(Py_TYPE(op) == &mut PyCode_Type) as c_int
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub unsafe fn PyCode_GetNumFree(op : *mut PyCodeObject) -> Py_ssize_t {
|
||||
::tupleobject::PyTuple_GET_SIZE((*op).co_freevars)
|
||||
}
|
||||
|
||||
|
|
82
python27-sys/src/frameobject.rs
Normal file
82
python27-sys/src/frameobject.rs
Normal file
|
@ -0,0 +1,82 @@
|
|||
use libc::c_int;
|
||||
use object::*;
|
||||
use pyport::Py_ssize_t;
|
||||
use code::{PyCodeObject, CO_MAXBLOCKS};
|
||||
use pystate::PyThreadState;
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct PyTryBlock {
|
||||
pub b_type : c_int,
|
||||
pub b_handler : c_int,
|
||||
pub b_level : c_int,
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct PyFrameObject {
|
||||
#[cfg(py_sys_config="Py_TRACE_REFS")]
|
||||
pub _ob_next: *mut PyObject,
|
||||
#[cfg(py_sys_config="Py_TRACE_REFS")]
|
||||
pub _ob_prev: *mut PyObject,
|
||||
pub ob_refcnt: Py_ssize_t,
|
||||
pub ob_type: *mut PyTypeObject,
|
||||
pub ob_size: Py_ssize_t,
|
||||
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_exc_type: *mut PyObject,
|
||||
pub f_exc_value: *mut PyObject,
|
||||
pub f_exc_traceback: *mut PyObject,
|
||||
|
||||
pub f_tstate: *mut PyThreadState,
|
||||
|
||||
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_blockstack: [PyTryBlock; CO_MAXBLOCKS], /* for try and loop blocks */
|
||||
pub f_localsplus: [*mut PyObject; 1] /* locals+stack, dynamically sized */
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
pub static mut PyFrame_Type: PyTypeObject;
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub unsafe fn PyFrame_Check(op: *mut PyObject) -> c_int {
|
||||
((*op).ob_type == &mut PyFrame_Type) as c_int
|
||||
}
|
||||
|
||||
//#[inline]
|
||||
//pub unsafe fn PyFrame_IsRestricted(f: *mut PyFrameObject) -> c_int {
|
||||
// ((*f).f_builtins != (*(*(*f).f_tstate).interp).builtins) as c_int
|
||||
//}
|
||||
|
||||
extern "C" {
|
||||
pub fn PyFrame_New(tstate: *mut PyThreadState, code: *mut PyCodeObject,
|
||||
globals: *mut PyObject, locals: *mut PyObject) -> *mut PyFrameObject;
|
||||
|
||||
pub fn PyFrame_BlockSetup(f: *mut PyFrameObject, _type: c_int, handler: c_int, level: c_int) -> ();
|
||||
pub fn PyFrame_BlockPop(f: *mut PyFrameObject) -> *mut PyTryBlock;
|
||||
|
||||
pub fn PyFrame_LocalsToFast(f: *mut PyFrameObject, clear: c_int) -> ();
|
||||
pub fn PyFrame_FastToLocals(f: *mut PyFrameObject) -> ();
|
||||
|
||||
pub fn PyFrame_ClearFreeList() -> c_int;
|
||||
pub fn PyFrame_GetLineNumber(f: *mut PyFrameObject) -> c_int;
|
||||
}
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
use libc::c_int;
|
||||
use pyport::Py_ssize_t;
|
||||
use object::*;
|
||||
use frameobject::PyFrameObject;
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Copy, Clone)]
|
||||
|
@ -11,7 +12,7 @@ pub struct PyGenObject {
|
|||
pub _ob_prev: *mut PyObject,
|
||||
pub ob_refcnt: Py_ssize_t,
|
||||
pub ob_type: *mut PyTypeObject,
|
||||
pub gi_frame: *mut ::PyFrameObject,
|
||||
pub gi_frame: *mut PyFrameObject,
|
||||
pub gi_running: c_int,
|
||||
pub gi_code: *mut PyObject,
|
||||
pub gi_weakreflist: *mut PyObject
|
||||
|
@ -32,7 +33,7 @@ pub unsafe fn PyGen_CheckExact(op: *mut PyObject) -> c_int {
|
|||
}
|
||||
|
||||
extern "C" {
|
||||
pub fn PyGen_New(frame: *mut ::PyFrameObject) -> *mut PyObject;
|
||||
pub fn PyGen_New(frame: *mut PyFrameObject) -> *mut PyObject;
|
||||
pub fn PyGen_NeedsFinalizing(op: *mut PyGenObject) -> c_int;
|
||||
}
|
||||
|
||||
|
|
|
@ -53,6 +53,7 @@ pub use code::*;
|
|||
pub use compile::*;
|
||||
pub use eval::*;
|
||||
pub use structmember::PyMemberDef;
|
||||
pub use frameobject::PyFrameObject;
|
||||
|
||||
mod pyport;
|
||||
mod pymem;
|
||||
|
@ -121,6 +122,7 @@ mod eval;
|
|||
|
||||
// Additional headers that are not exported by Python.h
|
||||
pub mod structmember;
|
||||
pub mod frameobject;
|
||||
|
||||
pub const Py_single_input: libc::c_int = 256;
|
||||
pub const Py_file_input: libc::c_int = 257;
|
||||
|
|
|
@ -1,12 +1,9 @@
|
|||
use libc::{c_int, c_long};
|
||||
use object::PyObject;
|
||||
use frameobject::PyFrameObject;
|
||||
|
||||
#[allow(missing_copy_implementations)]
|
||||
pub enum PyInterpreterState { }
|
||||
|
||||
#[allow(missing_copy_implementations)]
|
||||
pub enum PyFrameObject { }
|
||||
|
||||
pub type Py_tracefunc =
|
||||
unsafe extern "C" fn
|
||||
(arg1: *mut PyObject, arg2: *mut PyFrameObject,
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
use libc::c_int;
|
||||
use object::*;
|
||||
use pyport::Py_ssize_t;
|
||||
use frameobject::PyFrameObject;
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Copy, Clone)]
|
||||
|
@ -12,13 +13,13 @@ pub struct PyTracebackObject {
|
|||
pub ob_refcnt: Py_ssize_t,
|
||||
pub ob_type: *mut PyTypeObject,
|
||||
pub tb_next: *mut PyTracebackObject,
|
||||
pub tb_frame: *mut ::PyFrameObject,
|
||||
pub tb_frame: *mut PyFrameObject,
|
||||
pub tb_lasti: c_int,
|
||||
pub tb_lineno: c_int
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
pub fn PyTraceBack_Here(arg1: *mut ::PyFrameObject) -> c_int;
|
||||
pub fn PyTraceBack_Here(arg1: *mut PyFrameObject) -> c_int;
|
||||
pub fn PyTraceBack_Print(arg1: *mut PyObject, arg2: *mut PyObject)
|
||||
-> c_int;
|
||||
|
||||
|
|
Loading…
Reference in a new issue