object.h 18.6 KB
Newer Older
1 2 3 4 5 6
#ifndef Py_OBJECT_H
#define Py_OBJECT_H
#ifdef __cplusplus
extern "C" {
#endif

7

Guido van Rossum's avatar
Guido van Rossum committed
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
/* Object and type object interface */

/*
Objects are structures allocated on the heap.  Special rules apply to
the use of objects to ensure they are properly garbage-collected.
Objects are never allocated statically or on the stack; they must be
accessed through special macros and functions only.  (Type objects are
exceptions to the first rule; the standard types are represented by
statically initialized type objects.)

An object has a 'reference count' that is increased or decreased when a
pointer to the object is copied or deleted; when the reference count
reaches zero there are no references to the object left and it can be
removed from the heap.

An object has a 'type' that determines what it represents and what kind
of data it contains.  An object's type is fixed when it is created.
Types themselves are represented as objects; an object contains a
pointer to the corresponding type object.  The type itself has a type
pointer pointing to the object representing the type 'type', which
contains a pointer to itself!).

Objects do not float around in memory; once allocated an object keeps
the same size and address.  Objects that must hold variable-size data
can contain pointers to variable-size parts of the object.  Not all
objects of the same type have the same size; but the size cannot change
after allocation.  (These restrictions are made so a reference to an
object can be simply a pointer -- moving an object would require
updating all the pointers, and changing an object's size would require
moving it if there was another object right next to it.)

39 40
Objects are always accessed through pointers of the type 'PyObject *'.
The type 'PyObject' is a structure that only contains the reference count
Guido van Rossum's avatar
Guido van Rossum committed
41 42 43
and the type pointer.  The actual memory allocated for an object
contains other data that can only be accessed after casting the pointer
to a pointer to a longer structure type.  This longer type must start
44
with the reference count and type fields; the macro PyObject_HEAD should be
45
used for this (to accommodate for future changes).  The implementation
Guido van Rossum's avatar
Guido van Rossum committed
46 47 48 49 50 51 52
of a particular object type can cast the object pointer to the proper
type and back.

A standard interface exists for objects that contain an array of items
whose size is determined when the object is allocated.
*/

53
#ifdef Py_DEBUG
Guido van Rossum's avatar
Guido van Rossum committed
54 55

/* Turn on heavy reference debugging */
56
#define Py_TRACE_REFS
Guido van Rossum's avatar
Guido van Rossum committed
57 58

/* Turn on reference counting */
59
#define Py_REF_DEBUG
Guido van Rossum's avatar
Guido van Rossum committed
60

61
#endif /* Py_DEBUG */
Guido van Rossum's avatar
Guido van Rossum committed
62

63 64
#ifdef Py_TRACE_REFS
#define PyObject_HEAD \
Guido van Rossum's avatar
Guido van Rossum committed
65
	struct _object *_ob_next, *_ob_prev; \
66
	int ob_refcnt; \
Guido van Rossum's avatar
Guido van Rossum committed
67
	struct _typeobject *ob_type;
68
#define PyObject_HEAD_INIT(type) 0, 0, 1, type,
69
#else /* !Py_TRACE_REFS */
70
#define PyObject_HEAD \
Guido van Rossum's avatar
Guido van Rossum committed
71
	int ob_refcnt; \
Guido van Rossum's avatar
Guido van Rossum committed
72
	struct _typeobject *ob_type;
73
#define PyObject_HEAD_INIT(type) 1, type,
74
#endif /* !Py_TRACE_REFS */
Guido van Rossum's avatar
Guido van Rossum committed
75

76 77
#define PyObject_VAR_HEAD \
	PyObject_HEAD \
Guido van Rossum's avatar
Guido van Rossum committed
78
	int ob_size; /* Number of items in variable part */
Guido van Rossum's avatar
Guido van Rossum committed
79 80
 
typedef struct _object {
81 82
	PyObject_HEAD
} PyObject;
Guido van Rossum's avatar
Guido van Rossum committed
83 84

typedef struct {
85
	PyObject_VAR_HEAD
86
} PyVarObject;
Guido van Rossum's avatar
Guido van Rossum committed
87 88 89 90 91 92 93


/*
Type objects contain a string containing the type name (to help somewhat
in debugging), the allocation parameters (see newobj() and newvarobj()),
and methods for accessing objects of the type.  Methods are optional,a
nil pointer meaning that particular kind of access is not available for
94
this type.  The Py_DECREF() macro uses the tp_dealloc method without
Guido van Rossum's avatar
Guido van Rossum committed
95 96 97 98 99 100 101 102
checking for a nil pointer; it should always be implemented except if
the implementation can guarantee that the reference count will never
reach zero (e.g., for type objects).

NB: the methods for certain type groups are now contained in separate
method blocks.
*/

103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
typedef PyObject * (*unaryfunc)(PyObject *);
typedef PyObject * (*binaryfunc)(PyObject *, PyObject *);
typedef PyObject * (*ternaryfunc)(PyObject *, PyObject *, PyObject *);
typedef int (*inquiry)(PyObject *);
typedef int (*coercion)(PyObject **, PyObject **);
typedef PyObject *(*intargfunc)(PyObject *, int);
typedef PyObject *(*intintargfunc)(PyObject *, int, int);
typedef int(*intobjargproc)(PyObject *, int, PyObject *);
typedef int(*intintobjargproc)(PyObject *, int, int, PyObject *);
typedef int(*objobjargproc)(PyObject *, PyObject *, PyObject *);
typedef int (*getreadbufferproc)(PyObject *, int, void **);
typedef int (*getwritebufferproc)(PyObject *, int, void **);
typedef int (*getsegcountproc)(PyObject *, int *);
typedef int (*getcharbufferproc)(PyObject *, int, const char **);
typedef int (*objobjproc)(PyObject *, PyObject *);
typedef int (*visitproc)(PyObject *, void *);
typedef int (*traverseproc)(PyObject *, visitproc, void *);
120

Guido van Rossum's avatar
Guido van Rossum committed
121
typedef struct {
122 123 124 125 126 127
	binaryfunc nb_add;
	binaryfunc nb_subtract;
	binaryfunc nb_multiply;
	binaryfunc nb_divide;
	binaryfunc nb_remainder;
	binaryfunc nb_divmod;
128
	ternaryfunc nb_power;
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
	unaryfunc nb_negative;
	unaryfunc nb_positive;
	unaryfunc nb_absolute;
	inquiry nb_nonzero;
	unaryfunc nb_invert;
	binaryfunc nb_lshift;
	binaryfunc nb_rshift;
	binaryfunc nb_and;
	binaryfunc nb_xor;
	binaryfunc nb_or;
	coercion nb_coerce;
	unaryfunc nb_int;
	unaryfunc nb_long;
	unaryfunc nb_float;
	unaryfunc nb_oct;
	unaryfunc nb_hex;
145 146 147 148 149 150 151 152 153 154 155
	binaryfunc nb_inplace_add;
	binaryfunc nb_inplace_subtract;
	binaryfunc nb_inplace_multiply;
	binaryfunc nb_inplace_divide;
	binaryfunc nb_inplace_remainder;
	ternaryfunc nb_inplace_power;
	binaryfunc nb_inplace_lshift;
	binaryfunc nb_inplace_rshift;
	binaryfunc nb_inplace_and;
	binaryfunc nb_inplace_xor;
	binaryfunc nb_inplace_or;
156
} PyNumberMethods;
Guido van Rossum's avatar
Guido van Rossum committed
157 158

typedef struct {
159 160 161 162 163 164 165
	inquiry sq_length;
	binaryfunc sq_concat;
	intargfunc sq_repeat;
	intargfunc sq_item;
	intintargfunc sq_slice;
	intobjargproc sq_ass_item;
	intintobjargproc sq_ass_slice;
166
	objobjproc sq_contains;
167 168
	binaryfunc sq_inplace_concat;
	intargfunc sq_inplace_repeat;
169
} PySequenceMethods;
Guido van Rossum's avatar
Guido van Rossum committed
170 171

typedef struct {
172 173 174
	inquiry mp_length;
	binaryfunc mp_subscript;
	objobjargproc mp_ass_subscript;
175
} PyMappingMethods;
Guido van Rossum's avatar
Guido van Rossum committed
176

177 178 179 180
typedef struct {
	getreadbufferproc bf_getreadbuffer;
	getwritebufferproc bf_getwritebuffer;
	getsegcountproc bf_getsegcount;
181
	getcharbufferproc bf_getcharbuffer;
182 183 184
} PyBufferProcs;
	

185 186 187 188 189 190 191 192 193
typedef void (*destructor)(PyObject *);
typedef int (*printfunc)(PyObject *, FILE *, int);
typedef PyObject *(*getattrfunc)(PyObject *, char *);
typedef PyObject *(*getattrofunc)(PyObject *, PyObject *);
typedef int (*setattrfunc)(PyObject *, char *, PyObject *);
typedef int (*setattrofunc)(PyObject *, PyObject *, PyObject *);
typedef int (*cmpfunc)(PyObject *, PyObject *);
typedef PyObject *(*reprfunc)(PyObject *);
typedef long (*hashfunc)(PyObject *);
194

Guido van Rossum's avatar
Guido van Rossum committed
195
typedef struct _typeobject {
196
	PyObject_VAR_HEAD
Guido van Rossum's avatar
Guido van Rossum committed
197
	char *tp_name; /* For printing */
Guido van Rossum's avatar
Guido van Rossum committed
198
	int tp_basicsize, tp_itemsize; /* For allocation */
Guido van Rossum's avatar
Guido van Rossum committed
199 200 201
	
	/* Methods to implement standard operations */
	
202 203 204 205 206 207
	destructor tp_dealloc;
	printfunc tp_print;
	getattrfunc tp_getattr;
	setattrfunc tp_setattr;
	cmpfunc tp_compare;
	reprfunc tp_repr;
Guido van Rossum's avatar
Guido van Rossum committed
208 209 210
	
	/* Method suites for standard classes */
	
211 212 213
	PyNumberMethods *tp_as_number;
	PySequenceMethods *tp_as_sequence;
	PyMappingMethods *tp_as_mapping;
214

215
	/* More standard operations (here for binary compatibility) */
216

217
	hashfunc tp_hash;
218
	ternaryfunc tp_call;
219
	reprfunc tp_str;
220 221
	getattrofunc tp_getattro;
	setattrofunc tp_setattro;
222

223 224 225
	/* Functions to access object as input/output buffer */
	PyBufferProcs *tp_as_buffer;
	
226 227
	/* Flags to define presence of optional/expanded features */
	long tp_flags;
228 229 230

	char *tp_doc; /* Documentation string */

231 232 233 234 235 236
	/* call function for all accessible objects */
	traverseproc tp_traverse;
	
	/* delete references to contained objects */
	inquiry tp_clear;

237 238 239 240
	/* More spares */
	long tp_xxx7;
	long tp_xxx8;

241 242 243 244 245 246 247
#ifdef COUNT_ALLOCS
	/* these must be last */
	int tp_alloc;
	int tp_free;
	int tp_maxalloc;
	struct _typeobject *tp_next;
#endif
248
} PyTypeObject;
Guido van Rossum's avatar
Guido van Rossum committed
249

250
extern DL_IMPORT(PyTypeObject) PyType_Type; /* The type of type objects */
Guido van Rossum's avatar
Guido van Rossum committed
251

252
#define PyType_Check(op) ((op)->ob_type == &PyType_Type)
Guido van Rossum's avatar
Guido van Rossum committed
253

Guido van Rossum's avatar
Guido van Rossum committed
254
/* Generic operations on objects */
255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
extern DL_IMPORT(int) PyObject_Print(PyObject *, FILE *, int);
extern DL_IMPORT(PyObject *) PyObject_Repr(PyObject *);
extern DL_IMPORT(PyObject *) PyObject_Str(PyObject *);
extern DL_IMPORT(int) PyObject_Compare(PyObject *, PyObject *);
extern DL_IMPORT(PyObject *) PyObject_GetAttrString(PyObject *, char *);
extern DL_IMPORT(int) PyObject_SetAttrString(PyObject *, char *, PyObject *);
extern DL_IMPORT(int) PyObject_HasAttrString(PyObject *, char *);
extern DL_IMPORT(PyObject *) PyObject_GetAttr(PyObject *, PyObject *);
extern DL_IMPORT(int) PyObject_SetAttr(PyObject *, PyObject *, PyObject *);
extern DL_IMPORT(int) PyObject_HasAttr(PyObject *, PyObject *);
extern DL_IMPORT(long) PyObject_Hash(PyObject *);
extern DL_IMPORT(int) PyObject_IsTrue(PyObject *);
extern DL_IMPORT(int) PyObject_Not(PyObject *);
extern DL_IMPORT(int) PyCallable_Check(PyObject *);
extern DL_IMPORT(int) PyNumber_Coerce(PyObject **, PyObject **);
extern DL_IMPORT(int) PyNumber_CoerceEx(PyObject **, PyObject **);
Guido van Rossum's avatar
Guido van Rossum committed
271

272
/* Helpers for printing recursive container types */
273 274
extern DL_IMPORT(int) Py_ReprEnter(PyObject *);
extern DL_IMPORT(void) Py_ReprLeave(PyObject *);
275

276 277 278
/* tstate dict key for PyObject_Compare helper */
extern PyObject *_PyCompareState_Key;

279
/* Helpers for hash functions */
280 281
extern DL_IMPORT(long) _Py_HashDouble(double);
extern DL_IMPORT(long) _Py_HashPointer(void*);
282

Guido van Rossum's avatar
Guido van Rossum committed
283
/* Flag bits for printing: */
284
#define Py_PRINT_RAW	1	/* No string quotes etc. */
Guido van Rossum's avatar
Guido van Rossum committed
285

286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311
/*

Type flags (tp_flags)

These flags are used to extend the type structure in a backwards-compatible
fashion. Extensions can use the flags to indicate (and test) when a given
type structure contains a new feature. The Python core will use these when
introducing new functionality between major revisions (to avoid mid-version
changes in the PYTHON_API_VERSION).

Arbitration of the flag bit positions will need to be coordinated among
all extension writers who publically release their extensions (this will
be fewer than you might expect!)..

Python 1.5.2 introduced the bf_getcharbuffer slot into PyBufferProcs.

Type definitions should use Py_TPFLAGS_DEFAULT for their tp_flags value.

Code can use PyType_HasFeature(type_ob, flag_value) to test whether the
given type object has a specified feature.

*/

/* PyBufferProcs contains bf_getcharbuffer */
#define Py_TPFLAGS_HAVE_GETCHARBUFFER  (1L<<0)

312 313 314
/* PySequenceMethods contains sq_contains */
#define Py_TPFLAGS_HAVE_SEQUENCE_IN (1L<<1)

315 316 317 318 319 320 321
/* Objects which participate in garbage collection (see objimp.h) */
#ifdef WITH_CYCLE_GC
#define Py_TPFLAGS_GC (1L<<2)
#else
#define Py_TPFLAGS_GC 0
#endif

322 323 324
/* PySequenceMethods and PyNumberMethods contain in-place operators */
#define Py_TPFLAGS_HAVE_INPLACEOPS (1L<<3)

325
#define Py_TPFLAGS_DEFAULT  (Py_TPFLAGS_HAVE_GETCHARBUFFER | \
326 327
                             Py_TPFLAGS_HAVE_SEQUENCE_IN | \
                             Py_TPFLAGS_HAVE_INPLACEOPS)
