# code.rs - source
Source of the Rust file `/home/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/pyo3-0.13.2/src/ffi/cpython/code.rs`.
Keywords: rust, rustlang, rust-lang

      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
     67
     68
     69
     70
     71
     72
     73
     74
     75
     76
     77
     78
     79
     80
     81
     82
     83
     84
     85
     86
     87
     88
     89
     90
     91
     92
     93
     94
     95
     96
     97
     98
     99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166

    use crate::ffi::object::*;
    use crate::ffi::pyport::Py_ssize_t;
    use std::os::raw::{c_char, c_int, c_uchar, c_void};

    // skipped _Py_CODEUNIT
    // skipped _Py_OPCODE
    // skipped _Py_OPARG

    #[cfg(Py_3_8)]
    opaque_struct!(_PyOpcache);

    #[repr(C)]
    #[derive(Copy, Clone)]
    pub struct PyCodeObject {
        pub ob_base: PyObject,
        pub co_argcount: c_int,
        #[cfg(Py_3_8)]
        pub co_posonlyargcount: c_int,
        pub co_kwonlyargcount: c_int,
        pub co_nlocals: c_int,
        pub co_stacksize: c_int,
        pub co_flags: c_int,
        pub co_firstlineno: 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_cell2arg: *mut c_uchar,
        pub co_filename: *mut PyObject,
        pub co_name: *mut PyObject,
        pub co_lnotab: *mut PyObject,
        pub co_zombieframe: *mut c_void,
        pub co_weakreflist: *mut PyObject,
        pub co_extra: *mut c_void,
        #[cfg(Py_3_8)]
        pub co_opcache_map: *mut c_uchar,
        #[cfg(Py_3_8)]
        pub co_opcache: *mut _PyOpcache,
        #[cfg(Py_3_8)]
        pub co_opcache_flag: c_int,
        #[cfg(Py_3_8)]
        pub co_opcache_size: c_uchar,
    }

    /* Masks for co_flags */
    pub const CO_OPTIMIZED: c_int = 0x0001;
    pub const CO_NEWLOCALS: c_int = 0x0002;
    pub const CO_VARARGS: c_int = 0x0004;
    pub const CO_VARKEYWORDS: c_int = 0x0008;
    pub const CO_NESTED: c_int = 0x0010;
    pub const CO_GENERATOR: c_int = 0x0020;
    /* The CO_NOFREE flag is set if there are no free or cell variables.
       This information is redundant, but it allows a single flag test
       to determine whether there is any extra work to be done when the
       call frame it setup.
    */
    pub const CO_NOFREE: c_int = 0x0040;
    /* The CO_COROUTINE flag is set for coroutine functions (defined with
    ``async def`` keywords) */
    pub const CO_COROUTINE: c_int = 0x0080;
    pub const CO_ITERABLE_COROUTINE: c_int = 0x0100;
    pub const CO_ASYNC_GENERATOR: c_int = 0x0200;

    pub const CO_FUTURE_DIVISION: c_int = 0x2000;
    pub const CO_FUTURE_ABSOLUTE_IMPORT: c_int = 0x4000; /* do absolute imports by default */
    pub const CO_FUTURE_WITH_STATEMENT: c_int = 0x8000;
    pub const CO_FUTURE_PRINT_FUNCTION: c_int = 0x1_0000;
    pub const CO_FUTURE_UNICODE_LITERALS: c_int = 0x2_0000;

    pub const CO_FUTURE_BARRY_AS_BDFL: c_int = 0x4_0000;
    pub const CO_FUTURE_GENERATOR_STOP: c_int = 0x8_0000;
    // skipped CO_FUTURE_ANNOTATIONS
    // skipped CO_CELL_NOT_AN_ARG

    pub const CO_MAXBLOCKS: usize = 20;

    #[cfg_attr(windows, link(name = "pythonXY"))]
    extern "C" {
        pub static mut PyCode_Type: PyTypeObject;
    }

    #[inline]
    #[cfg(not(PyPy))]
    pub unsafe fn PyCode_Check(op: *mut PyObject) -> c_int {
        (Py_TYPE(op) == &mut PyCode_Type) as c_int
    }

    #[inline]
    #[cfg(not(PyPy))]
    pub unsafe fn PyCode_GetNumFree(op: *mut PyCodeObject) -> Py_ssize_t {
        crate::ffi::tupleobject::PyTuple_GET_SIZE((*op).co_freevars)
    }

    extern "C" {
        #[cfg(PyPy)]
        #[link_name = "PyPyCode_Check"]
        pub fn PyCode_Check(op: *mut PyObject) -> c_int;

        #[cfg(PyPy)]
        #[link_name = "PyPyCode_GetNumFree"]
        pub fn PyCode_GetNumFree(op: *mut PyCodeObject) -> Py_ssize_t;
    }

    extern "C" {
        #[cfg_attr(PyPy, link_name = "PyPyCode_New")]
        pub fn PyCode_New(
            argcount: c_int,
            kwonlyargcount: c_int,
            nlocals: c_int,
            stacksize: c_int,
            flags: c_int,
            code: *mut PyObject,
            consts: *mut PyObject,
            names: *mut PyObject,
            varnames: *mut PyObject,
            freevars: *mut PyObject,
            cellvars: *mut PyObject,
            filename: *mut PyObject,
            name: *mut PyObject,
            firstlineno: c_int,
            lnotab: *mut PyObject,
        ) -> *mut PyCodeObject;
        #[cfg(Py_3_8)]
        pub fn PyCode_NewWithPosOnlyArgs(
            argcount: c_int,
            posonlyargcount: c_int,
            kwonlyargcount: c_int,
            nlocals: c_int,
            stacksize: c_int,
            flags: c_int,
            code: *mut PyObject,
            consts: *mut PyObject,
            names: *mut PyObject,
            varnames: *mut PyObject,
            freevars: *mut PyObject,
            cellvars: *mut PyObject,
            filename: *mut PyObject,
            name: *mut PyObject,
            firstlineno: c_int,
            lnotab: *mut PyObject,
        ) -> *mut PyCodeObject;
        #[cfg_attr(PyPy, link_name = "PyPyCode_NewEmpty")]
        pub fn PyCode_NewEmpty(
            filename: *const c_char,
            funcname: *const c_char,
            firstlineno: c_int,
        ) -> *mut PyCodeObject;
        pub fn PyCode_Addr2Line(arg1: *mut PyCodeObject, arg2: c_int) -> c_int;
        // skipped PyCodeAddressRange "for internal use only"
        // skipped _PyCode_CheckLineNumber
        // skipped _PyCode_ConstantKey
        pub fn PyCode_Optimize(
            code: *mut PyObject,
            consts: *mut PyObject,
            names: *mut PyObject,
            lnotab: *mut PyObject,
        ) -> *mut PyObject;
        pub fn _PyCode_GetExtra(
            code: *mut PyObject,
            index: Py_ssize_t,
            extra: *const *mut c_void,
        ) -> c_int;
        pub fn _PyCode_SetExtra(code: *mut PyObject, index: Py_ssize_t, extra: *mut c_void) -> c_int;
    }