1 /* Definitions for bytecode */ 2 3 #ifndef Py_LIMITED_API 4 #ifndef Py_CODE_H 5 #define Py_CODE_H 6 #ifdef __cplusplus 7 extern "C" { 8 #endif 9 10 /* Each instruction in a code object is a fixed-width value, 11 * currently 2 bytes: 1-byte opcode + 1-byte oparg. The EXTENDED_ARG 12 * opcode allows for larger values but the current limit is 3 uses 13 * of EXTENDED_ARG (see Python/compile.c), for a maximum 14 * 32-bit value. This aligns with the note in Python/compile.c 15 * (compiler_addop_i_line) indicating that the max oparg value is 16 * 2**32 - 1, rather than INT_MAX. 17 */ 18 19 typedef uint16_t _Py_CODEUNIT; 20 21 #ifdef WORDS_BIGENDIAN 22 # define _Py_OPCODE(word) ((word) >> 8) 23 # define _Py_OPARG(word) ((word) & 255) 24 # define _Py_MAKECODEUNIT(opcode, oparg) (((opcode)<<8)|(oparg)) 25 #else 26 # define _Py_OPCODE(word) ((word) & 255) 27 # define _Py_OPARG(word) ((word) >> 8) 28 # define _Py_MAKECODEUNIT(opcode, oparg) ((opcode)|((oparg)<<8)) 29 #endif 30 31 // Use "unsigned char" instead of "uint8_t" here to avoid illegal aliasing: 32 #define _Py_SET_OPCODE(word, opcode) (((unsigned char *)&(word))[0] = (opcode)) 33 34 // To avoid repeating ourselves in deepfreeze.py, all PyCodeObject members are 35 // defined in this macro: 36 #define _PyCode_DEF(SIZE) { \ 37 PyObject_VAR_HEAD \ 38 \ 39 /* Note only the following fields are used in hash and/or comparisons \ 40 * \ 41 * - co_name \ 42 * - co_argcount \ 43 * - co_posonlyargcount \ 44 * - co_kwonlyargcount \ 45 * - co_nlocals \ 46 * - co_stacksize \ 47 * - co_flags \ 48 * - co_firstlineno \ 49 * - co_consts \ 50 * - co_names \ 51 * - co_localsplusnames \ 52 * This is done to preserve the name and line number for tracebacks \ 53 * and debuggers; otherwise, constant de-duplication would collapse \ 54 * identical functions/lambdas defined on different lines. \ 55 */ \ 56 \ 57 /* These fields are set with provided values on new code objects. */ \ 58 \ 59 /* The hottest fields (in the eval loop) are grouped here at the top. */ \ 60 PyObject *co_consts; /* list (constants used) */ \ 61 PyObject *co_names; /* list of strings (names used) */ \ 62 PyObject *co_exceptiontable; /* Byte string encoding exception handling \ 63 table */ \ 64 int co_flags; /* CO_..., see below */ \ 65 short co_warmup; /* Warmup counter for quickening */ \ 66 short _co_linearray_entry_size; /* Size of each entry in _co_linearray */ \ 67 \ 68 /* The rest are not so impactful on performance. */ \ 69 int co_argcount; /* #arguments, except *args */ \ 70 int co_posonlyargcount; /* #positional only arguments */ \ 71 int co_kwonlyargcount; /* #keyword only arguments */ \ 72 int co_stacksize; /* #entries needed for evaluation stack */ \ 73 int co_firstlineno; /* first source line number */ \ 74 \ 75 /* redundant values (derived from co_localsplusnames and \ 76 co_localspluskinds) */ \ 77 int co_nlocalsplus; /* number of local + cell + free variables \ 78 */ \ 79 int co_nlocals; /* number of local variables */ \ 80 int co_nplaincellvars; /* number of non-arg cell variables */ \ 81 int co_ncellvars; /* total number of cell variables */ \ 82 int co_nfreevars; /* number of free variables */ \ 83 \ 84 PyObject *co_localsplusnames; /* tuple mapping offsets to names */ \ 85 PyObject *co_localspluskinds; /* Bytes mapping to local kinds (one byte \ 86 per variable) */ \ 87 PyObject *co_filename; /* unicode (where it was loaded from) */ \ 88 PyObject *co_name; /* unicode (name, for reference) */ \ 89 PyObject *co_qualname; /* unicode (qualname, for reference) */ \ 90 PyObject *co_linetable; /* bytes object that holds location info */ \ 91 PyObject *co_weakreflist; /* to support weakrefs to code objects */ \ 92 PyObject *_co_code; /* cached co_code object/attribute */ \ 93 char *_co_linearray; /* array of line offsets */ \ 94 int _co_firsttraceable; /* index of first traceable instruction */ \ 95 /* Scratch space for extra data relating to the code object. \ 96 Type is a void* to keep the format private in codeobject.c to force \ 97 people to go through the proper APIs. */ \ 98 void *co_extra; \ 99 char co_code_adaptive[(SIZE)]; \ 100 } 101 102 /* Bytecode object */ 103 struct PyCodeObject _PyCode_DEF(1); 104 105 /* Masks for co_flags above */ 106 #define CO_OPTIMIZED 0x0001 107 #define CO_NEWLOCALS 0x0002 108 #define CO_VARARGS 0x0004 109 #define CO_VARKEYWORDS 0x0008 110 #define CO_NESTED 0x0010 111 #define CO_GENERATOR 0x0020 112 113 /* The CO_COROUTINE flag is set for coroutine functions (defined with 114 ``async def`` keywords) */ 115 #define CO_COROUTINE 0x0080 116 #define CO_ITERABLE_COROUTINE 0x0100 117 #define CO_ASYNC_GENERATOR 0x0200 118 119 /* bpo-39562: These constant values are changed in Python 3.9 120 to prevent collision with compiler flags. CO_FUTURE_ and PyCF_ 121 constants must be kept unique. PyCF_ constants can use bits from 122 0x0100 to 0x10000. CO_FUTURE_ constants use bits starting at 0x20000. */ 123 #define CO_FUTURE_DIVISION 0x20000 124 #define CO_FUTURE_ABSOLUTE_IMPORT 0x40000 /* do absolute imports by default */ 125 #define CO_FUTURE_WITH_STATEMENT 0x80000 126 #define CO_FUTURE_PRINT_FUNCTION 0x100000 127 #define CO_FUTURE_UNICODE_LITERALS 0x200000 128 129 #define CO_FUTURE_BARRY_AS_BDFL 0x400000 130 #define CO_FUTURE_GENERATOR_STOP 0x800000 131 #define CO_FUTURE_ANNOTATIONS 0x1000000 132 133 /* This should be defined if a future statement modifies the syntax. 134 For example, when a keyword is added. 135 */ 136 #define PY_PARSER_REQUIRES_FUTURE_KEYWORD 137 138 #define CO_MAXBLOCKS 20 /* Max static block nesting within a function */ 139 140 PyAPI_DATA(PyTypeObject) PyCode_Type; 141 142 #define PyCode_Check(op) Py_IS_TYPE(op, &PyCode_Type) 143 #define PyCode_GetNumFree(op) ((op)->co_nfreevars) 144 #define _PyCode_CODE(CO) ((_Py_CODEUNIT *)(CO)->co_code_adaptive) 145 #define _PyCode_NBYTES(CO) (Py_SIZE(CO) * (Py_ssize_t)sizeof(_Py_CODEUNIT)) 146 147 /* Public interface */ 148 PyAPI_FUNC(PyCodeObject *) PyCode_New( 149 int, int, int, int, int, PyObject *, PyObject *, 150 PyObject *, PyObject *, PyObject *, PyObject *, 151 PyObject *, PyObject *, PyObject *, int, PyObject *, 152 PyObject *); 153 154 PyAPI_FUNC(PyCodeObject *) PyCode_NewWithPosOnlyArgs( 155 int, int, int, int, int, int, PyObject *, PyObject *, 156 PyObject *, PyObject *, PyObject *, PyObject *, 157 PyObject *, PyObject *, PyObject *, int, PyObject *, 158 PyObject *); 159 /* same as struct above */ 160 161 /* Creates a new empty code object with the specified source location. */ 162 PyAPI_FUNC(PyCodeObject *) 163 PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno); 164 165 /* Return the line number associated with the specified bytecode index 166 in this code object. If you just need the line number of a frame, 167 use PyFrame_GetLineNumber() instead. */ 168 PyAPI_FUNC(int) PyCode_Addr2Line(PyCodeObject *, int); 169 170 PyAPI_FUNC(int) PyCode_Addr2Location(PyCodeObject *, int, int *, int *, int *, int *); 171 172 /* for internal use only */ 173 struct _opaque { 174 int computed_line; 175 const uint8_t *lo_next; 176 const uint8_t *limit; 177 }; 178 179 typedef struct _line_offsets { 180 int ar_start; 181 int ar_end; 182 int ar_line; 183 struct _opaque opaque; 184 } PyCodeAddressRange; 185 186 /* Update *bounds to describe the first and one-past-the-last instructions in the 187 same line as lasti. Return the number of that line. 188 */ 189 PyAPI_FUNC(int) _PyCode_CheckLineNumber(int lasti, PyCodeAddressRange *bounds); 190 191 /* Create a comparable key used to compare constants taking in account the 192 * object type. It is used to make sure types are not coerced (e.g., float and 193 * complex) _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms 194 * 195 * Return (type(obj), obj, ...): a tuple with variable size (at least 2 items) 196 * depending on the type and the value. The type is the first item to not 197 * compare bytes and str which can raise a BytesWarning exception. */ 198 PyAPI_FUNC(PyObject*) _PyCode_ConstantKey(PyObject *obj); 199 200 PyAPI_FUNC(PyObject*) PyCode_Optimize(PyObject *code, PyObject* consts, 201 PyObject *names, PyObject *lnotab); 202 203 204 PyAPI_FUNC(int) _PyCode_GetExtra(PyObject *code, Py_ssize_t index, 205 void **extra); 206 PyAPI_FUNC(int) _PyCode_SetExtra(PyObject *code, Py_ssize_t index, 207 void *extra); 208 209 /* Equivalent to getattr(code, 'co_code') in Python. 210 Returns a strong reference to a bytes object. */ 211 PyAPI_FUNC(PyObject *) PyCode_GetCode(PyCodeObject *code); 212 /* Equivalent to getattr(code, 'co_varnames') in Python. */ 213 PyAPI_FUNC(PyObject *) PyCode_GetVarnames(PyCodeObject *code); 214 /* Equivalent to getattr(code, 'co_cellvars') in Python. */ 215 PyAPI_FUNC(PyObject *) PyCode_GetCellvars(PyCodeObject *code); 216 /* Equivalent to getattr(code, 'co_freevars') in Python. */ 217 PyAPI_FUNC(PyObject *) PyCode_GetFreevars(PyCodeObject *code); 218 219 typedef enum _PyCodeLocationInfoKind { 220 /* short forms are 0 to 9 */ 221 PY_CODE_LOCATION_INFO_SHORT0 = 0, 222 /* one lineforms are 10 to 12 */ 223 PY_CODE_LOCATION_INFO_ONE_LINE0 = 10, 224 PY_CODE_LOCATION_INFO_ONE_LINE1 = 11, 225 PY_CODE_LOCATION_INFO_ONE_LINE2 = 12, 226 227 PY_CODE_LOCATION_INFO_NO_COLUMNS = 13, 228 PY_CODE_LOCATION_INFO_LONG = 14, 229 PY_CODE_LOCATION_INFO_NONE = 15 230 } _PyCodeLocationInfoKind; 231 232 #ifdef __cplusplus 233 } 234 #endif 235 #endif // !Py_CODE_H 236 #endif // !Py_LIMITED_API 237