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
33pub 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;
40pub const CO_NOFREE: c_int = 0x0040;
46
47pub const CO_FUTURE_DIVISION: c_int = 0x2000;
48pub const CO_FUTURE_ABSOLUTE_IMPORT: c_int = 0x4000; pub 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}