python27_sys/
code.rs

1use libc::{c_char, c_int, c_void};
2
3use crate::object::*;
4use crate::pyport::Py_ssize_t;
5
6#[repr(C)]
7#[derive(Copy, Clone)]
8pub struct PyCodeObject {
9    #[cfg(py_sys_config = "Py_TRACE_REFS")]
10    pub _ob_next: *mut PyObject,
11    #[cfg(py_sys_config = "Py_TRACE_REFS")]
12    pub _ob_prev: *mut PyObject,
13    pub ob_refcnt: Py_ssize_t,
14    pub ob_type: *mut PyTypeObject,
15    pub co_argcount: c_int,
16    pub co_nlocals: c_int,
17    pub co_stacksize: c_int,
18    pub co_flags: c_int,
19    pub co_code: *mut PyObject,
20    pub co_consts: *mut PyObject,
21    pub co_names: *mut PyObject,
22    pub co_varnames: *mut PyObject,
23    pub co_freevars: *mut PyObject,
24    pub co_cellvars: *mut PyObject,
25    pub co_filename: *mut PyObject,
26    pub co_name: *mut PyObject,
27    pub co_firstlineno: c_int,
28    pub co_lnotab: *mut PyObject,
29    pub co_zombieframe: *mut c_void,
30    pub co_weakreflist: *mut PyObject,
31}
32
33/* Masks for co_flags */
34pub const CO_OPTIMIZED: c_int = 0x0001;
35pub const CO_NEWLOCALS: c_int = 0x0002;
36pub const CO_VARARGS: c_int = 0x0004;
37pub const CO_VARKEYWORDS: c_int = 0x0008;
38pub const CO_NESTED: c_int = 0x0010;
39pub const CO_GENERATOR: c_int = 0x0020;
40/* The CO_NOFREE flag is set if there are no free or cell variables.
41   This information is redundant, but it allows a single flag test
42   to determine whether there is any extra work to be done when the
43   call frame it setup.
44*/
45pub const CO_NOFREE: c_int = 0x0040;
46
47pub const CO_FUTURE_DIVISION: c_int = 0x2000;
48pub const CO_FUTURE_ABSOLUTE_IMPORT: c_int = 0x4000; /* do absolute imports by default */
49pub const CO_FUTURE_WITH_STATEMENT: c_int = 0x8000;
50pub const CO_FUTURE_PRINT_FUNCTION: c_int = 0x10000;
51pub const CO_FUTURE_UNICODE_LITERALS: c_int = 0x20000;
52
53pub const CO_MAXBLOCKS: usize = 20;
54
55#[cfg_attr(windows, link(name = "pythonXY"))]
56extern "C" {
57    pub static mut PyCode_Type: PyTypeObject;
58
59    pub fn PyCode_New(
60        arg1: c_int,
61        arg2: c_int,
62        arg3: c_int,
63        arg4: c_int,
64        arg5: *mut PyObject,
65        arg6: *mut PyObject,
66        arg7: *mut PyObject,
67        arg8: *mut PyObject,
68        arg9: *mut PyObject,
69        arg10: *mut PyObject,
70        arg11: *mut PyObject,
71        arg12: *mut PyObject,
72        arg13: c_int,
73        arg14: *mut PyObject,
74    ) -> *mut PyCodeObject;
75    pub fn PyCode_NewEmpty(
76        filename: *const c_char,
77        funcname: *const c_char,
78        firstlineno: c_int,
79    ) -> *mut PyCodeObject;
80    pub fn PyCode_Addr2Line(arg1: *mut PyCodeObject, arg2: c_int) -> c_int;
81
82    ignore! {
83        fn _PyCode_CheckLineNumber(
84            co: *mut PyCodeObject,
85            lasti: c_int,
86            bounds: *mut PyAddrPair,
87        ) -> c_int;
88    }
89
90    pub fn PyCode_Optimize(
91        code: *mut PyObject,
92        consts: *mut PyObject,
93        names: *mut PyObject,
94        lineno_obj: *mut PyObject,
95    ) -> *mut PyObject;
96}
97
98#[inline(always)]
99pub unsafe fn PyCode_Check(op: *mut PyObject) -> c_int {
100    (Py_TYPE(op) == &mut PyCode_Type) as c_int
101}
102
103#[inline]
104pub unsafe fn PyCode_GetNumFree(op: *mut PyCodeObject) -> Py_ssize_t {
105    crate::tupleobject::PyTuple_GET_SIZE((*op).co_freevars)
106}