328 329 330 331

#define PyType_HasFeature(t,f)  (((t)->tp_flags & (f)) != 0)


Guido van Rossum's avatar
Guido van Rossum committed
332
/*
333 334
The macros Py_INCREF(op) and Py_DECREF(op) are used to increment or decrement
reference counts.  Py_DECREF calls the object's deallocator function; for
Guido van Rossum's avatar
Guido van Rossum committed
335 336
objects that don't contain references to other objects or heap memory
this can be the standard function free().  Both macros can be used
337
wherever a void expression is allowed.  The argument shouldn't be a
338 339
NIL pointer.  The macro _Py_NewReference(op) is used only to initialize
reference counts to 1; it is defined here for convenience.
Guido van Rossum's avatar
Guido van Rossum committed
340 341 342 343 344 345 346 347 348 349 350 351

We assume that the reference count field can never overflow; this can
be proven when the size of the field is the same as the pointer size
but even with a 16-bit reference count field it is pretty unlikely so
we ignore the possibility.  (If you are paranoid, make it a long.)

Type objects should never be deallocated; the type pointer in an object
is not considered to be a reference to the type object, to save
complications in the deallocation function.  (This is actually a
decision that's up to the implementer of each new type so if you want,
you can count such references to the type object.)

352
*** WARNING*** The Py_DECREF macro must have a side-effect-free argument
Guido van Rossum's avatar
Guido van Rossum committed
353 354 355 356 357 358
since it may evaluate its argument multiple times.  (The alternative
would be to mace it a proper function or assign it to a global temporary
variable first, both of which are slower; and in a multi-threaded
environment the global variable trick is not safe.)
*/

