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