| /* This files contains various key structs that are widely used | |
| * and do not depend on other headers. */ | |
| #ifndef Py_INTERNAL_STRUCTS_H | |
| #define Py_INTERNAL_STRUCTS_H | |
| #ifdef __cplusplus | |
| extern "C" { | |
| #endif | |
| #include <stdint.h> // uint16_t | |
| typedef struct { | |
| uint16_t value_and_backoff; | |
| } _Py_BackoffCounter; | |
| /* Each instruction in a code object is a fixed-width value, | |
| * currently 2 bytes: 1-byte opcode + 1-byte oparg. The EXTENDED_ARG | |
| * opcode allows for larger values but the current limit is 3 uses | |
| * of EXTENDED_ARG (see Python/compile.c), for a maximum | |
| * 32-bit value. This aligns with the note in Python/compile.c | |
| * (compiler_addop_i_line) indicating that the max oparg value is | |
| * 2**32 - 1, rather than INT_MAX. | |
| */ | |
| typedef union { | |
| uint16_t cache; | |
| struct { | |
| uint8_t code; | |
| uint8_t arg; | |
| } op; | |
| _Py_BackoffCounter counter; // First cache entry of specializable op | |
| } _Py_CODEUNIT; | |
| /* Abstract tree node. */ | |
| typedef struct { | |
| PyObject_HEAD | |
| } PyHamtNode; | |
| /* An HAMT immutable mapping collection. */ | |
| typedef struct { | |
| PyObject_HEAD | |
| PyHamtNode *h_root; | |
| PyObject *h_weakreflist; | |
| Py_ssize_t h_count; | |
| } PyHamtObject; | |
| typedef struct { | |
| PyObject_VAR_HEAD | |
| uint32_t b_bitmap; | |
| PyObject *b_array[1]; | |
| } PyHamtNode_Bitmap; | |
| #include "pycore_context.h" // _PyContextTokenMissing | |
| // Define this to get precise tracking of stackrefs. | |
| // #define Py_STACKREF_DEBUG 1 | |
| // Define this to get precise tracking of closed stackrefs. | |
| // This will use unbounded memory, as it can only grow. | |
| // Use this to track double closes in short-lived programs | |
| // #define Py_STACKREF_CLOSE_DEBUG 1 | |
| typedef union _PyStackRef { | |
| #if !defined(Py_GIL_DISABLED) && defined(Py_STACKREF_DEBUG) | |
| uint64_t index; | |
| #else | |
| uintptr_t bits; | |
| #endif | |
| } _PyStackRef; | |
| // A stackref that can be stored in a regular C local variable and be visible | |
| // to the GC in the free threading build. | |
| // Used in combination with _PyThreadState_PushCStackRef(). | |
| typedef struct _PyCStackRef { | |
| _PyStackRef ref; | |
| #ifdef Py_GIL_DISABLED | |
| struct _PyCStackRef *next; | |
| #endif | |
| } _PyCStackRef; | |
| #ifdef __cplusplus | |
| } | |
| #endif | |
| #endif /* Py_INTERNAL_STRUCTS_H */ |