359 360 361
#ifdef Py_TRACE_REFS
#ifndef Py_REF_DEBUG
#define Py_REF_DEBUG
Guido van Rossum's avatar
Guido van Rossum committed
362 363 364
#endif
#endif

365
#ifdef Py_TRACE_REFS
366 367 368 369 370
extern DL_IMPORT(void) _Py_Dealloc(PyObject *);
extern DL_IMPORT(void) _Py_NewReference(PyObject *);
extern DL_IMPORT(void) _Py_ForgetReference(PyObject *);
extern DL_IMPORT(void) _Py_PrintReferences(FILE *);
extern DL_IMPORT(void) _Py_ResetReferences(void);
371 372
#endif

373
#ifndef Py_TRACE_REFS
374
#ifdef COUNT_ALLOCS
375
#define _Py_Dealloc(op) ((op)->ob_type->tp_free++, (*(op)->ob_type->tp_dealloc)((PyObject *)(op)))
376
#define _Py_ForgetReference(op) ((op)->ob_type->tp_free++)
377
#else /* !COUNT_ALLOCS */
378 379
#define _Py_Dealloc(op) (*(op)->ob_type->tp_dealloc)((PyObject *)(op))
#define _Py_ForgetReference(op) /*empty*/
380 381
#endif /* !COUNT_ALLOCS */
#endif /* !Py_TRACE_REFS */
Guido van Rossum's avatar
Guido van Rossum committed
382

