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