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