383
#ifdef COUNT_ALLOCS
384
extern DL_IMPORT(void) inc_count(PyTypeObject *);
385 386
#endif

387
#ifdef Py_REF_DEBUG
388

389
extern DL_IMPORT(long) _Py_RefTotal;
390

391
#ifndef Py_TRACE_REFS
392
#ifdef COUNT_ALLOCS
393
#define _Py_NewReference(op) (inc_count((op)->ob_type), _Py_RefTotal++, (op)->ob_refcnt = 1)
394
#else
395
#define _Py_NewReference(op) (_Py_RefTotal++, (op)->ob_refcnt = 1)
Guido van Rossum's avatar
Guido van Rossum committed
396
#endif
397 398
#endif /* !Py_TRACE_REFS */

399
#define Py_INCREF(op) (_Py_RefTotal++, (op)->ob_refcnt++)
400
#define Py_DECREF(op) \
401
	if (--_Py_RefTotal, --(op)->ob_refcnt != 0) \
Guido van Rossum's avatar
Guido van Rossum committed
402 403
		; \
	else \
404
		_Py_Dealloc((PyObject *)(op))
405 406
#else /* !Py_REF_DEBUG */

407
#ifdef COUNT_ALLOCS
408
#define _Py_NewReference(op) (inc_count((op)->ob_type), (op)->ob_refcnt = 1)
409
#else
410
#define _Py_NewReference(op) ((op)->ob_refcnt = 1)
411
#endif
412

