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