17db96d56Sopenharmony_ci#ifndef Py_CPYTHON_OBJECT_H
27db96d56Sopenharmony_ci#  error "this header file must not be included directly"
37db96d56Sopenharmony_ci#endif
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_ciPyAPI_FUNC(void) _Py_NewReference(PyObject *op);
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci#ifdef Py_TRACE_REFS
87db96d56Sopenharmony_ci/* Py_TRACE_REFS is such major surgery that we call external routines. */
97db96d56Sopenharmony_ciPyAPI_FUNC(void) _Py_ForgetReference(PyObject *);
107db96d56Sopenharmony_ci#endif
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci#ifdef Py_REF_DEBUG
137db96d56Sopenharmony_ciPyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void);
147db96d56Sopenharmony_ci#endif
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci/********************* String Literals ****************************************/
187db96d56Sopenharmony_ci/* This structure helps managing static strings. The basic usage goes like this:
197db96d56Sopenharmony_ci   Instead of doing
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci       r = PyObject_CallMethod(o, "foo", "args", ...);
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ci   do
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci       _Py_IDENTIFIER(foo);
267db96d56Sopenharmony_ci       ...
277db96d56Sopenharmony_ci       r = _PyObject_CallMethodId(o, &PyId_foo, "args", ...);
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci   PyId_foo is a static variable, either on block level or file level. On first
307db96d56Sopenharmony_ci   usage, the string "foo" is interned, and the structures are linked. On interpreter
317db96d56Sopenharmony_ci   shutdown, all strings are released.
327db96d56Sopenharmony_ci
337db96d56Sopenharmony_ci   Alternatively, _Py_static_string allows choosing the variable name.
347db96d56Sopenharmony_ci   _PyUnicode_FromId returns a borrowed reference to the interned string.
357db96d56Sopenharmony_ci   _PyObject_{Get,Set,Has}AttrId are __getattr__ versions using _Py_Identifier*.
367db96d56Sopenharmony_ci*/
377db96d56Sopenharmony_citypedef struct _Py_Identifier {
387db96d56Sopenharmony_ci    const char* string;
397db96d56Sopenharmony_ci    // Index in PyInterpreterState.unicode.ids.array. It is process-wide
407db96d56Sopenharmony_ci    // unique and must be initialized to -1.
417db96d56Sopenharmony_ci    Py_ssize_t index;
427db96d56Sopenharmony_ci} _Py_Identifier;
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_ci#if defined(NEEDS_PY_IDENTIFIER) || !defined(Py_BUILD_CORE)
457db96d56Sopenharmony_ci// For now we are keeping _Py_IDENTIFIER for continued use
467db96d56Sopenharmony_ci// in non-builtin extensions (and naughty PyPI modules).
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_ci#define _Py_static_string_init(value) { .string = value, .index = -1 }
497db96d56Sopenharmony_ci#define _Py_static_string(varname, value)  static _Py_Identifier varname = _Py_static_string_init(value)
507db96d56Sopenharmony_ci#define _Py_IDENTIFIER(varname) _Py_static_string(PyId_##varname, #varname)
517db96d56Sopenharmony_ci
527db96d56Sopenharmony_ci#endif  /* NEEDS_PY_IDENTIFIER */
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_citypedef int (*getbufferproc)(PyObject *, Py_buffer *, int);
557db96d56Sopenharmony_citypedef void (*releasebufferproc)(PyObject *, Py_buffer *);
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_citypedef PyObject *(*vectorcallfunc)(PyObject *callable, PyObject *const *args,
587db96d56Sopenharmony_ci                                    size_t nargsf, PyObject *kwnames);
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_citypedef struct {
627db96d56Sopenharmony_ci    /* Number implementations must check *both*
637db96d56Sopenharmony_ci       arguments for proper type and implement the necessary conversions
647db96d56Sopenharmony_ci       in the slot functions themselves. */
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ci    binaryfunc nb_add;
677db96d56Sopenharmony_ci    binaryfunc nb_subtract;
687db96d56Sopenharmony_ci    binaryfunc nb_multiply;
697db96d56Sopenharmony_ci    binaryfunc nb_remainder;
707db96d56Sopenharmony_ci    binaryfunc nb_divmod;
717db96d56Sopenharmony_ci    ternaryfunc nb_power;
727db96d56Sopenharmony_ci    unaryfunc nb_negative;
737db96d56Sopenharmony_ci    unaryfunc nb_positive;
747db96d56Sopenharmony_ci    unaryfunc nb_absolute;
757db96d56Sopenharmony_ci    inquiry nb_bool;
767db96d56Sopenharmony_ci    unaryfunc nb_invert;
777db96d56Sopenharmony_ci    binaryfunc nb_lshift;
787db96d56Sopenharmony_ci    binaryfunc nb_rshift;
797db96d56Sopenharmony_ci    binaryfunc nb_and;
807db96d56Sopenharmony_ci    binaryfunc nb_xor;
817db96d56Sopenharmony_ci    binaryfunc nb_or;
827db96d56Sopenharmony_ci    unaryfunc nb_int;
837db96d56Sopenharmony_ci    void *nb_reserved;  /* the slot formerly known as nb_long */
847db96d56Sopenharmony_ci    unaryfunc nb_float;
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci    binaryfunc nb_inplace_add;
877db96d56Sopenharmony_ci    binaryfunc nb_inplace_subtract;
887db96d56Sopenharmony_ci    binaryfunc nb_inplace_multiply;
897db96d56Sopenharmony_ci    binaryfunc nb_inplace_remainder;
907db96d56Sopenharmony_ci    ternaryfunc nb_inplace_power;
917db96d56Sopenharmony_ci    binaryfunc nb_inplace_lshift;
927db96d56Sopenharmony_ci    binaryfunc nb_inplace_rshift;
937db96d56Sopenharmony_ci    binaryfunc nb_inplace_and;
947db96d56Sopenharmony_ci    binaryfunc nb_inplace_xor;
957db96d56Sopenharmony_ci    binaryfunc nb_inplace_or;
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ci    binaryfunc nb_floor_divide;
987db96d56Sopenharmony_ci    binaryfunc nb_true_divide;
997db96d56Sopenharmony_ci    binaryfunc nb_inplace_floor_divide;
1007db96d56Sopenharmony_ci    binaryfunc nb_inplace_true_divide;
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci    unaryfunc nb_index;
1037db96d56Sopenharmony_ci
1047db96d56Sopenharmony_ci    binaryfunc nb_matrix_multiply;
1057db96d56Sopenharmony_ci    binaryfunc nb_inplace_matrix_multiply;
1067db96d56Sopenharmony_ci} PyNumberMethods;
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_citypedef struct {
1097db96d56Sopenharmony_ci    lenfunc sq_length;
1107db96d56Sopenharmony_ci    binaryfunc sq_concat;
1117db96d56Sopenharmony_ci    ssizeargfunc sq_repeat;
1127db96d56Sopenharmony_ci    ssizeargfunc sq_item;
1137db96d56Sopenharmony_ci    void *was_sq_slice;
1147db96d56Sopenharmony_ci    ssizeobjargproc sq_ass_item;
1157db96d56Sopenharmony_ci    void *was_sq_ass_slice;
1167db96d56Sopenharmony_ci    objobjproc sq_contains;
1177db96d56Sopenharmony_ci
1187db96d56Sopenharmony_ci    binaryfunc sq_inplace_concat;
1197db96d56Sopenharmony_ci    ssizeargfunc sq_inplace_repeat;
1207db96d56Sopenharmony_ci} PySequenceMethods;
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_citypedef struct {
1237db96d56Sopenharmony_ci    lenfunc mp_length;
1247db96d56Sopenharmony_ci    binaryfunc mp_subscript;
1257db96d56Sopenharmony_ci    objobjargproc mp_ass_subscript;
1267db96d56Sopenharmony_ci} PyMappingMethods;
1277db96d56Sopenharmony_ci
1287db96d56Sopenharmony_citypedef PySendResult (*sendfunc)(PyObject *iter, PyObject *value, PyObject **result);
1297db96d56Sopenharmony_ci
1307db96d56Sopenharmony_citypedef struct {
1317db96d56Sopenharmony_ci    unaryfunc am_await;
1327db96d56Sopenharmony_ci    unaryfunc am_aiter;
1337db96d56Sopenharmony_ci    unaryfunc am_anext;
1347db96d56Sopenharmony_ci    sendfunc am_send;
1357db96d56Sopenharmony_ci} PyAsyncMethods;
1367db96d56Sopenharmony_ci
1377db96d56Sopenharmony_citypedef struct {
1387db96d56Sopenharmony_ci     getbufferproc bf_getbuffer;
1397db96d56Sopenharmony_ci     releasebufferproc bf_releasebuffer;
1407db96d56Sopenharmony_ci} PyBufferProcs;
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ci/* Allow printfunc in the tp_vectorcall_offset slot for
1437db96d56Sopenharmony_ci * backwards-compatibility */
1447db96d56Sopenharmony_citypedef Py_ssize_t printfunc;
1457db96d56Sopenharmony_ci
1467db96d56Sopenharmony_ci// If this structure is modified, Doc/includes/typestruct.h should be updated
1477db96d56Sopenharmony_ci// as well.
1487db96d56Sopenharmony_cistruct _typeobject {
1497db96d56Sopenharmony_ci    PyObject_VAR_HEAD
1507db96d56Sopenharmony_ci    const char *tp_name; /* For printing, in format "<module>.<name>" */
1517db96d56Sopenharmony_ci    Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */
1527db96d56Sopenharmony_ci
1537db96d56Sopenharmony_ci    /* Methods to implement standard operations */
1547db96d56Sopenharmony_ci
1557db96d56Sopenharmony_ci    destructor tp_dealloc;
1567db96d56Sopenharmony_ci    Py_ssize_t tp_vectorcall_offset;
1577db96d56Sopenharmony_ci    getattrfunc tp_getattr;
1587db96d56Sopenharmony_ci    setattrfunc tp_setattr;
1597db96d56Sopenharmony_ci    PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2)
1607db96d56Sopenharmony_ci                                    or tp_reserved (Python 3) */
1617db96d56Sopenharmony_ci    reprfunc tp_repr;
1627db96d56Sopenharmony_ci
1637db96d56Sopenharmony_ci    /* Method suites for standard classes */
1647db96d56Sopenharmony_ci
1657db96d56Sopenharmony_ci    PyNumberMethods *tp_as_number;
1667db96d56Sopenharmony_ci    PySequenceMethods *tp_as_sequence;
1677db96d56Sopenharmony_ci    PyMappingMethods *tp_as_mapping;
1687db96d56Sopenharmony_ci
1697db96d56Sopenharmony_ci    /* More standard operations (here for binary compatibility) */
1707db96d56Sopenharmony_ci
1717db96d56Sopenharmony_ci    hashfunc tp_hash;
1727db96d56Sopenharmony_ci    ternaryfunc tp_call;
1737db96d56Sopenharmony_ci    reprfunc tp_str;
1747db96d56Sopenharmony_ci    getattrofunc tp_getattro;
1757db96d56Sopenharmony_ci    setattrofunc tp_setattro;
1767db96d56Sopenharmony_ci
1777db96d56Sopenharmony_ci    /* Functions to access object as input/output buffer */
1787db96d56Sopenharmony_ci    PyBufferProcs *tp_as_buffer;
1797db96d56Sopenharmony_ci
1807db96d56Sopenharmony_ci    /* Flags to define presence of optional/expanded features */
1817db96d56Sopenharmony_ci    unsigned long tp_flags;
1827db96d56Sopenharmony_ci
1837db96d56Sopenharmony_ci    const char *tp_doc; /* Documentation string */
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_ci    /* Assigned meaning in release 2.0 */
1867db96d56Sopenharmony_ci    /* call function for all accessible objects */
1877db96d56Sopenharmony_ci    traverseproc tp_traverse;
1887db96d56Sopenharmony_ci
1897db96d56Sopenharmony_ci    /* delete references to contained objects */
1907db96d56Sopenharmony_ci    inquiry tp_clear;
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_ci    /* Assigned meaning in release 2.1 */
1937db96d56Sopenharmony_ci    /* rich comparisons */
1947db96d56Sopenharmony_ci    richcmpfunc tp_richcompare;
1957db96d56Sopenharmony_ci
1967db96d56Sopenharmony_ci    /* weak reference enabler */
1977db96d56Sopenharmony_ci    Py_ssize_t tp_weaklistoffset;
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_ci    /* Iterators */
2007db96d56Sopenharmony_ci    getiterfunc tp_iter;
2017db96d56Sopenharmony_ci    iternextfunc tp_iternext;
2027db96d56Sopenharmony_ci
2037db96d56Sopenharmony_ci    /* Attribute descriptor and subclassing stuff */
2047db96d56Sopenharmony_ci    PyMethodDef *tp_methods;
2057db96d56Sopenharmony_ci    PyMemberDef *tp_members;
2067db96d56Sopenharmony_ci    PyGetSetDef *tp_getset;
2077db96d56Sopenharmony_ci    // Strong reference on a heap type, borrowed reference on a static type
2087db96d56Sopenharmony_ci    PyTypeObject *tp_base;
2097db96d56Sopenharmony_ci    PyObject *tp_dict;
2107db96d56Sopenharmony_ci    descrgetfunc tp_descr_get;
2117db96d56Sopenharmony_ci    descrsetfunc tp_descr_set;
2127db96d56Sopenharmony_ci    Py_ssize_t tp_dictoffset;
2137db96d56Sopenharmony_ci    initproc tp_init;
2147db96d56Sopenharmony_ci    allocfunc tp_alloc;
2157db96d56Sopenharmony_ci    newfunc tp_new;
2167db96d56Sopenharmony_ci    freefunc tp_free; /* Low-level free-memory routine */
2177db96d56Sopenharmony_ci    inquiry tp_is_gc; /* For PyObject_IS_GC */
2187db96d56Sopenharmony_ci    PyObject *tp_bases;
2197db96d56Sopenharmony_ci    PyObject *tp_mro; /* method resolution order */
2207db96d56Sopenharmony_ci    PyObject *tp_cache;
2217db96d56Sopenharmony_ci    PyObject *tp_subclasses;
2227db96d56Sopenharmony_ci    PyObject *tp_weaklist;
2237db96d56Sopenharmony_ci    destructor tp_del;
2247db96d56Sopenharmony_ci
2257db96d56Sopenharmony_ci    /* Type attribute cache version tag. Added in version 2.6 */
2267db96d56Sopenharmony_ci    unsigned int tp_version_tag;
2277db96d56Sopenharmony_ci
2287db96d56Sopenharmony_ci    destructor tp_finalize;
2297db96d56Sopenharmony_ci    vectorcallfunc tp_vectorcall;
2307db96d56Sopenharmony_ci};
2317db96d56Sopenharmony_ci
2327db96d56Sopenharmony_ci/* This struct is used by the specializer
2337db96d56Sopenharmony_ci * It should should be treated as an opaque blob
2347db96d56Sopenharmony_ci * by code other than the specializer and interpreter. */
2357db96d56Sopenharmony_cistruct _specialization_cache {
2367db96d56Sopenharmony_ci    PyObject *getitem;
2377db96d56Sopenharmony_ci};
2387db96d56Sopenharmony_ci
2397db96d56Sopenharmony_ci/* The *real* layout of a type object when allocated on the heap */
2407db96d56Sopenharmony_citypedef struct _heaptypeobject {
2417db96d56Sopenharmony_ci    /* Note: there's a dependency on the order of these members
2427db96d56Sopenharmony_ci       in slotptr() in typeobject.c . */
2437db96d56Sopenharmony_ci    PyTypeObject ht_type;
2447db96d56Sopenharmony_ci    PyAsyncMethods as_async;
2457db96d56Sopenharmony_ci    PyNumberMethods as_number;
2467db96d56Sopenharmony_ci    PyMappingMethods as_mapping;
2477db96d56Sopenharmony_ci    PySequenceMethods as_sequence; /* as_sequence comes after as_mapping,
2487db96d56Sopenharmony_ci                                      so that the mapping wins when both
2497db96d56Sopenharmony_ci                                      the mapping and the sequence define
2507db96d56Sopenharmony_ci                                      a given operator (e.g. __getitem__).
2517db96d56Sopenharmony_ci                                      see add_operators() in typeobject.c . */
2527db96d56Sopenharmony_ci    PyBufferProcs as_buffer;
2537db96d56Sopenharmony_ci    PyObject *ht_name, *ht_slots, *ht_qualname;
2547db96d56Sopenharmony_ci    struct _dictkeysobject *ht_cached_keys;
2557db96d56Sopenharmony_ci    PyObject *ht_module;
2567db96d56Sopenharmony_ci    char *_ht_tpname;  // Storage for "tp_name"; see PyType_FromModuleAndSpec
2577db96d56Sopenharmony_ci    struct _specialization_cache _spec_cache; // For use by the specializer.
2587db96d56Sopenharmony_ci    /* here are optional user slots, followed by the members. */
2597db96d56Sopenharmony_ci} PyHeapTypeObject;
2607db96d56Sopenharmony_ci
2617db96d56Sopenharmony_ciPyAPI_FUNC(const char *) _PyType_Name(PyTypeObject *);
2627db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *);
2637db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyType_LookupId(PyTypeObject *, _Py_Identifier *);
2647db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyObject_LookupSpecialId(PyObject *, _Py_Identifier *);
2657db96d56Sopenharmony_ci#ifndef Py_BUILD_CORE
2667db96d56Sopenharmony_ci// Backward compatibility for 3rd-party extensions
2677db96d56Sopenharmony_ci// that may be using the old name.
2687db96d56Sopenharmony_ci#define _PyObject_LookupSpecial _PyObject_LookupSpecialId
2697db96d56Sopenharmony_ci#endif
2707db96d56Sopenharmony_ciPyAPI_FUNC(PyTypeObject *) _PyType_CalculateMetaclass(PyTypeObject *, PyObject *);
2717db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyType_GetDocFromInternalDoc(const char *, const char *);
2727db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyType_GetTextSignatureFromInternalDoc(const char *, const char *);
2737db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyType_GetModuleByDef(PyTypeObject *, PyModuleDef *);
2747db96d56Sopenharmony_ci
2757db96d56Sopenharmony_ciPyAPI_FUNC(int) PyObject_Print(PyObject *, FILE *, int);
2767db96d56Sopenharmony_ciPyAPI_FUNC(void) _Py_BreakPoint(void);
2777db96d56Sopenharmony_ciPyAPI_FUNC(void) _PyObject_Dump(PyObject *);
2787db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyObject_IsFreed(PyObject *);
2797db96d56Sopenharmony_ci
2807db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyObject_IsAbstract(PyObject *);
2817db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyObject_GetAttrId(PyObject *, _Py_Identifier *);
2827db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyObject_SetAttrId(PyObject *, _Py_Identifier *, PyObject *);
2837db96d56Sopenharmony_ci/* Replacements of PyObject_GetAttr() and _PyObject_GetAttrId() which
2847db96d56Sopenharmony_ci   don't raise AttributeError.
2857db96d56Sopenharmony_ci
2867db96d56Sopenharmony_ci   Return 1 and set *result != NULL if an attribute is found.
2877db96d56Sopenharmony_ci   Return 0 and set *result == NULL if an attribute is not found;
2887db96d56Sopenharmony_ci   an AttributeError is silenced.
2897db96d56Sopenharmony_ci   Return -1 and set *result == NULL if an error other than AttributeError
2907db96d56Sopenharmony_ci   is raised.
2917db96d56Sopenharmony_ci*/
2927db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyObject_LookupAttr(PyObject *, PyObject *, PyObject **);
2937db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyObject_LookupAttrId(PyObject *, _Py_Identifier *, PyObject **);
2947db96d56Sopenharmony_ci
2957db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method);
2967db96d56Sopenharmony_ci
2977db96d56Sopenharmony_ciPyAPI_FUNC(PyObject **) _PyObject_GetDictPtr(PyObject *);
2987db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyObject_NextNotImplemented(PyObject *);
2997db96d56Sopenharmony_ciPyAPI_FUNC(void) PyObject_CallFinalizer(PyObject *);
3007db96d56Sopenharmony_ciPyAPI_FUNC(int) PyObject_CallFinalizerFromDealloc(PyObject *);
3017db96d56Sopenharmony_ci
3027db96d56Sopenharmony_ci/* Same as PyObject_Generic{Get,Set}Attr, but passing the attributes
3037db96d56Sopenharmony_ci   dict as the last parameter. */
3047db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *)
3057db96d56Sopenharmony_ci_PyObject_GenericGetAttrWithDict(PyObject *, PyObject *, PyObject *, int);
3067db96d56Sopenharmony_ciPyAPI_FUNC(int)
3077db96d56Sopenharmony_ci_PyObject_GenericSetAttrWithDict(PyObject *, PyObject *,
3087db96d56Sopenharmony_ci                                 PyObject *, PyObject *);
3097db96d56Sopenharmony_ci
3107db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyObject_FunctionStr(PyObject *);
3117db96d56Sopenharmony_ci
3127db96d56Sopenharmony_ci/* Safely decref `op` and set `op` to `op2`.
3137db96d56Sopenharmony_ci *
3147db96d56Sopenharmony_ci * As in case of Py_CLEAR "the obvious" code can be deadly:
3157db96d56Sopenharmony_ci *
3167db96d56Sopenharmony_ci *     Py_DECREF(op);
3177db96d56Sopenharmony_ci *     op = op2;
3187db96d56Sopenharmony_ci *
3197db96d56Sopenharmony_ci * The safe way is:
3207db96d56Sopenharmony_ci *
3217db96d56Sopenharmony_ci *      Py_SETREF(op, op2);
3227db96d56Sopenharmony_ci *
3237db96d56Sopenharmony_ci * That arranges to set `op` to `op2` _before_ decref'ing, so that any code
3247db96d56Sopenharmony_ci * triggered as a side-effect of `op` getting torn down no longer believes
3257db96d56Sopenharmony_ci * `op` points to a valid object.
3267db96d56Sopenharmony_ci *
3277db96d56Sopenharmony_ci * Py_XSETREF is a variant of Py_SETREF that uses Py_XDECREF instead of
3287db96d56Sopenharmony_ci * Py_DECREF.
3297db96d56Sopenharmony_ci */
3307db96d56Sopenharmony_ci
3317db96d56Sopenharmony_ci#define Py_SETREF(op, op2)                      \
3327db96d56Sopenharmony_ci    do {                                        \
3337db96d56Sopenharmony_ci        PyObject *_py_tmp = _PyObject_CAST(op); \
3347db96d56Sopenharmony_ci        (op) = (op2);                           \
3357db96d56Sopenharmony_ci        Py_DECREF(_py_tmp);                     \
3367db96d56Sopenharmony_ci    } while (0)
3377db96d56Sopenharmony_ci
3387db96d56Sopenharmony_ci#define Py_XSETREF(op, op2)                     \
3397db96d56Sopenharmony_ci    do {                                        \
3407db96d56Sopenharmony_ci        PyObject *_py_tmp = _PyObject_CAST(op); \
3417db96d56Sopenharmony_ci        (op) = (op2);                           \
3427db96d56Sopenharmony_ci        Py_XDECREF(_py_tmp);                    \
3437db96d56Sopenharmony_ci    } while (0)
3447db96d56Sopenharmony_ci
3457db96d56Sopenharmony_ci
3467db96d56Sopenharmony_ciPyAPI_DATA(PyTypeObject) _PyNone_Type;
3477db96d56Sopenharmony_ciPyAPI_DATA(PyTypeObject) _PyNotImplemented_Type;
3487db96d56Sopenharmony_ci
3497db96d56Sopenharmony_ci/* Maps Py_LT to Py_GT, ..., Py_GE to Py_LE.
3507db96d56Sopenharmony_ci * Defined in object.c.
3517db96d56Sopenharmony_ci */
3527db96d56Sopenharmony_ciPyAPI_DATA(int) _Py_SwappedOp[];
3537db96d56Sopenharmony_ci
3547db96d56Sopenharmony_ciPyAPI_FUNC(void)
3557db96d56Sopenharmony_ci_PyDebugAllocatorStats(FILE *out, const char *block_name, int num_blocks,
3567db96d56Sopenharmony_ci                       size_t sizeof_block);
3577db96d56Sopenharmony_ciPyAPI_FUNC(void)
3587db96d56Sopenharmony_ci_PyObject_DebugTypeStats(FILE *out);
3597db96d56Sopenharmony_ci
3607db96d56Sopenharmony_ci/* Define a pair of assertion macros:
3617db96d56Sopenharmony_ci   _PyObject_ASSERT_FROM(), _PyObject_ASSERT_WITH_MSG() and _PyObject_ASSERT().
3627db96d56Sopenharmony_ci
3637db96d56Sopenharmony_ci   These work like the regular C assert(), in that they will abort the
3647db96d56Sopenharmony_ci   process with a message on stderr if the given condition fails to hold,
3657db96d56Sopenharmony_ci   but compile away to nothing if NDEBUG is defined.
3667db96d56Sopenharmony_ci
3677db96d56Sopenharmony_ci   However, before aborting, Python will also try to call _PyObject_Dump() on
3687db96d56Sopenharmony_ci   the given object.  This may be of use when investigating bugs in which a
3697db96d56Sopenharmony_ci   particular object is corrupt (e.g. buggy a tp_visit method in an extension
3707db96d56Sopenharmony_ci   module breaking the garbage collector), to help locate the broken objects.
3717db96d56Sopenharmony_ci
3727db96d56Sopenharmony_ci   The WITH_MSG variant allows you to supply an additional message that Python
3737db96d56Sopenharmony_ci   will attempt to print to stderr, after the object dump. */
3747db96d56Sopenharmony_ci#ifdef NDEBUG
3757db96d56Sopenharmony_ci   /* No debugging: compile away the assertions: */
3767db96d56Sopenharmony_ci#  define _PyObject_ASSERT_FROM(obj, expr, msg, filename, lineno, func) \
3777db96d56Sopenharmony_ci    ((void)0)
3787db96d56Sopenharmony_ci#else
3797db96d56Sopenharmony_ci   /* With debugging: generate checks: */
3807db96d56Sopenharmony_ci#  define _PyObject_ASSERT_FROM(obj, expr, msg, filename, lineno, func) \
3817db96d56Sopenharmony_ci    ((expr) \
3827db96d56Sopenharmony_ci      ? (void)(0) \
3837db96d56Sopenharmony_ci      : _PyObject_AssertFailed((obj), Py_STRINGIFY(expr), \
3847db96d56Sopenharmony_ci                               (msg), (filename), (lineno), (func)))
3857db96d56Sopenharmony_ci#endif
3867db96d56Sopenharmony_ci
3877db96d56Sopenharmony_ci#define _PyObject_ASSERT_WITH_MSG(obj, expr, msg) \
3887db96d56Sopenharmony_ci    _PyObject_ASSERT_FROM(obj, expr, msg, __FILE__, __LINE__, __func__)
3897db96d56Sopenharmony_ci#define _PyObject_ASSERT(obj, expr) \
3907db96d56Sopenharmony_ci    _PyObject_ASSERT_WITH_MSG(obj, expr, NULL)
3917db96d56Sopenharmony_ci
3927db96d56Sopenharmony_ci#define _PyObject_ASSERT_FAILED_MSG(obj, msg) \
3937db96d56Sopenharmony_ci    _PyObject_AssertFailed((obj), NULL, (msg), __FILE__, __LINE__, __func__)
3947db96d56Sopenharmony_ci
3957db96d56Sopenharmony_ci/* Declare and define _PyObject_AssertFailed() even when NDEBUG is defined,
3967db96d56Sopenharmony_ci   to avoid causing compiler/linker errors when building extensions without
3977db96d56Sopenharmony_ci   NDEBUG against a Python built with NDEBUG defined.
3987db96d56Sopenharmony_ci
3997db96d56Sopenharmony_ci   msg, expr and function can be NULL. */
4007db96d56Sopenharmony_ciPyAPI_FUNC(void) _Py_NO_RETURN _PyObject_AssertFailed(
4017db96d56Sopenharmony_ci    PyObject *obj,
4027db96d56Sopenharmony_ci    const char *expr,
4037db96d56Sopenharmony_ci    const char *msg,
4047db96d56Sopenharmony_ci    const char *file,
4057db96d56Sopenharmony_ci    int line,
4067db96d56Sopenharmony_ci    const char *function);
4077db96d56Sopenharmony_ci
4087db96d56Sopenharmony_ci/* Check if an object is consistent. For example, ensure that the reference
4097db96d56Sopenharmony_ci   counter is greater than or equal to 1, and ensure that ob_type is not NULL.
4107db96d56Sopenharmony_ci
4117db96d56Sopenharmony_ci   Call _PyObject_AssertFailed() if the object is inconsistent.
4127db96d56Sopenharmony_ci
4137db96d56Sopenharmony_ci   If check_content is zero, only check header fields: reduce the overhead.
4147db96d56Sopenharmony_ci
4157db96d56Sopenharmony_ci   The function always return 1. The return value is just here to be able to
4167db96d56Sopenharmony_ci   write:
4177db96d56Sopenharmony_ci
4187db96d56Sopenharmony_ci   assert(_PyObject_CheckConsistency(obj, 1)); */
4197db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyObject_CheckConsistency(
4207db96d56Sopenharmony_ci    PyObject *op,
4217db96d56Sopenharmony_ci    int check_content);
4227db96d56Sopenharmony_ci
4237db96d56Sopenharmony_ci
4247db96d56Sopenharmony_ci/* Trashcan mechanism, thanks to Christian Tismer.
4257db96d56Sopenharmony_ci
4267db96d56Sopenharmony_ciWhen deallocating a container object, it's possible to trigger an unbounded
4277db96d56Sopenharmony_cichain of deallocations, as each Py_DECREF in turn drops the refcount on "the
4287db96d56Sopenharmony_cinext" object in the chain to 0.  This can easily lead to stack overflows,
4297db96d56Sopenharmony_ciespecially in threads (which typically have less stack space to work with).
4307db96d56Sopenharmony_ci
4317db96d56Sopenharmony_ciA container object can avoid this by bracketing the body of its tp_dealloc
4327db96d56Sopenharmony_cifunction with a pair of macros:
4337db96d56Sopenharmony_ci
4347db96d56Sopenharmony_cistatic void
4357db96d56Sopenharmony_cimytype_dealloc(mytype *p)
4367db96d56Sopenharmony_ci{
4377db96d56Sopenharmony_ci    ... declarations go here ...
4387db96d56Sopenharmony_ci
4397db96d56Sopenharmony_ci    PyObject_GC_UnTrack(p);        // must untrack first
4407db96d56Sopenharmony_ci    Py_TRASHCAN_BEGIN(p, mytype_dealloc)
4417db96d56Sopenharmony_ci    ... The body of the deallocator goes here, including all calls ...
4427db96d56Sopenharmony_ci    ... to Py_DECREF on contained objects.                         ...
4437db96d56Sopenharmony_ci    Py_TRASHCAN_END                // there should be no code after this
4447db96d56Sopenharmony_ci}
4457db96d56Sopenharmony_ci
4467db96d56Sopenharmony_ciCAUTION:  Never return from the middle of the body!  If the body needs to
4477db96d56Sopenharmony_ci"get out early", put a label immediately before the Py_TRASHCAN_END
4487db96d56Sopenharmony_cicall, and goto it.  Else the call-depth counter (see below) will stay
4497db96d56Sopenharmony_ciabove 0 forever, and the trashcan will never get emptied.
4507db96d56Sopenharmony_ci
4517db96d56Sopenharmony_ciHow it works:  The BEGIN macro increments a call-depth counter.  So long
4527db96d56Sopenharmony_cias this counter is small, the body of the deallocator is run directly without
4537db96d56Sopenharmony_cifurther ado.  But if the counter gets large, it instead adds p to a list of
4547db96d56Sopenharmony_ciobjects to be deallocated later, skips the body of the deallocator, and
4557db96d56Sopenharmony_ciresumes execution after the END macro.  The tp_dealloc routine then returns
4567db96d56Sopenharmony_ciwithout deallocating anything (and so unbounded call-stack depth is avoided).
4577db96d56Sopenharmony_ci
4587db96d56Sopenharmony_ciWhen the call stack finishes unwinding again, code generated by the END macro
4597db96d56Sopenharmony_cinotices this, and calls another routine to deallocate all the objects that
4607db96d56Sopenharmony_cimay have been added to the list of deferred deallocations.  In effect, a
4617db96d56Sopenharmony_cichain of N deallocations is broken into (N-1)/(_PyTrash_UNWIND_LEVEL-1) pieces,
4627db96d56Sopenharmony_ciwith the call stack never exceeding a depth of _PyTrash_UNWIND_LEVEL.
4637db96d56Sopenharmony_ci
4647db96d56Sopenharmony_ciSince the tp_dealloc of a subclass typically calls the tp_dealloc of the base
4657db96d56Sopenharmony_ciclass, we need to ensure that the trashcan is only triggered on the tp_dealloc
4667db96d56Sopenharmony_ciof the actual class being deallocated. Otherwise we might end up with a
4677db96d56Sopenharmony_cipartially-deallocated object. To check this, the tp_dealloc function must be
4687db96d56Sopenharmony_cipassed as second argument to Py_TRASHCAN_BEGIN().
4697db96d56Sopenharmony_ci*/
4707db96d56Sopenharmony_ci
4717db96d56Sopenharmony_ci/* Python 3.9 private API, invoked by the macros below. */
4727db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyTrash_begin(PyThreadState *tstate, PyObject *op);
4737db96d56Sopenharmony_ciPyAPI_FUNC(void) _PyTrash_end(PyThreadState *tstate);
4747db96d56Sopenharmony_ci/* Python 3.10 private API, invoked by the Py_TRASHCAN_BEGIN(). */
4757db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyTrash_cond(PyObject *op, destructor dealloc);
4767db96d56Sopenharmony_ci
4777db96d56Sopenharmony_ci#define Py_TRASHCAN_BEGIN_CONDITION(op, cond) \
4787db96d56Sopenharmony_ci    do { \
4797db96d56Sopenharmony_ci        PyThreadState *_tstate = NULL; \
4807db96d56Sopenharmony_ci        /* If "cond" is false, then _tstate remains NULL and the deallocator \
4817db96d56Sopenharmony_ci         * is run normally without involving the trashcan */ \
4827db96d56Sopenharmony_ci        if (cond) { \
4837db96d56Sopenharmony_ci            _tstate = PyThreadState_Get(); \
4847db96d56Sopenharmony_ci            if (_PyTrash_begin(_tstate, _PyObject_CAST(op))) { \
4857db96d56Sopenharmony_ci                break; \
4867db96d56Sopenharmony_ci            } \
4877db96d56Sopenharmony_ci        }
4887db96d56Sopenharmony_ci        /* The body of the deallocator is here. */
4897db96d56Sopenharmony_ci#define Py_TRASHCAN_END \
4907db96d56Sopenharmony_ci        if (_tstate) { \
4917db96d56Sopenharmony_ci            _PyTrash_end(_tstate); \
4927db96d56Sopenharmony_ci        } \
4937db96d56Sopenharmony_ci    } while (0);
4947db96d56Sopenharmony_ci
4957db96d56Sopenharmony_ci#define Py_TRASHCAN_BEGIN(op, dealloc) \
4967db96d56Sopenharmony_ci    Py_TRASHCAN_BEGIN_CONDITION(op, \
4977db96d56Sopenharmony_ci        _PyTrash_cond(_PyObject_CAST(op), (destructor)dealloc))
4987db96d56Sopenharmony_ci
4997db96d56Sopenharmony_ci/* The following two macros, Py_TRASHCAN_SAFE_BEGIN and
5007db96d56Sopenharmony_ci * Py_TRASHCAN_SAFE_END, are deprecated since version 3.11 and
5017db96d56Sopenharmony_ci * will be removed in the future.
5027db96d56Sopenharmony_ci * Use Py_TRASHCAN_BEGIN and Py_TRASHCAN_END instead.
5037db96d56Sopenharmony_ci */
5047db96d56Sopenharmony_ciPy_DEPRECATED(3.11) typedef int UsingDeprecatedTrashcanMacro;
5057db96d56Sopenharmony_ci#define Py_TRASHCAN_SAFE_BEGIN(op) \
5067db96d56Sopenharmony_ci    do { \
5077db96d56Sopenharmony_ci        UsingDeprecatedTrashcanMacro cond=1; \
5087db96d56Sopenharmony_ci        Py_TRASHCAN_BEGIN_CONDITION(op, cond);
5097db96d56Sopenharmony_ci#define Py_TRASHCAN_SAFE_END(op) \
5107db96d56Sopenharmony_ci        Py_TRASHCAN_END; \
5117db96d56Sopenharmony_ci    } while(0);
512