413 414
#define Py_INCREF(op) ((op)->ob_refcnt++)
#define Py_DECREF(op) \
Guido van Rossum's avatar
Guido van Rossum committed
415
	if (--(op)->ob_refcnt != 0) \
Guido van Rossum's avatar
Guido van Rossum committed
416 417
		; \
	else \
418
		_Py_Dealloc((PyObject *)(op))
419
#endif /* !Py_REF_DEBUG */
Guido van Rossum's avatar
Guido van Rossum committed
420

Guido van Rossum's avatar
Guido van Rossum committed
421 422
/* Macros to use in case the object pointer may be NULL: */

423 424
#define Py_XINCREF(op) if ((op) == NULL) ; else Py_INCREF(op)
#define Py_XDECREF(op) if ((op) == NULL) ; else Py_DECREF(op)
Guido van Rossum's avatar
Guido van Rossum committed
425 426

/*
427
_Py_NoneStruct is an object of undefined type which can be used in contexts
Guido van Rossum's avatar
Guido van Rossum committed
428 429
where NULL (nil) is not suitable (since NULL often means 'error').

430
Don't forget to apply Py_INCREF() when returning this value!!!
Guido van Rossum's avatar
Guido van Rossum committed
431 432
*/

433
extern DL_IMPORT(PyObject) _Py_NoneStruct; /* Don't use this directly */
Guido van Rossum's avatar
Guido van Rossum committed
434

