(root)/
Python-3.11.7/
Include/
cpython/
code.h
       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  /* Each instruction in a code object is a fixed-width value,
      11   * currently 2 bytes: 1-byte opcode + 1-byte oparg.  The EXTENDED_ARG
      12   * opcode allows for larger values but the current limit is 3 uses
      13   * of EXTENDED_ARG (see Python/compile.c), for a maximum
      14   * 32-bit value.  This aligns with the note in Python/compile.c
      15   * (compiler_addop_i_line) indicating that the max oparg value is
      16   * 2**32 - 1, rather than INT_MAX.
      17   */
      18  
      19  typedef uint16_t _Py_CODEUNIT;
      20  
      21  #ifdef WORDS_BIGENDIAN
      22  #  define _Py_OPCODE(word) ((word) >> 8)
      23  #  define _Py_OPARG(word) ((word) & 255)
      24  #  define _Py_MAKECODEUNIT(opcode, oparg) (((opcode)<<8)|(oparg))
      25  #else
      26  #  define _Py_OPCODE(word) ((word) & 255)
      27  #  define _Py_OPARG(word) ((word) >> 8)
      28  #  define _Py_MAKECODEUNIT(opcode, oparg) ((opcode)|((oparg)<<8))
      29  #endif
      30  
      31  // Use "unsigned char" instead of "uint8_t" here to avoid illegal aliasing:
      32  #define _Py_SET_OPCODE(word, opcode) (((unsigned char *)&(word))[0] = (opcode))
      33  
      34  // To avoid repeating ourselves in deepfreeze.py, all PyCodeObject members are
      35  // defined in this macro:
      36  #define _PyCode_DEF(SIZE) {                                                    \
      37      PyObject_VAR_HEAD                                                          \
      38                                                                                 \
      39      /* Note only the following fields are used in hash and/or comparisons      \
      40       *                                                                         \
      41       * - co_name                                                               \
      42       * - co_argcount                                                           \
      43       * - co_posonlyargcount                                                    \
      44       * - co_kwonlyargcount                                                     \
      45       * - co_nlocals                                                            \
      46       * - co_stacksize                                                          \
      47       * - co_flags                                                              \
      48       * - co_firstlineno                                                        \
      49       * - co_consts                                                             \
      50       * - co_names                                                              \
      51       * - co_localsplusnames                                                    \
      52       * This is done to preserve the name and line number for tracebacks        \
      53       * and debuggers; otherwise, constant de-duplication would collapse        \
      54       * identical functions/lambdas defined on different lines.                 \
      55       */                                                                        \
      56                                                                                 \
      57      /* These fields are set with provided values on new code objects. */       \
      58                                                                                 \
      59      /* The hottest fields (in the eval loop) are grouped here at the top. */   \
      60      PyObject *co_consts;           /* list (constants used) */                 \
      61      PyObject *co_names;            /* list of strings (names used) */          \
      62      PyObject *co_exceptiontable;   /* Byte string encoding exception handling  \
      63                                        table */                                 \
      64      int co_flags;                  /* CO_..., see below */                     \
      65      short co_warmup;                 /* Warmup counter for quickening */       \
      66      short _co_linearray_entry_size;  /* Size of each entry in _co_linearray */ \
      67                                                                                 \
      68      /* The rest are not so impactful on performance. */                        \
      69      int co_argcount;              /* #arguments, except *args */               \
      70      int co_posonlyargcount;       /* #positional only arguments */             \
      71      int co_kwonlyargcount;        /* #keyword only arguments */                \
      72      int co_stacksize;             /* #entries needed for evaluation stack */   \
      73      int co_firstlineno;           /* first source line number */               \
      74                                                                                 \
      75      /* redundant values (derived from co_localsplusnames and                   \
      76         co_localspluskinds) */                                                  \
      77      int co_nlocalsplus;           /* number of local + cell + free variables   \
      78                                    */                                           \
      79      int co_nlocals;               /* number of local variables */              \
      80      int co_nplaincellvars;        /* number of non-arg cell variables */       \
      81      int co_ncellvars;             /* total number of cell variables */         \
      82      int co_nfreevars;             /* number of free variables */               \
      83                                                                                 \
      84      PyObject *co_localsplusnames; /* tuple mapping offsets to names */         \
      85      PyObject *co_localspluskinds; /* Bytes mapping to local kinds (one byte    \
      86                                       per variable) */                          \
      87      PyObject *co_filename;        /* unicode (where it was loaded from) */     \
      88      PyObject *co_name;            /* unicode (name, for reference) */          \
      89      PyObject *co_qualname;        /* unicode (qualname, for reference) */      \
      90      PyObject *co_linetable;       /* bytes object that holds location info */  \
      91      PyObject *co_weakreflist;     /* to support weakrefs to code objects */    \
      92      PyObject *_co_code;           /* cached co_code object/attribute */        \
      93      char *_co_linearray;          /* array of line offsets */                  \
      94      int _co_firsttraceable;       /* index of first traceable instruction */   \
      95      /* Scratch space for extra data relating to the code object.               \
      96         Type is a void* to keep the format private in codeobject.c to force     \
      97         people to go through the proper APIs. */                                \
      98      void *co_extra;                                                            \
      99      char co_code_adaptive[(SIZE)];                                             \
     100  }
     101  
     102  /* Bytecode object */
     103  struct PyCodeObject _PyCode_DEF(1);
     104  
     105  /* Masks for co_flags above */
     106  #define CO_OPTIMIZED    0x0001
     107  #define CO_NEWLOCALS    0x0002
     108  #define CO_VARARGS      0x0004
     109  #define CO_VARKEYWORDS  0x0008
     110  #define CO_NESTED       0x0010
     111  #define CO_GENERATOR    0x0020
     112  
     113  /* The CO_COROUTINE flag is set for coroutine functions (defined with
     114     ``async def`` keywords) */
     115  #define CO_COROUTINE            0x0080
     116  #define CO_ITERABLE_COROUTINE   0x0100
     117  #define CO_ASYNC_GENERATOR      0x0200
     118  
     119  /* bpo-39562: These constant values are changed in Python 3.9
     120     to prevent collision with compiler flags. CO_FUTURE_ and PyCF_
     121     constants must be kept unique. PyCF_ constants can use bits from
     122     0x0100 to 0x10000. CO_FUTURE_ constants use bits starting at 0x20000. */
     123  #define CO_FUTURE_DIVISION      0x20000
     124  #define CO_FUTURE_ABSOLUTE_IMPORT 0x40000 /* do absolute imports by default */
     125  #define CO_FUTURE_WITH_STATEMENT  0x80000
     126  #define CO_FUTURE_PRINT_FUNCTION  0x100000
     127  #define CO_FUTURE_UNICODE_LITERALS 0x200000
     128  
     129  #define CO_FUTURE_BARRY_AS_BDFL  0x400000
     130  #define CO_FUTURE_GENERATOR_STOP  0x800000
     131  #define CO_FUTURE_ANNOTATIONS    0x1000000
     132  
     133  /* This should be defined if a future statement modifies the syntax.
     134     For example, when a keyword is added.
     135  */
     136  #define PY_PARSER_REQUIRES_FUTURE_KEYWORD
     137  
     138  #define CO_MAXBLOCKS 20 /* Max static block nesting within a function */
     139  
     140  PyAPI_DATA(PyTypeObject) PyCode_Type;
     141  
     142  #define PyCode_Check(op) Py_IS_TYPE(op, &PyCode_Type)
     143  #define PyCode_GetNumFree(op) ((op)->co_nfreevars)
     144  #define _PyCode_CODE(CO) ((_Py_CODEUNIT *)(CO)->co_code_adaptive)
     145  #define _PyCode_NBYTES(CO) (Py_SIZE(CO) * (Py_ssize_t)sizeof(_Py_CODEUNIT))
     146  
     147  /* Public interface */
     148  PyAPI_FUNC(PyCodeObject *) PyCode_New(
     149          int, int, int, int, int, PyObject *, PyObject *,
     150          PyObject *, PyObject *, PyObject *, PyObject *,
     151          PyObject *, PyObject *, PyObject *, int, PyObject *,
     152          PyObject *);
     153  
     154  PyAPI_FUNC(PyCodeObject *) PyCode_NewWithPosOnlyArgs(
     155          int, int, int, int, int, int, PyObject *, PyObject *,
     156          PyObject *, PyObject *, PyObject *, PyObject *,
     157          PyObject *, PyObject *, PyObject *, int, PyObject *,
     158          PyObject *);
     159          /* same as struct above */
     160  
     161  /* Creates a new empty code object with the specified source location. */
     162  PyAPI_FUNC(PyCodeObject *)
     163  PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno);
     164  
     165  /* Return the line number associated with the specified bytecode index
     166     in this code object.  If you just need the line number of a frame,
     167     use PyFrame_GetLineNumber() instead. */
     168  PyAPI_FUNC(int) PyCode_Addr2Line(PyCodeObject *, int);
     169  
     170  PyAPI_FUNC(int) PyCode_Addr2Location(PyCodeObject *, int, int *, int *, int *, int *);
     171  
     172  /* for internal use only */
     173  struct _opaque {
     174      int computed_line;
     175      const uint8_t *lo_next;
     176      const uint8_t *limit;
     177  };
     178  
     179  typedef struct _line_offsets {
     180      int ar_start;
     181      int ar_end;
     182      int ar_line;
     183      struct _opaque opaque;
     184  } PyCodeAddressRange;
     185  
     186  /* Update *bounds to describe the first and one-past-the-last instructions in the
     187     same line as lasti.  Return the number of that line.
     188  */
     189  PyAPI_FUNC(int) _PyCode_CheckLineNumber(int lasti, PyCodeAddressRange *bounds);
     190  
     191  /* Create a comparable key used to compare constants taking in account the
     192   * object type. It is used to make sure types are not coerced (e.g., float and
     193   * complex) _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms
     194   *
     195   * Return (type(obj), obj, ...): a tuple with variable size (at least 2 items)
     196   * depending on the type and the value. The type is the first item to not
     197   * compare bytes and str which can raise a BytesWarning exception. */
     198  PyAPI_FUNC(PyObject*) _PyCode_ConstantKey(PyObject *obj);
     199  
     200  PyAPI_FUNC(PyObject*) PyCode_Optimize(PyObject *code, PyObject* consts,
     201                                        PyObject *names, PyObject *lnotab);
     202  
     203  
     204  PyAPI_FUNC(int) _PyCode_GetExtra(PyObject *code, Py_ssize_t index,
     205                                   void **extra);
     206  PyAPI_FUNC(int) _PyCode_SetExtra(PyObject *code, Py_ssize_t index,
     207                                   void *extra);
     208  
     209  /* Equivalent to getattr(code, 'co_code') in Python.
     210     Returns a strong reference to a bytes object. */
     211  PyAPI_FUNC(PyObject *) PyCode_GetCode(PyCodeObject *code);
     212  /* Equivalent to getattr(code, 'co_varnames') in Python. */
     213  PyAPI_FUNC(PyObject *) PyCode_GetVarnames(PyCodeObject *code);
     214  /* Equivalent to getattr(code, 'co_cellvars') in Python. */
     215  PyAPI_FUNC(PyObject *) PyCode_GetCellvars(PyCodeObject *code);
     216  /* Equivalent to getattr(code, 'co_freevars') in Python. */
     217  PyAPI_FUNC(PyObject *) PyCode_GetFreevars(PyCodeObject *code);
     218  
     219  typedef enum _PyCodeLocationInfoKind {
     220      /* short forms are 0 to 9 */
     221      PY_CODE_LOCATION_INFO_SHORT0 = 0,
     222      /* one lineforms are 10 to 12 */
     223      PY_CODE_LOCATION_INFO_ONE_LINE0 = 10,
     224      PY_CODE_LOCATION_INFO_ONE_LINE1 = 11,
     225      PY_CODE_LOCATION_INFO_ONE_LINE2 = 12,
     226  
     227      PY_CODE_LOCATION_INFO_NO_COLUMNS = 13,
     228      PY_CODE_LOCATION_INFO_LONG = 14,
     229      PY_CODE_LOCATION_INFO_NONE = 15
     230  } _PyCodeLocationInfoKind;
     231  
     232  #ifdef __cplusplus
     233  }
     234  #endif
     235  #endif  // !Py_CODE_H
     236  #endif  // !Py_LIMITED_API