xref: /third_party/python/Include/cpython/code.h (revision 7db96d56)
17db96d56Sopenharmony_ci/* Definitions for bytecode */
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci#ifndef Py_LIMITED_API
47db96d56Sopenharmony_ci#ifndef Py_CODE_H
57db96d56Sopenharmony_ci#define Py_CODE_H
67db96d56Sopenharmony_ci#ifdef __cplusplus
77db96d56Sopenharmony_ciextern "C" {
87db96d56Sopenharmony_ci#endif
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci/* Each instruction in a code object is a fixed-width value,
117db96d56Sopenharmony_ci * currently 2 bytes: 1-byte opcode + 1-byte oparg.  The EXTENDED_ARG
127db96d56Sopenharmony_ci * opcode allows for larger values but the current limit is 3 uses
137db96d56Sopenharmony_ci * of EXTENDED_ARG (see Python/compile.c), for a maximum
147db96d56Sopenharmony_ci * 32-bit value.  This aligns with the note in Python/compile.c
157db96d56Sopenharmony_ci * (compiler_addop_i_line) indicating that the max oparg value is
167db96d56Sopenharmony_ci * 2**32 - 1, rather than INT_MAX.
177db96d56Sopenharmony_ci */
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_citypedef uint16_t _Py_CODEUNIT;
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci#ifdef WORDS_BIGENDIAN
227db96d56Sopenharmony_ci#  define _Py_OPCODE(word) ((word) >> 8)
237db96d56Sopenharmony_ci#  define _Py_OPARG(word) ((word) & 255)
247db96d56Sopenharmony_ci#  define _Py_MAKECODEUNIT(opcode, oparg) (((opcode)<<8)|(oparg))
257db96d56Sopenharmony_ci#else
267db96d56Sopenharmony_ci#  define _Py_OPCODE(word) ((word) & 255)
277db96d56Sopenharmony_ci#  define _Py_OPARG(word) ((word) >> 8)
287db96d56Sopenharmony_ci#  define _Py_MAKECODEUNIT(opcode, oparg) ((opcode)|((oparg)<<8))
297db96d56Sopenharmony_ci#endif
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ci// Use "unsigned char" instead of "uint8_t" here to avoid illegal aliasing:
327db96d56Sopenharmony_ci#define _Py_SET_OPCODE(word, opcode) (((unsigned char *)&(word))[0] = (opcode))
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ci// To avoid repeating ourselves in deepfreeze.py, all PyCodeObject members are
357db96d56Sopenharmony_ci// defined in this macro:
367db96d56Sopenharmony_ci#define _PyCode_DEF(SIZE) {                                                    \
377db96d56Sopenharmony_ci    PyObject_VAR_HEAD                                                          \
387db96d56Sopenharmony_ci                                                                               \
397db96d56Sopenharmony_ci    /* Note only the following fields are used in hash and/or comparisons      \
407db96d56Sopenharmony_ci     *                                                                         \
417db96d56Sopenharmony_ci     * - co_name                                                               \
427db96d56Sopenharmony_ci     * - co_argcount                                                           \
437db96d56Sopenharmony_ci     * - co_posonlyargcount                                                    \
447db96d56Sopenharmony_ci     * - co_kwonlyargcount                                                     \
457db96d56Sopenharmony_ci     * - co_nlocals                                                            \
467db96d56Sopenharmony_ci     * - co_stacksize                                                          \
477db96d56Sopenharmony_ci     * - co_flags                                                              \
487db96d56Sopenharmony_ci     * - co_firstlineno                                                        \
497db96d56Sopenharmony_ci     * - co_consts                                                             \
507db96d56Sopenharmony_ci     * - co_names                                                              \
517db96d56Sopenharmony_ci     * - co_localsplusnames                                                    \
527db96d56Sopenharmony_ci     * This is done to preserve the name and line number for tracebacks        \
537db96d56Sopenharmony_ci     * and debuggers; otherwise, constant de-duplication would collapse        \
547db96d56Sopenharmony_ci     * identical functions/lambdas defined on different lines.                 \
557db96d56Sopenharmony_ci     */                                                                        \
567db96d56Sopenharmony_ci                                                                               \
577db96d56Sopenharmony_ci    /* These fields are set with provided values on new code objects. */       \
587db96d56Sopenharmony_ci                                                                               \
597db96d56Sopenharmony_ci    /* The hottest fields (in the eval loop) are grouped here at the top. */   \
607db96d56Sopenharmony_ci    PyObject *co_consts;           /* list (constants used) */                 \
617db96d56Sopenharmony_ci    PyObject *co_names;            /* list of strings (names used) */          \
627db96d56Sopenharmony_ci    PyObject *co_exceptiontable;   /* Byte string encoding exception handling  \
637db96d56Sopenharmony_ci                                      table */                                 \
647db96d56Sopenharmony_ci    int co_flags;                  /* CO_..., see below */                     \
657db96d56Sopenharmony_ci    short co_warmup;                 /* Warmup counter for quickening */       \
667db96d56Sopenharmony_ci    short _co_linearray_entry_size;  /* Size of each entry in _co_linearray */ \
677db96d56Sopenharmony_ci                                                                               \
687db96d56Sopenharmony_ci    /* The rest are not so impactful on performance. */                        \
697db96d56Sopenharmony_ci    int co_argcount;              /* #arguments, except *args */               \
707db96d56Sopenharmony_ci    int co_posonlyargcount;       /* #positional only arguments */             \
717db96d56Sopenharmony_ci    int co_kwonlyargcount;        /* #keyword only arguments */                \
727db96d56Sopenharmony_ci    int co_stacksize;             /* #entries needed for evaluation stack */   \
737db96d56Sopenharmony_ci    int co_firstlineno;           /* first source line number */               \
747db96d56Sopenharmony_ci                                                                               \
757db96d56Sopenharmony_ci    /* redundant values (derived from co_localsplusnames and                   \
767db96d56Sopenharmony_ci       co_localspluskinds) */                                                  \
777db96d56Sopenharmony_ci    int co_nlocalsplus;           /* number of local + cell + free variables   \
787db96d56Sopenharmony_ci                                  */                                           \
797db96d56Sopenharmony_ci    int co_nlocals;               /* number of local variables */              \
807db96d56Sopenharmony_ci    int co_nplaincellvars;        /* number of non-arg cell variables */       \
817db96d56Sopenharmony_ci    int co_ncellvars;             /* total number of cell variables */         \
827db96d56Sopenharmony_ci    int co_nfreevars;             /* number of free variables */               \
837db96d56Sopenharmony_ci                                                                               \
847db96d56Sopenharmony_ci    PyObject *co_localsplusnames; /* tuple mapping offsets to names */         \
857db96d56Sopenharmony_ci    PyObject *co_localspluskinds; /* Bytes mapping to local kinds (one byte    \
867db96d56Sopenharmony_ci                                     per variable) */                          \
877db96d56Sopenharmony_ci    PyObject *co_filename;        /* unicode (where it was loaded from) */     \
887db96d56Sopenharmony_ci    PyObject *co_name;            /* unicode (name, for reference) */          \
897db96d56Sopenharmony_ci    PyObject *co_qualname;        /* unicode (qualname, for reference) */      \
907db96d56Sopenharmony_ci    PyObject *co_linetable;       /* bytes object that holds location info */  \
917db96d56Sopenharmony_ci    PyObject *co_weakreflist;     /* to support weakrefs to code objects */    \
927db96d56Sopenharmony_ci    PyObject *_co_code;           /* cached co_code object/attribute */        \
937db96d56Sopenharmony_ci    char *_co_linearray;          /* array of line offsets */                  \
947db96d56Sopenharmony_ci    int _co_firsttraceable;       /* index of first traceable instruction */   \
957db96d56Sopenharmony_ci    /* Scratch space for extra data relating to the code object.               \
967db96d56Sopenharmony_ci       Type is a void* to keep the format private in codeobject.c to force     \
977db96d56Sopenharmony_ci       people to go through the proper APIs. */                                \
987db96d56Sopenharmony_ci    void *co_extra;                                                            \
997db96d56Sopenharmony_ci    char co_code_adaptive[(SIZE)];                                             \
1007db96d56Sopenharmony_ci}
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci/* Bytecode object */
1037db96d56Sopenharmony_cistruct PyCodeObject _PyCode_DEF(1);
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci/* Masks for co_flags above */
1067db96d56Sopenharmony_ci#define CO_OPTIMIZED    0x0001
1077db96d56Sopenharmony_ci#define CO_NEWLOCALS    0x0002
1087db96d56Sopenharmony_ci#define CO_VARARGS      0x0004
1097db96d56Sopenharmony_ci#define CO_VARKEYWORDS  0x0008
1107db96d56Sopenharmony_ci#define CO_NESTED       0x0010
1117db96d56Sopenharmony_ci#define CO_GENERATOR    0x0020
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci/* The CO_COROUTINE flag is set for coroutine functions (defined with
1147db96d56Sopenharmony_ci   ``async def`` keywords) */
1157db96d56Sopenharmony_ci#define CO_COROUTINE            0x0080
1167db96d56Sopenharmony_ci#define CO_ITERABLE_COROUTINE   0x0100
1177db96d56Sopenharmony_ci#define CO_ASYNC_GENERATOR      0x0200
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci/* bpo-39562: These constant values are changed in Python 3.9
1207db96d56Sopenharmony_ci   to prevent collision with compiler flags. CO_FUTURE_ and PyCF_
1217db96d56Sopenharmony_ci   constants must be kept unique. PyCF_ constants can use bits from
1227db96d56Sopenharmony_ci   0x0100 to 0x10000. CO_FUTURE_ constants use bits starting at 0x20000. */
1237db96d56Sopenharmony_ci#define CO_FUTURE_DIVISION      0x20000
1247db96d56Sopenharmony_ci#define CO_FUTURE_ABSOLUTE_IMPORT 0x40000 /* do absolute imports by default */
1257db96d56Sopenharmony_ci#define CO_FUTURE_WITH_STATEMENT  0x80000
1267db96d56Sopenharmony_ci#define CO_FUTURE_PRINT_FUNCTION  0x100000
1277db96d56Sopenharmony_ci#define CO_FUTURE_UNICODE_LITERALS 0x200000
1287db96d56Sopenharmony_ci
1297db96d56Sopenharmony_ci#define CO_FUTURE_BARRY_AS_BDFL  0x400000
1307db96d56Sopenharmony_ci#define CO_FUTURE_GENERATOR_STOP  0x800000
1317db96d56Sopenharmony_ci#define CO_FUTURE_ANNOTATIONS    0x1000000
1327db96d56Sopenharmony_ci
1337db96d56Sopenharmony_ci/* This should be defined if a future statement modifies the syntax.
1347db96d56Sopenharmony_ci   For example, when a keyword is added.
1357db96d56Sopenharmony_ci*/
1367db96d56Sopenharmony_ci#define PY_PARSER_REQUIRES_FUTURE_KEYWORD
1377db96d56Sopenharmony_ci
1387db96d56Sopenharmony_ci#define CO_MAXBLOCKS 20 /* Max static block nesting within a function */
1397db96d56Sopenharmony_ci
1407db96d56Sopenharmony_ciPyAPI_DATA(PyTypeObject) PyCode_Type;
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ci#define PyCode_Check(op) Py_IS_TYPE(op, &PyCode_Type)
1437db96d56Sopenharmony_ci#define PyCode_GetNumFree(op) ((op)->co_nfreevars)
1447db96d56Sopenharmony_ci#define _PyCode_CODE(CO) ((_Py_CODEUNIT *)(CO)->co_code_adaptive)
1457db96d56Sopenharmony_ci#define _PyCode_NBYTES(CO) (Py_SIZE(CO) * (Py_ssize_t)sizeof(_Py_CODEUNIT))
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ci/* Public interface */
1487db96d56Sopenharmony_ciPyAPI_FUNC(PyCodeObject *) PyCode_New(
1497db96d56Sopenharmony_ci        int, int, int, int, int, PyObject *, PyObject *,
1507db96d56Sopenharmony_ci        PyObject *, PyObject *, PyObject *, PyObject *,
1517db96d56Sopenharmony_ci        PyObject *, PyObject *, PyObject *, int, PyObject *,
1527db96d56Sopenharmony_ci        PyObject *);
1537db96d56Sopenharmony_ci
1547db96d56Sopenharmony_ciPyAPI_FUNC(PyCodeObject *) PyCode_NewWithPosOnlyArgs(
1557db96d56Sopenharmony_ci        int, int, int, int, int, int, PyObject *, PyObject *,
1567db96d56Sopenharmony_ci        PyObject *, PyObject *, PyObject *, PyObject *,
1577db96d56Sopenharmony_ci        PyObject *, PyObject *, PyObject *, int, PyObject *,
1587db96d56Sopenharmony_ci        PyObject *);
1597db96d56Sopenharmony_ci        /* same as struct above */
1607db96d56Sopenharmony_ci
1617db96d56Sopenharmony_ci/* Creates a new empty code object with the specified source location. */
1627db96d56Sopenharmony_ciPyAPI_FUNC(PyCodeObject *)
1637db96d56Sopenharmony_ciPyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno);
1647db96d56Sopenharmony_ci
1657db96d56Sopenharmony_ci/* Return the line number associated with the specified bytecode index
1667db96d56Sopenharmony_ci   in this code object.  If you just need the line number of a frame,
1677db96d56Sopenharmony_ci   use PyFrame_GetLineNumber() instead. */
1687db96d56Sopenharmony_ciPyAPI_FUNC(int) PyCode_Addr2Line(PyCodeObject *, int);
1697db96d56Sopenharmony_ci
1707db96d56Sopenharmony_ciPyAPI_FUNC(int) PyCode_Addr2Location(PyCodeObject *, int, int *, int *, int *, int *);
1717db96d56Sopenharmony_ci
1727db96d56Sopenharmony_ci/* for internal use only */
1737db96d56Sopenharmony_cistruct _opaque {
1747db96d56Sopenharmony_ci    int computed_line;
1757db96d56Sopenharmony_ci    const uint8_t *lo_next;
1767db96d56Sopenharmony_ci    const uint8_t *limit;
1777db96d56Sopenharmony_ci};
1787db96d56Sopenharmony_ci
1797db96d56Sopenharmony_citypedef struct _line_offsets {
1807db96d56Sopenharmony_ci    int ar_start;
1817db96d56Sopenharmony_ci    int ar_end;
1827db96d56Sopenharmony_ci    int ar_line;
1837db96d56Sopenharmony_ci    struct _opaque opaque;
1847db96d56Sopenharmony_ci} PyCodeAddressRange;
1857db96d56Sopenharmony_ci
1867db96d56Sopenharmony_ci/* Update *bounds to describe the first and one-past-the-last instructions in the
1877db96d56Sopenharmony_ci   same line as lasti.  Return the number of that line.
1887db96d56Sopenharmony_ci*/
1897db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyCode_CheckLineNumber(int lasti, PyCodeAddressRange *bounds);
1907db96d56Sopenharmony_ci
1917db96d56Sopenharmony_ci/* Create a comparable key used to compare constants taking in account the
1927db96d56Sopenharmony_ci * object type. It is used to make sure types are not coerced (e.g., float and
1937db96d56Sopenharmony_ci * complex) _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms
1947db96d56Sopenharmony_ci *
1957db96d56Sopenharmony_ci * Return (type(obj), obj, ...): a tuple with variable size (at least 2 items)
1967db96d56Sopenharmony_ci * depending on the type and the value. The type is the first item to not
1977db96d56Sopenharmony_ci * compare bytes and str which can raise a BytesWarning exception. */
1987db96d56Sopenharmony_ciPyAPI_FUNC(PyObject*) _PyCode_ConstantKey(PyObject *obj);
1997db96d56Sopenharmony_ci
2007db96d56Sopenharmony_ciPyAPI_FUNC(PyObject*) PyCode_Optimize(PyObject *code, PyObject* consts,
2017db96d56Sopenharmony_ci                                      PyObject *names, PyObject *lnotab);
2027db96d56Sopenharmony_ci
2037db96d56Sopenharmony_ci
2047db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyCode_GetExtra(PyObject *code, Py_ssize_t index,
2057db96d56Sopenharmony_ci                                 void **extra);
2067db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyCode_SetExtra(PyObject *code, Py_ssize_t index,
2077db96d56Sopenharmony_ci                                 void *extra);
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ci/* Equivalent to getattr(code, 'co_code') in Python.
2107db96d56Sopenharmony_ci   Returns a strong reference to a bytes object. */
2117db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyCode_GetCode(PyCodeObject *code);
2127db96d56Sopenharmony_ci/* Equivalent to getattr(code, 'co_varnames') in Python. */
2137db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyCode_GetVarnames(PyCodeObject *code);
2147db96d56Sopenharmony_ci/* Equivalent to getattr(code, 'co_cellvars') in Python. */
2157db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyCode_GetCellvars(PyCodeObject *code);
2167db96d56Sopenharmony_ci/* Equivalent to getattr(code, 'co_freevars') in Python. */
2177db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyCode_GetFreevars(PyCodeObject *code);
2187db96d56Sopenharmony_ci
2197db96d56Sopenharmony_citypedef enum _PyCodeLocationInfoKind {
2207db96d56Sopenharmony_ci    /* short forms are 0 to 9 */
2217db96d56Sopenharmony_ci    PY_CODE_LOCATION_INFO_SHORT0 = 0,
2227db96d56Sopenharmony_ci    /* one lineforms are 10 to 12 */
2237db96d56Sopenharmony_ci    PY_CODE_LOCATION_INFO_ONE_LINE0 = 10,
2247db96d56Sopenharmony_ci    PY_CODE_LOCATION_INFO_ONE_LINE1 = 11,
2257db96d56Sopenharmony_ci    PY_CODE_LOCATION_INFO_ONE_LINE2 = 12,
2267db96d56Sopenharmony_ci
2277db96d56Sopenharmony_ci    PY_CODE_LOCATION_INFO_NO_COLUMNS = 13,
2287db96d56Sopenharmony_ci    PY_CODE_LOCATION_INFO_LONG = 14,
2297db96d56Sopenharmony_ci    PY_CODE_LOCATION_INFO_NONE = 15
2307db96d56Sopenharmony_ci} _PyCodeLocationInfoKind;
2317db96d56Sopenharmony_ci
2327db96d56Sopenharmony_ci#ifdef __cplusplus
2337db96d56Sopenharmony_ci}
2347db96d56Sopenharmony_ci#endif
2357db96d56Sopenharmony_ci#endif  // !Py_CODE_H
2367db96d56Sopenharmony_ci#endif  // !Py_LIMITED_API
237