435
#define Py_None (&_Py_NoneStruct)
Guido van Rossum's avatar
Guido van Rossum committed
436 437


438 439
/*
A common programming style in Python requires the forward declaration
440
of static, initialized structures, e.g. for a type object that is used
441 442 443 444 445 446 447 448 449 450 451 452 453 454 455
by the functions whose address must be used in the initializer.
Some compilers (notably SCO ODT 3.0, I seem to remember early AIX as
well) botch this if you use the static keyword for both declarations
(they allocate two objects, and use the first, uninitialized one until
the second declaration is encountered).  Therefore, the forward
declaration should use the 'forwardstatic' keyword.  This expands to
static on most systems, but to extern on a few.  The actual storage
and name will still be static because the second declaration is
static, so no linker visible symbols will be generated.  (Standard C
compilers take offense to the extern forward declaration of a static
object, so I can't just put extern in all cases. :-( )
*/

#ifdef BAD_STATIC_FORWARD
#define staticforward extern
456 457
#define statichere static
#else /* !BAD_STATIC_FORWARD */
458
#define staticforward static
459 460
#define statichere static
#endif /* !BAD_STATIC_FORWARD */
461 462


Guido van Rossum's avatar
Guido van Rossum committed
463 464 465 466 467 468 469 470 471 472 473 474 475 476 477
/*
More conventions
================

Argument Checking
-----------------

Functions that take objects as arguments normally don't check for nil
arguments, but they do check the type of the argument, and return an
error if the function doesn't apply to the type.

Failure Modes
-------------

Functions may fail for a variety of reasons, including running out of
Guido van Rossum's avatar
Guido van Rossum committed
478 479 480 481 482 483
memory.  This is communicated to the caller in two ways: an error string
is set (see errors.h), and the function result differs: functions that
normally return a pointer return NULL for failure, functions returning
an integer return -1 (which could be a legal return value too!), and
other functions return 0 for success and -1 for failure.
Callers should always check for errors before using the result.
Guido van Rossum's avatar
Guido van Rossum committed
484 485 486 487 488 489 490

Reference Counts
----------------

It takes a while to get used to the proper usage of reference counts.

Functions that create an object set the reference count to 1; such new
491 492 493
objects must be stored somewhere or destroyed again with Py_DECREF().
Functions that 'store' objects such as PyTuple_SetItem() and
PyDict_SetItemString()
Guido van Rossum's avatar
Guido van Rossum committed
494 495
don't increment the reference count of the object, since the most
frequent use is to store a fresh object.  Functions that 'retrieve'
496 497
objects such as PyTuple_GetItem() and PyDict_GetItemString() also
don't increment
Guido van Rossum's avatar
Guido van Rossum committed
498 499
the reference count, since most frequently the object is only looked at
quickly.  Thus, to retrieve an object and store it again, the caller
500
must call Py_INCREF() explicitly.
Guido van Rossum's avatar
Guido van Rossum committed
501

502
NOTE: functions that 'consume' a reference count like
503 504
PyList_SetItemString() even consume the reference if the object wasn't
stored, to simplify error handling.
Guido van Rossum's avatar
Guido van Rossum committed
505 506 507 508

It seems attractive to make other functions that take an object as
argument consume a reference count; however this may quickly get
confusing (even the current practice is already confusing).  Consider
509
it carefully, it may save lots of calls to Py_INCREF() and Py_DECREF() at
Guido van Rossum's avatar
Guido van Rossum committed
510 511
times.
*/
512

