blob: 43b0be37557a3fb514374654a5458a916a589596 [file] [log] [blame]
Victor Stinner6eb99662018-11-26 17:09:16 +01001#ifndef Py_CPYTHON_OBJECT_H
2# error "this header file must not be included directly"
3#endif
4
Victor Stinnerf58bd7c2020-02-05 13:12:19 +01005PyAPI_FUNC(void) _Py_NewReference(PyObject *op);
6
7#ifdef Py_TRACE_REFS
8/* Py_TRACE_REFS is such major surgery that we call external routines. */
9PyAPI_FUNC(void) _Py_ForgetReference(PyObject *);
10#endif
11
Victor Stinnerf58bd7c2020-02-05 13:12:19 +010012#ifdef Py_REF_DEBUG
13PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void);
14#endif
15
16
Victor Stinner6eb99662018-11-26 17:09:16 +010017/********************* String Literals ****************************************/
18/* This structure helps managing static strings. The basic usage goes like this:
19 Instead of doing
20
21 r = PyObject_CallMethod(o, "foo", "args", ...);
22
23 do
24
25 _Py_IDENTIFIER(foo);
26 ...
27 r = _PyObject_CallMethodId(o, &PyId_foo, "args", ...);
28
29 PyId_foo is a static variable, either on block level or file level. On first
30 usage, the string "foo" is interned, and the structures are linked. On interpreter
Victor Stinnerd6fb53f2020-05-14 01:11:54 +020031 shutdown, all strings are released.
Victor Stinner6eb99662018-11-26 17:09:16 +010032
33 Alternatively, _Py_static_string allows choosing the variable name.
34 _PyUnicode_FromId returns a borrowed reference to the interned string.
35 _PyObject_{Get,Set,Has}AttrId are __getattr__ versions using _Py_Identifier*.
36*/
37typedef struct _Py_Identifier {
38 struct _Py_Identifier *next;
39 const char* string;
40 PyObject *object;
41} _Py_Identifier;
42
43#define _Py_static_string_init(value) { .next = NULL, .string = value, .object = NULL }
44#define _Py_static_string(varname, value) static _Py_Identifier varname = _Py_static_string_init(value)
45#define _Py_IDENTIFIER(varname) _Py_static_string(PyId_##varname, #varname)
46
47/* buffer interface */
48typedef struct bufferinfo {
49 void *buf;
50 PyObject *obj; /* owned reference */
51 Py_ssize_t len;
52 Py_ssize_t itemsize; /* This is Py_ssize_t so it can be
53 pointed to by strides in simple case.*/
54 int readonly;
55 int ndim;
56 char *format;
57 Py_ssize_t *shape;
58 Py_ssize_t *strides;
59 Py_ssize_t *suboffsets;
60 void *internal;
61} Py_buffer;
62
63typedef int (*getbufferproc)(PyObject *, Py_buffer *, int);
64typedef void (*releasebufferproc)(PyObject *, Py_buffer *);
65
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020066typedef PyObject *(*vectorcallfunc)(PyObject *callable, PyObject *const *args,
67 size_t nargsf, PyObject *kwnames);
68
Victor Stinner6eb99662018-11-26 17:09:16 +010069/* Maximum number of dimensions */
70#define PyBUF_MAX_NDIM 64
71
72/* Flags for getting buffers */
73#define PyBUF_SIMPLE 0
74#define PyBUF_WRITABLE 0x0001
75/* we used to include an E, backwards compatible alias */
76#define PyBUF_WRITEABLE PyBUF_WRITABLE
77#define PyBUF_FORMAT 0x0004
78#define PyBUF_ND 0x0008
79#define PyBUF_STRIDES (0x0010 | PyBUF_ND)
80#define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES)
81#define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES)
82#define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES)
83#define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)
84
85#define PyBUF_CONTIG (PyBUF_ND | PyBUF_WRITABLE)
86#define PyBUF_CONTIG_RO (PyBUF_ND)
87
88#define PyBUF_STRIDED (PyBUF_STRIDES | PyBUF_WRITABLE)
89#define PyBUF_STRIDED_RO (PyBUF_STRIDES)
90
91#define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_WRITABLE | PyBUF_FORMAT)
92#define PyBUF_RECORDS_RO (PyBUF_STRIDES | PyBUF_FORMAT)
93
94#define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_WRITABLE | PyBUF_FORMAT)
95#define PyBUF_FULL_RO (PyBUF_INDIRECT | PyBUF_FORMAT)
96
97
98#define PyBUF_READ 0x100
99#define PyBUF_WRITE 0x200
100/* End buffer interface */
101
102
103typedef struct {
104 /* Number implementations must check *both*
105 arguments for proper type and implement the necessary conversions
106 in the slot functions themselves. */
107
108 binaryfunc nb_add;
109 binaryfunc nb_subtract;
110 binaryfunc nb_multiply;
111 binaryfunc nb_remainder;
112 binaryfunc nb_divmod;
113 ternaryfunc nb_power;
114 unaryfunc nb_negative;
115 unaryfunc nb_positive;
116 unaryfunc nb_absolute;
117 inquiry nb_bool;
118 unaryfunc nb_invert;
119 binaryfunc nb_lshift;
120 binaryfunc nb_rshift;
121 binaryfunc nb_and;
122 binaryfunc nb_xor;
123 binaryfunc nb_or;
124 unaryfunc nb_int;
125 void *nb_reserved; /* the slot formerly known as nb_long */
126 unaryfunc nb_float;
127
128 binaryfunc nb_inplace_add;
129 binaryfunc nb_inplace_subtract;
130 binaryfunc nb_inplace_multiply;
131 binaryfunc nb_inplace_remainder;
132 ternaryfunc nb_inplace_power;
133 binaryfunc nb_inplace_lshift;
134 binaryfunc nb_inplace_rshift;
135 binaryfunc nb_inplace_and;
136 binaryfunc nb_inplace_xor;
137 binaryfunc nb_inplace_or;
138
139 binaryfunc nb_floor_divide;
140 binaryfunc nb_true_divide;
141 binaryfunc nb_inplace_floor_divide;
142 binaryfunc nb_inplace_true_divide;
143
144 unaryfunc nb_index;
145
146 binaryfunc nb_matrix_multiply;
147 binaryfunc nb_inplace_matrix_multiply;
148} PyNumberMethods;
149
150typedef struct {
151 lenfunc sq_length;
152 binaryfunc sq_concat;
153 ssizeargfunc sq_repeat;
154 ssizeargfunc sq_item;
155 void *was_sq_slice;
156 ssizeobjargproc sq_ass_item;
157 void *was_sq_ass_slice;
158 objobjproc sq_contains;
159
160 binaryfunc sq_inplace_concat;
161 ssizeargfunc sq_inplace_repeat;
162} PySequenceMethods;
163
164typedef struct {
165 lenfunc mp_length;
166 binaryfunc mp_subscript;
167 objobjargproc mp_ass_subscript;
168} PyMappingMethods;
169
Vladimir Matveev1e996c32020-11-10 12:09:55 -0800170typedef PySendResult (*sendfunc)(PyObject *iter, PyObject *value, PyObject **result);
171
Victor Stinner6eb99662018-11-26 17:09:16 +0100172typedef struct {
173 unaryfunc am_await;
174 unaryfunc am_aiter;
175 unaryfunc am_anext;
Vladimir Matveev1e996c32020-11-10 12:09:55 -0800176 sendfunc am_send;
Victor Stinner6eb99662018-11-26 17:09:16 +0100177} PyAsyncMethods;
178
179typedef struct {
180 getbufferproc bf_getbuffer;
181 releasebufferproc bf_releasebuffer;
182} PyBufferProcs;
183
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200184/* Allow printfunc in the tp_vectorcall_offset slot for
185 * backwards-compatibility */
186typedef Py_ssize_t printfunc;
Victor Stinner6eb99662018-11-26 17:09:16 +0100187
Victor Stinnerf95cd192020-02-07 01:43:25 +0100188struct _typeobject {
Victor Stinner6eb99662018-11-26 17:09:16 +0100189 PyObject_VAR_HEAD
190 const char *tp_name; /* For printing, in format "<module>.<name>" */
191 Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */
192
193 /* Methods to implement standard operations */
194
195 destructor tp_dealloc;
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200196 Py_ssize_t tp_vectorcall_offset;
Victor Stinner6eb99662018-11-26 17:09:16 +0100197 getattrfunc tp_getattr;
198 setattrfunc tp_setattr;
199 PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2)
200 or tp_reserved (Python 3) */
201 reprfunc tp_repr;
202
203 /* Method suites for standard classes */
204
205 PyNumberMethods *tp_as_number;
206 PySequenceMethods *tp_as_sequence;
207 PyMappingMethods *tp_as_mapping;
208
209 /* More standard operations (here for binary compatibility) */
210
211 hashfunc tp_hash;
212 ternaryfunc tp_call;
213 reprfunc tp_str;
214 getattrofunc tp_getattro;
215 setattrofunc tp_setattro;
216
217 /* Functions to access object as input/output buffer */
218 PyBufferProcs *tp_as_buffer;
219
220 /* Flags to define presence of optional/expanded features */
221 unsigned long tp_flags;
222
223 const char *tp_doc; /* Documentation string */
224
225 /* Assigned meaning in release 2.0 */
226 /* call function for all accessible objects */
227 traverseproc tp_traverse;
228
229 /* delete references to contained objects */
230 inquiry tp_clear;
231
232 /* Assigned meaning in release 2.1 */
233 /* rich comparisons */
234 richcmpfunc tp_richcompare;
235
236 /* weak reference enabler */
237 Py_ssize_t tp_weaklistoffset;
238
239 /* Iterators */
240 getiterfunc tp_iter;
241 iternextfunc tp_iternext;
242
243 /* Attribute descriptor and subclassing stuff */
244 struct PyMethodDef *tp_methods;
245 struct PyMemberDef *tp_members;
246 struct PyGetSetDef *tp_getset;
Victor Stinnerba2958e2020-11-11 14:27:32 +0100247 // Strong reference on a heap type, borrowed reference on a static type
Victor Stinner6eb99662018-11-26 17:09:16 +0100248 struct _typeobject *tp_base;
249 PyObject *tp_dict;
250 descrgetfunc tp_descr_get;
251 descrsetfunc tp_descr_set;
252 Py_ssize_t tp_dictoffset;
253 initproc tp_init;
254 allocfunc tp_alloc;
255 newfunc tp_new;
256 freefunc tp_free; /* Low-level free-memory routine */
257 inquiry tp_is_gc; /* For PyObject_IS_GC */
258 PyObject *tp_bases;
259 PyObject *tp_mro; /* method resolution order */
260 PyObject *tp_cache;
261 PyObject *tp_subclasses;
262 PyObject *tp_weaklist;
263 destructor tp_del;
264
265 /* Type attribute cache version tag. Added in version 2.6 */
266 unsigned int tp_version_tag;
267
268 destructor tp_finalize;
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200269 vectorcallfunc tp_vectorcall;
Victor Stinnerf95cd192020-02-07 01:43:25 +0100270};
Victor Stinner6eb99662018-11-26 17:09:16 +0100271
272/* The *real* layout of a type object when allocated on the heap */
273typedef struct _heaptypeobject {
274 /* Note: there's a dependency on the order of these members
275 in slotptr() in typeobject.c . */
276 PyTypeObject ht_type;
277 PyAsyncMethods as_async;
278 PyNumberMethods as_number;
279 PyMappingMethods as_mapping;
280 PySequenceMethods as_sequence; /* as_sequence comes after as_mapping,
281 so that the mapping wins when both
282 the mapping and the sequence define
283 a given operator (e.g. __getitem__).
284 see add_operators() in typeobject.c . */
285 PyBufferProcs as_buffer;
286 PyObject *ht_name, *ht_slots, *ht_qualname;
287 struct _dictkeysobject *ht_cached_keys;
Petr Viktorine1becf42020-05-07 15:39:59 +0200288 PyObject *ht_module;
Victor Stinner6eb99662018-11-26 17:09:16 +0100289 /* here are optional user slots, followed by the members. */
290} PyHeapTypeObject;
291
292/* access macro to the members which are floating "behind" the object */
293#define PyHeapType_GET_MEMBERS(etype) \
294 ((PyMemberDef *)(((char *)etype) + Py_TYPE(etype)->tp_basicsize))
295
296PyAPI_FUNC(const char *) _PyType_Name(PyTypeObject *);
297PyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *);
298PyAPI_FUNC(PyObject *) _PyType_LookupId(PyTypeObject *, _Py_Identifier *);
299PyAPI_FUNC(PyObject *) _PyObject_LookupSpecial(PyObject *, _Py_Identifier *);
300PyAPI_FUNC(PyTypeObject *) _PyType_CalculateMetaclass(PyTypeObject *, PyObject *);
301PyAPI_FUNC(PyObject *) _PyType_GetDocFromInternalDoc(const char *, const char *);
302PyAPI_FUNC(PyObject *) _PyType_GetTextSignatureFromInternalDoc(const char *, const char *);
Petr Viktorin57aaaa82020-11-03 22:27:12 +0100303struct PyModuleDef;
304PyAPI_FUNC(PyObject *) _PyType_GetModuleByDef(PyTypeObject *, struct PyModuleDef *);
Victor Stinner6eb99662018-11-26 17:09:16 +0100305
306struct _Py_Identifier;
307PyAPI_FUNC(int) PyObject_Print(PyObject *, FILE *, int);
308PyAPI_FUNC(void) _Py_BreakPoint(void);
309PyAPI_FUNC(void) _PyObject_Dump(PyObject *);
310PyAPI_FUNC(int) _PyObject_IsFreed(PyObject *);
311
312PyAPI_FUNC(int) _PyObject_IsAbstract(PyObject *);
313PyAPI_FUNC(PyObject *) _PyObject_GetAttrId(PyObject *, struct _Py_Identifier *);
314PyAPI_FUNC(int) _PyObject_SetAttrId(PyObject *, struct _Py_Identifier *, PyObject *);
Victor Stinner6eb99662018-11-26 17:09:16 +0100315/* Replacements of PyObject_GetAttr() and _PyObject_GetAttrId() which
316 don't raise AttributeError.
317
318 Return 1 and set *result != NULL if an attribute is found.
319 Return 0 and set *result == NULL if an attribute is not found;
320 an AttributeError is silenced.
321 Return -1 and set *result == NULL if an error other than AttributeError
322 is raised.
323*/
324PyAPI_FUNC(int) _PyObject_LookupAttr(PyObject *, PyObject *, PyObject **);
325PyAPI_FUNC(int) _PyObject_LookupAttrId(PyObject *, struct _Py_Identifier *, PyObject **);
Jeroen Demeyerb2f94732019-06-14 12:37:15 +0200326
327PyAPI_FUNC(int) _PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method);
328
Victor Stinner6eb99662018-11-26 17:09:16 +0100329PyAPI_FUNC(PyObject **) _PyObject_GetDictPtr(PyObject *);
330PyAPI_FUNC(PyObject *) _PyObject_NextNotImplemented(PyObject *);
331PyAPI_FUNC(void) PyObject_CallFinalizer(PyObject *);
332PyAPI_FUNC(int) PyObject_CallFinalizerFromDealloc(PyObject *);
333
334/* Same as PyObject_Generic{Get,Set}Attr, but passing the attributes
335 dict as the last parameter. */
336PyAPI_FUNC(PyObject *)
337_PyObject_GenericGetAttrWithDict(PyObject *, PyObject *, PyObject *, int);
338PyAPI_FUNC(int)
339_PyObject_GenericSetAttrWithDict(PyObject *, PyObject *,
340 PyObject *, PyObject *);
341
Jeroen Demeyerbf17d412019-11-05 16:48:04 +0100342PyAPI_FUNC(PyObject *) _PyObject_FunctionStr(PyObject *);
Victor Stinner6eb99662018-11-26 17:09:16 +0100343
344/* Safely decref `op` and set `op` to `op2`.
345 *
346 * As in case of Py_CLEAR "the obvious" code can be deadly:
347 *
348 * Py_DECREF(op);
349 * op = op2;
350 *
351 * The safe way is:
352 *
353 * Py_SETREF(op, op2);
354 *
355 * That arranges to set `op` to `op2` _before_ decref'ing, so that any code
356 * triggered as a side-effect of `op` getting torn down no longer believes
357 * `op` points to a valid object.
358 *
359 * Py_XSETREF is a variant of Py_SETREF that uses Py_XDECREF instead of
360 * Py_DECREF.
361 */
362
363#define Py_SETREF(op, op2) \
364 do { \
365 PyObject *_py_tmp = _PyObject_CAST(op); \
366 (op) = (op2); \
367 Py_DECREF(_py_tmp); \
368 } while (0)
369
370#define Py_XSETREF(op, op2) \
371 do { \
372 PyObject *_py_tmp = _PyObject_CAST(op); \
373 (op) = (op2); \
374 Py_XDECREF(_py_tmp); \
375 } while (0)
376
377
378PyAPI_DATA(PyTypeObject) _PyNone_Type;
379PyAPI_DATA(PyTypeObject) _PyNotImplemented_Type;
380
381/* Maps Py_LT to Py_GT, ..., Py_GE to Py_LE.
382 * Defined in object.c.
383 */
384PyAPI_DATA(int) _Py_SwappedOp[];
385
Victor Stinner6eb99662018-11-26 17:09:16 +0100386PyAPI_FUNC(void)
387_PyDebugAllocatorStats(FILE *out, const char *block_name, int num_blocks,
388 size_t sizeof_block);
389PyAPI_FUNC(void)
390_PyObject_DebugTypeStats(FILE *out);
391
392/* Define a pair of assertion macros:
393 _PyObject_ASSERT_FROM(), _PyObject_ASSERT_WITH_MSG() and _PyObject_ASSERT().
394
395 These work like the regular C assert(), in that they will abort the
396 process with a message on stderr if the given condition fails to hold,
397 but compile away to nothing if NDEBUG is defined.
398
399 However, before aborting, Python will also try to call _PyObject_Dump() on
400 the given object. This may be of use when investigating bugs in which a
401 particular object is corrupt (e.g. buggy a tp_visit method in an extension
402 module breaking the garbage collector), to help locate the broken objects.
403
404 The WITH_MSG variant allows you to supply an additional message that Python
405 will attempt to print to stderr, after the object dump. */
406#ifdef NDEBUG
407 /* No debugging: compile away the assertions: */
408# define _PyObject_ASSERT_FROM(obj, expr, msg, filename, lineno, func) \
409 ((void)0)
410#else
411 /* With debugging: generate checks: */
412# define _PyObject_ASSERT_FROM(obj, expr, msg, filename, lineno, func) \
413 ((expr) \
414 ? (void)(0) \
415 : _PyObject_AssertFailed((obj), Py_STRINGIFY(expr), \
416 (msg), (filename), (lineno), (func)))
417#endif
418
419#define _PyObject_ASSERT_WITH_MSG(obj, expr, msg) \
420 _PyObject_ASSERT_FROM(obj, expr, msg, __FILE__, __LINE__, __func__)
421#define _PyObject_ASSERT(obj, expr) \
422 _PyObject_ASSERT_WITH_MSG(obj, expr, NULL)
423
424#define _PyObject_ASSERT_FAILED_MSG(obj, msg) \
425 _PyObject_AssertFailed((obj), NULL, (msg), __FILE__, __LINE__, __func__)
426
427/* Declare and define _PyObject_AssertFailed() even when NDEBUG is defined,
428 to avoid causing compiler/linker errors when building extensions without
429 NDEBUG against a Python built with NDEBUG defined.
430
431 msg, expr and function can be NULL. */
Victor Stinner2a4903f2020-01-30 13:09:11 +0100432PyAPI_FUNC(void) _Py_NO_RETURN _PyObject_AssertFailed(
Victor Stinner6eb99662018-11-26 17:09:16 +0100433 PyObject *obj,
434 const char *expr,
435 const char *msg,
436 const char *file,
437 int line,
438 const char *function);
439
Victor Stinner0fc91ee2019-04-12 21:51:34 +0200440/* Check if an object is consistent. For example, ensure that the reference
441 counter is greater than or equal to 1, and ensure that ob_type is not NULL.
442
443 Call _PyObject_AssertFailed() if the object is inconsistent.
444
445 If check_content is zero, only check header fields: reduce the overhead.
446
447 The function always return 1. The return value is just here to be able to
448 write:
449
450 assert(_PyObject_CheckConsistency(obj, 1)); */
451PyAPI_FUNC(int) _PyObject_CheckConsistency(
452 PyObject *op,
453 int check_content);
454
Victor Stinner0fa4f432020-02-05 12:23:27 +0100455
456/* Trashcan mechanism, thanks to Christian Tismer.
457
458When deallocating a container object, it's possible to trigger an unbounded
459chain of deallocations, as each Py_DECREF in turn drops the refcount on "the
460next" object in the chain to 0. This can easily lead to stack overflows,
461especially in threads (which typically have less stack space to work with).
462
463A container object can avoid this by bracketing the body of its tp_dealloc
464function with a pair of macros:
465
466static void
467mytype_dealloc(mytype *p)
468{
469 ... declarations go here ...
470
471 PyObject_GC_UnTrack(p); // must untrack first
472 Py_TRASHCAN_BEGIN(p, mytype_dealloc)
473 ... The body of the deallocator goes here, including all calls ...
474 ... to Py_DECREF on contained objects. ...
475 Py_TRASHCAN_END // there should be no code after this
476}
477
478CAUTION: Never return from the middle of the body! If the body needs to
479"get out early", put a label immediately before the Py_TRASHCAN_END
480call, and goto it. Else the call-depth counter (see below) will stay
481above 0 forever, and the trashcan will never get emptied.
482
483How it works: The BEGIN macro increments a call-depth counter. So long
484as this counter is small, the body of the deallocator is run directly without
485further ado. But if the counter gets large, it instead adds p to a list of
486objects to be deallocated later, skips the body of the deallocator, and
487resumes execution after the END macro. The tp_dealloc routine then returns
488without deallocating anything (and so unbounded call-stack depth is avoided).
489
490When the call stack finishes unwinding again, code generated by the END macro
491notices this, and calls another routine to deallocate all the objects that
492may have been added to the list of deferred deallocations. In effect, a
493chain of N deallocations is broken into (N-1)/(PyTrash_UNWIND_LEVEL-1) pieces,
494with the call stack never exceeding a depth of PyTrash_UNWIND_LEVEL.
495
496Since the tp_dealloc of a subclass typically calls the tp_dealloc of the base
497class, we need to ensure that the trashcan is only triggered on the tp_dealloc
498of the actual class being deallocated. Otherwise we might end up with a
499partially-deallocated object. To check this, the tp_dealloc function must be
500passed as second argument to Py_TRASHCAN_BEGIN().
501*/
502
Victor Stinner38965ec2020-03-13 16:51:52 +0100503/* This is the old private API, invoked by the macros before 3.2.4.
504 Kept for binary compatibility of extensions using the stable ABI. */
505PyAPI_FUNC(void) _PyTrash_deposit_object(PyObject*);
506PyAPI_FUNC(void) _PyTrash_destroy_chain(void);
507
508/* This is the old private API, invoked by the macros before 3.9.
509 Kept for binary compatibility of extensions using the stable ABI. */
Victor Stinner0fa4f432020-02-05 12:23:27 +0100510PyAPI_FUNC(void) _PyTrash_thread_deposit_object(PyObject*);
511PyAPI_FUNC(void) _PyTrash_thread_destroy_chain(void);
512
Victor Stinner38965ec2020-03-13 16:51:52 +0100513/* Forward declarations for PyThreadState */
514struct _ts;
515
516/* Python 3.9 private API, invoked by the macros below. */
517PyAPI_FUNC(int) _PyTrash_begin(struct _ts *tstate, PyObject *op);
518PyAPI_FUNC(void) _PyTrash_end(struct _ts *tstate);
519
Victor Stinner0fa4f432020-02-05 12:23:27 +0100520#define PyTrash_UNWIND_LEVEL 50
521
522#define Py_TRASHCAN_BEGIN_CONDITION(op, cond) \
523 do { \
524 PyThreadState *_tstate = NULL; \
525 /* If "cond" is false, then _tstate remains NULL and the deallocator \
526 * is run normally without involving the trashcan */ \
527 if (cond) { \
528 _tstate = PyThreadState_GET(); \
Victor Stinner38965ec2020-03-13 16:51:52 +0100529 if (_PyTrash_begin(_tstate, _PyObject_CAST(op))) { \
Victor Stinner0fa4f432020-02-05 12:23:27 +0100530 break; \
531 } \
Victor Stinner0fa4f432020-02-05 12:23:27 +0100532 }
533 /* The body of the deallocator is here. */
534#define Py_TRASHCAN_END \
535 if (_tstate) { \
Victor Stinner38965ec2020-03-13 16:51:52 +0100536 _PyTrash_end(_tstate); \
Victor Stinner0fa4f432020-02-05 12:23:27 +0100537 } \
538 } while (0);
539
Victor Stinner38965ec2020-03-13 16:51:52 +0100540#define Py_TRASHCAN_BEGIN(op, dealloc) \
541 Py_TRASHCAN_BEGIN_CONDITION(op, \
Victor Stinner0fa4f432020-02-05 12:23:27 +0100542 Py_TYPE(op)->tp_dealloc == (destructor)(dealloc))
543
544/* For backwards compatibility, these macros enable the trashcan
545 * unconditionally */
546#define Py_TRASHCAN_SAFE_BEGIN(op) Py_TRASHCAN_BEGIN_CONDITION(op, 1)
547#define Py_TRASHCAN_SAFE_END(op) Py_TRASHCAN_END