Skip to main content

pyforge_ffi/cpython/
code.rs

1use crate::object::*;
2use crate::pyport::Py_ssize_t;
3
4use crate::PyCodeObject;
5use std::ffi::c_char;
6use std::ffi::{c_int, c_void};
7
8// skipped private _PY_MONITORING_LOCAL_EVENTS
9// skipped private _PY_MONITORING_UNGROUPED_EVENTS
10// skipped private _PY_MONITORING_EVENTS
11
12// skipped private _PyLocalMonitors
13// skipped private _Py_GlobalMonitors
14
15// skipped private _Py_CODEUNIT
16
17// skipped private _Py_OPCODE
18// skipped private _Py_OPARG
19
20// skipped private _py_make_codeunit
21
22// skipped private _py_set_opcode
23
24// skipped private _Py_MAKE_CODEUNIT
25// skipped private _Py_SET_OPCODE
26
27// skipped private _PyCoCached
28// skipped private _PyCoLineInstrumentationData
29// skipped private _PyCoMonitoringData
30
31// skipped private _PyExecutorArray
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/* The CO_COROUTINE flag is set for coroutine functions (defined with
47``async def`` keywords) */
48pub const CO_COROUTINE: c_int = 0x0080;
49pub const CO_ITERABLE_COROUTINE: c_int = 0x0100;
50pub const CO_ASYNC_GENERATOR: c_int = 0x0200;
51
52pub const CO_FUTURE_DIVISION: c_int = 0x2000;
53pub const CO_FUTURE_ABSOLUTE_IMPORT: c_int = 0x4000; /* do absolute imports by default */
54pub const CO_FUTURE_WITH_STATEMENT: c_int = 0x8000;
55pub const CO_FUTURE_PRINT_FUNCTION: c_int = 0x1_0000;
56pub const CO_FUTURE_UNICODE_LITERALS: c_int = 0x2_0000;
57
58pub const CO_FUTURE_BARRY_AS_BDFL: c_int = 0x4_0000;
59pub const CO_FUTURE_GENERATOR_STOP: c_int = 0x8_0000;
60// skipped CO_FUTURE_ANNOTATIONS
61// skipped CO_CELL_NOT_AN_ARG
62
63pub const CO_MAXBLOCKS: usize = 20;
64
65extern_libpython! {
66    pub static mut PyCode_Type: PyTypeObject;
67}
68
69#[inline]
70pub unsafe fn PyCode_Check(op: *mut PyObject) -> c_int {
71    (Py_TYPE(op) == &raw mut PyCode_Type) as c_int
72}
73
74// skipped PyCode_GetNumFree (requires knowledge of code object layout)
75
76extern_libpython! {
77    pub fn PyCode_New(
78        argcount: c_int,
79        kwonlyargcount: c_int,
80        nlocals: c_int,
81        stacksize: c_int,
82        flags: c_int,
83        code: *mut PyObject,
84        consts: *mut PyObject,
85        names: *mut PyObject,
86        varnames: *mut PyObject,
87        freevars: *mut PyObject,
88        cellvars: *mut PyObject,
89        filename: *mut PyObject,
90        name: *mut PyObject,
91        firstlineno: c_int,
92        lnotab: *mut PyObject,
93    ) -> *mut PyCodeObject;
94    pub fn PyCode_NewWithPosOnlyArgs(
95        argcount: c_int,
96        posonlyargcount: c_int,
97        kwonlyargcount: c_int,
98        nlocals: c_int,
99        stacksize: c_int,
100        flags: c_int,
101        code: *mut PyObject,
102        consts: *mut PyObject,
103        names: *mut PyObject,
104        varnames: *mut PyObject,
105        freevars: *mut PyObject,
106        cellvars: *mut PyObject,
107        filename: *mut PyObject,
108        name: *mut PyObject,
109        firstlineno: c_int,
110        lnotab: *mut PyObject,
111    ) -> *mut PyCodeObject;
112    pub fn PyCode_NewEmpty(
113        filename: *const c_char,
114        funcname: *const c_char,
115        firstlineno: c_int,
116    ) -> *mut PyCodeObject;
117    pub fn PyCode_Addr2Line(arg1: *mut PyCodeObject, arg2: c_int) -> c_int;
118    // skipped PyCodeAddressRange "for internal use only"
119    // skipped _PyCode_CheckLineNumber
120    // skipped _PyCode_ConstantKey
121    pub fn PyCode_Optimize(
122        code: *mut PyObject,
123        consts: *mut PyObject,
124        names: *mut PyObject,
125        lnotab: *mut PyObject,
126    ) -> *mut PyObject;
127    pub fn _PyCode_GetExtra(
128        code: *mut PyObject,
129        index: Py_ssize_t,
130        extra: *const *mut c_void,
131    ) -> c_int;
132    pub fn _PyCode_SetExtra(code: *mut PyObject, index: Py_ssize_t, extra: *mut c_void) -> c_int;
133}