513 514 515 516 517 518 519 520 521
/*
  trashcan
  CT 2k0130
  non-recursively destroy nested objects

  CT 2k0223
  redefinition for better locality and less overhead.

  Objects that want to be recursion safe need to use
522
  the macro's 
523 524 525 526 527 528 529 530 531
		Py_TRASHCAN_SAFE_BEGIN(name)
  and
		Py_TRASHCAN_SAFE_END(name)
  surrounding their actual deallocation code.

  It would be nice to do this using the thread state.
  Also, we could do an exact stack measure then.
  Unfortunately, deallocations also take place when
  the thread state is undefined.
532 533 534 535 536

  CT 2k0422 complete rewrite.
  There is no need to allocate new objects.
  Everything is done vialob_refcnt and ob_type now.
  Adding support for free-threading should be easy, too.
537 538 539 540 541 542 543 544 545 546 547 548 549 550 551
*/

#define PyTrash_UNWIND_LEVEL 50

#define Py_TRASHCAN_SAFE_BEGIN(op) \
	{ \
		++_PyTrash_delete_nesting; \
		if (_PyTrash_delete_nesting < PyTrash_UNWIND_LEVEL) { \

#define Py_TRASHCAN_SAFE_END(op) \
		;} \
		else \
			_PyTrash_deposit_object((PyObject*)op);\
		--_PyTrash_delete_nesting; \
		if (_PyTrash_delete_later && _PyTrash_delete_nesting <= 0) \
552
			_PyTrash_destroy_chain(); \
553 554
	} \

555
extern DL_IMPORT(void) _PyTrash_deposit_object(PyObject*);
556
extern DL_IMPORT(void) _PyTrash_destroy_chain(void);
557 558 559 560 561 562 563 564

extern DL_IMPORT(int) _PyTrash_delete_nesting;
extern DL_IMPORT(PyObject *) _PyTrash_delete_later;

/* swap the "xx" to check the speed loss */

#define xxPy_TRASHCAN_SAFE_BEGIN(op) 
#define xxPy_TRASHCAN_SAFE_END(op) ;
565

566 567 568 569
#ifdef __cplusplus
}
#endif
#endif /* !Py_OBJECT_H */