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