comparison CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/include/python3.8/code.h @ 69:33d812a61356

planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author jpayne
date Tue, 18 Mar 2025 17:55:14 -0400
parents
children
comparison
equal deleted inserted replaced
67:0e9998148a16 69:33d812a61356
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 typedef uint16_t _Py_CODEUNIT;
11
12 #ifdef WORDS_BIGENDIAN
13 # define _Py_OPCODE(word) ((word) >> 8)
14 # define _Py_OPARG(word) ((word) & 255)
15 #else
16 # define _Py_OPCODE(word) ((word) & 255)
17 # define _Py_OPARG(word) ((word) >> 8)
18 #endif
19
20 typedef struct _PyOpcache _PyOpcache;
21
22 /* Bytecode object */
23 typedef struct {
24 PyObject_HEAD
25 int co_argcount; /* #arguments, except *args */
26 int co_posonlyargcount; /* #positional only arguments */
27 int co_kwonlyargcount; /* #keyword only arguments */
28 int co_nlocals; /* #local variables */
29 int co_stacksize; /* #entries needed for evaluation stack */
30 int co_flags; /* CO_..., see below */
31 int co_firstlineno; /* first source line number */
32 PyObject *co_code; /* instruction opcodes */
33 PyObject *co_consts; /* list (constants used) */
34 PyObject *co_names; /* list of strings (names used) */
35 PyObject *co_varnames; /* tuple of strings (local variable names) */
36 PyObject *co_freevars; /* tuple of strings (free variable names) */
37 PyObject *co_cellvars; /* tuple of strings (cell variable names) */
38 /* The rest aren't used in either hash or comparisons, except for co_name,
39 used in both. This is done to preserve the name and line number
40 for tracebacks and debuggers; otherwise, constant de-duplication
41 would collapse identical functions/lambdas defined on different lines.
42 */
43 Py_ssize_t *co_cell2arg; /* Maps cell vars which are arguments. */
44 PyObject *co_filename; /* unicode (where it was loaded from) */
45 PyObject *co_name; /* unicode (name, for reference) */
46 PyObject *co_lnotab; /* string (encoding addr<->lineno mapping) See
47 Objects/lnotab_notes.txt for details. */
48 void *co_zombieframe; /* for optimization only (see frameobject.c) */
49 PyObject *co_weakreflist; /* to support weakrefs to code objects */
50 /* Scratch space for extra data relating to the code object.
51 Type is a void* to keep the format private in codeobject.c to force
52 people to go through the proper APIs. */
53 void *co_extra;
54
55 /* Per opcodes just-in-time cache
56 *
57 * To reduce cache size, we use indirect mapping from opcode index to
58 * cache object:
59 * cache = co_opcache[co_opcache_map[next_instr - first_instr] - 1]
60 */
61
62 // co_opcache_map is indexed by (next_instr - first_instr).
63 // * 0 means there is no cache for this opcode.
64 // * n > 0 means there is cache in co_opcache[n-1].
65 unsigned char *co_opcache_map;
66 _PyOpcache *co_opcache;
67 int co_opcache_flag; // used to determine when create a cache.
68 unsigned char co_opcache_size; // length of co_opcache.
69 } PyCodeObject;
70
71 /* Masks for co_flags above */
72 #define CO_OPTIMIZED 0x0001
73 #define CO_NEWLOCALS 0x0002
74 #define CO_VARARGS 0x0004
75 #define CO_VARKEYWORDS 0x0008
76 #define CO_NESTED 0x0010
77 #define CO_GENERATOR 0x0020
78 /* The CO_NOFREE flag is set if there are no free or cell variables.
79 This information is redundant, but it allows a single flag test
80 to determine whether there is any extra work to be done when the
81 call frame it setup.
82 */
83 #define CO_NOFREE 0x0040
84
85 /* The CO_COROUTINE flag is set for coroutine functions (defined with
86 ``async def`` keywords) */
87 #define CO_COROUTINE 0x0080
88 #define CO_ITERABLE_COROUTINE 0x0100
89 #define CO_ASYNC_GENERATOR 0x0200
90
91 /* These are no longer used. */
92 #if 0
93 #define CO_GENERATOR_ALLOWED 0x1000
94 #endif
95 #define CO_FUTURE_DIVISION 0x2000
96 #define CO_FUTURE_ABSOLUTE_IMPORT 0x4000 /* do absolute imports by default */
97 #define CO_FUTURE_WITH_STATEMENT 0x8000
98 #define CO_FUTURE_PRINT_FUNCTION 0x10000
99 #define CO_FUTURE_UNICODE_LITERALS 0x20000
100
101 #define CO_FUTURE_BARRY_AS_BDFL 0x40000
102 #define CO_FUTURE_GENERATOR_STOP 0x80000
103 #define CO_FUTURE_ANNOTATIONS 0x100000
104
105 /* This value is found in the co_cell2arg array when the associated cell
106 variable does not correspond to an argument. */
107 #define CO_CELL_NOT_AN_ARG (-1)
108
109 /* This should be defined if a future statement modifies the syntax.
110 For example, when a keyword is added.
111 */
112 #define PY_PARSER_REQUIRES_FUTURE_KEYWORD
113
114 #define CO_MAXBLOCKS 20 /* Max static block nesting within a function */
115
116 PyAPI_DATA(PyTypeObject) PyCode_Type;
117
118 #define PyCode_Check(op) (Py_TYPE(op) == &PyCode_Type)
119 #define PyCode_GetNumFree(op) (PyTuple_GET_SIZE((op)->co_freevars))
120
121 /* Public interface */
122 PyAPI_FUNC(PyCodeObject *) PyCode_New(
123 int, int, int, int, int, PyObject *, PyObject *,
124 PyObject *, PyObject *, PyObject *, PyObject *,
125 PyObject *, PyObject *, int, PyObject *);
126
127 PyAPI_FUNC(PyCodeObject *) PyCode_NewWithPosOnlyArgs(
128 int, int, int, int, int, int, PyObject *, PyObject *,
129 PyObject *, PyObject *, PyObject *, PyObject *,
130 PyObject *, PyObject *, int, PyObject *);
131 /* same as struct above */
132
133 /* Creates a new empty code object with the specified source location. */
134 PyAPI_FUNC(PyCodeObject *)
135 PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno);
136
137 /* Return the line number associated with the specified bytecode index
138 in this code object. If you just need the line number of a frame,
139 use PyFrame_GetLineNumber() instead. */
140 PyAPI_FUNC(int) PyCode_Addr2Line(PyCodeObject *, int);
141
142 /* for internal use only */
143 typedef struct _addr_pair {
144 int ap_lower;
145 int ap_upper;
146 } PyAddrPair;
147
148 #ifndef Py_LIMITED_API
149 /* Update *bounds to describe the first and one-past-the-last instructions in the
150 same line as lasti. Return the number of that line.
151 */
152 PyAPI_FUNC(int) _PyCode_CheckLineNumber(PyCodeObject* co,
153 int lasti, PyAddrPair *bounds);
154
155 /* Create a comparable key used to compare constants taking in account the
156 * object type. It is used to make sure types are not coerced (e.g., float and
157 * complex) _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms
158 *
159 * Return (type(obj), obj, ...): a tuple with variable size (at least 2 items)
160 * depending on the type and the value. The type is the first item to not
161 * compare bytes and str which can raise a BytesWarning exception. */
162 PyAPI_FUNC(PyObject*) _PyCode_ConstantKey(PyObject *obj);
163 #endif
164
165 PyAPI_FUNC(PyObject*) PyCode_Optimize(PyObject *code, PyObject* consts,
166 PyObject *names, PyObject *lnotab);
167
168
169 #ifndef Py_LIMITED_API
170 PyAPI_FUNC(int) _PyCode_GetExtra(PyObject *code, Py_ssize_t index,
171 void **extra);
172 PyAPI_FUNC(int) _PyCode_SetExtra(PyObject *code, Py_ssize_t index,
173 void *extra);
174 #endif
175
176 #ifdef __cplusplus
177 }
178 #endif
179 #endif /* !Py_CODE_H */
180 #endif /* Py_LIMITED_API */