| 
									
										
										
										
											2019-05-17 11:55:34 +02:00
										 |  |  | .. highlight:: c
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. _supporting-cycle-detection:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Supporting Cyclic Garbage Collection
 | 
					
						
							|  |  |  | ====================================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Python's support for detecting and collecting garbage which involves circular
 | 
					
						
							|  |  |  | references requires support from object types which are "containers" for other
 | 
					
						
							|  |  |  | objects which may also be containers.  Types which do not store references to
 | 
					
						
							|  |  |  | other objects, or which only store references to atomic types (such as numbers
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 71898-71900,71910,71914-71919 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r71898 | jeroen.ruigrok | 2009-04-25 16:24:30 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71899 | jeroen.ruigrok | 2009-04-25 16:27:00 +0200 (za, 25 apr 2009) | 3 lines
  The type for ppos has been Py_ssize_t since 2.5, reflect this in the
  documentation.
........
  r71900 | jeroen.ruigrok | 2009-04-25 16:28:02 +0200 (za, 25 apr 2009) | 2 lines
  Reformat paragraph.
........
  r71910 | jeroen.ruigrok | 2009-04-25 19:59:03 +0200 (za, 25 apr 2009) | 4 lines
  Issue #4129: Belatedly document which C API functions had their argument(s) or
  return type changed from int or int * to Py_ssize_t or Py_ssize_t * as this
  might cause problems on 64-bit platforms.
........
  r71914 | jeroen.ruigrok | 2009-04-25 20:31:20 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71915 | jeroen.ruigrok | 2009-04-25 20:46:03 +0200 (za, 25 apr 2009) | 2 lines
  Issue #4129: Document more int -> Py_ssize_t changes.
........
  r71916 | jeroen.ruigrok | 2009-04-25 20:53:48 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71917 | jeroen.ruigrok | 2009-04-25 20:57:32 +0200 (za, 25 apr 2009) | 2 lines
  Reference to an int type, whereas it's a Py_ssize_t as the synopsis states.
........
  r71918 | jeroen.ruigrok | 2009-04-25 21:04:15 +0200 (za, 25 apr 2009) | 2 lines
  Since I edited this file, reformat for future edits.
........
  r71919 | jeroen.ruigrok | 2009-04-25 21:10:52 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
											
										 
											2009-04-26 21:06:15 +00:00
										 |  |  | or strings), do not need to provide any explicit support for garbage
 | 
					
						
							|  |  |  | collection.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  | To create a container type, the :c:member:`~PyTypeObject.tp_flags` field of the type object must
 | 
					
						
							| 
									
										
										
										
											2023-07-21 10:52:07 +03:00
										 |  |  | include the :c:macro:`Py_TPFLAGS_HAVE_GC` and provide an implementation of the
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  | :c:member:`~PyTypeObject.tp_traverse` handler.  If instances of the type are mutable, a
 | 
					
						
							|  |  |  | :c:member:`~PyTypeObject.tp_clear` implementation must also be provided.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-21 10:52:07 +03:00
										 |  |  | :c:macro:`Py_TPFLAGS_HAVE_GC`
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 71898-71900,71910,71914-71919 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r71898 | jeroen.ruigrok | 2009-04-25 16:24:30 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71899 | jeroen.ruigrok | 2009-04-25 16:27:00 +0200 (za, 25 apr 2009) | 3 lines
  The type for ppos has been Py_ssize_t since 2.5, reflect this in the
  documentation.
........
  r71900 | jeroen.ruigrok | 2009-04-25 16:28:02 +0200 (za, 25 apr 2009) | 2 lines
  Reformat paragraph.
........
  r71910 | jeroen.ruigrok | 2009-04-25 19:59:03 +0200 (za, 25 apr 2009) | 4 lines
  Issue #4129: Belatedly document which C API functions had their argument(s) or
  return type changed from int or int * to Py_ssize_t or Py_ssize_t * as this
  might cause problems on 64-bit platforms.
........
  r71914 | jeroen.ruigrok | 2009-04-25 20:31:20 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71915 | jeroen.ruigrok | 2009-04-25 20:46:03 +0200 (za, 25 apr 2009) | 2 lines
  Issue #4129: Document more int -> Py_ssize_t changes.
........
  r71916 | jeroen.ruigrok | 2009-04-25 20:53:48 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71917 | jeroen.ruigrok | 2009-04-25 20:57:32 +0200 (za, 25 apr 2009) | 2 lines
  Reference to an int type, whereas it's a Py_ssize_t as the synopsis states.
........
  r71918 | jeroen.ruigrok | 2009-04-25 21:04:15 +0200 (za, 25 apr 2009) | 2 lines
  Since I edited this file, reformat for future edits.
........
  r71919 | jeroen.ruigrok | 2009-04-25 21:10:52 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
											
										 
											2009-04-26 21:06:15 +00:00
										 |  |  |    Objects with a type with this flag set must conform with the rules
 | 
					
						
							|  |  |  |    documented here.  For convenience these objects will be referred to as
 | 
					
						
							|  |  |  |    container objects.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Constructors for container types must conform to two rules:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-27 02:52:40 +02:00
										 |  |  | #. The memory for the object must be allocated using :c:macro:`PyObject_GC_New`
 | 
					
						
							|  |  |  |    or :c:macro:`PyObject_GC_NewVar`.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #. Once all the fields which may contain references to other containers are
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    initialized, it must call :c:func:`PyObject_GC_Track`.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-27 15:15:13 -04:00
										 |  |  | Similarly, the deallocator for the object must conform to a similar pair of
 | 
					
						
							|  |  |  | rules:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #. Before fields which refer to other containers are invalidated,
 | 
					
						
							|  |  |  |    :c:func:`PyObject_GC_UnTrack` must be called.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #. The object's memory must be deallocated using :c:func:`PyObject_GC_Del`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 03:57:39 +01:00
										 |  |  |    .. warning::
 | 
					
						
							|  |  |  |       If a type adds the Py_TPFLAGS_HAVE_GC, then it *must* implement at least
 | 
					
						
							|  |  |  |       a :c:member:`~PyTypeObject.tp_traverse` handler or explicitly use one
 | 
					
						
							|  |  |  |       from its subclass or subclasses.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 04:32:42 +01:00
										 |  |  |       When calling :c:func:`PyType_Ready` or some of the APIs that indirectly
 | 
					
						
							|  |  |  |       call it like :c:func:`PyType_FromSpecWithBases` or
 | 
					
						
							|  |  |  |       :c:func:`PyType_FromSpec` the interpreter will automatically populate the
 | 
					
						
							| 
									
										
										
										
											2021-05-29 03:57:39 +01:00
										 |  |  |       :c:member:`~PyTypeObject.tp_flags`, :c:member:`~PyTypeObject.tp_traverse`
 | 
					
						
							|  |  |  |       and :c:member:`~PyTypeObject.tp_clear` fields if the type inherits from a
 | 
					
						
							|  |  |  |       class that implements the garbage collector protocol and the child class
 | 
					
						
							| 
									
										
										
										
											2023-07-21 10:52:07 +03:00
										 |  |  |       does *not* include the :c:macro:`Py_TPFLAGS_HAVE_GC` flag.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-27 02:52:40 +02:00
										 |  |  | .. c:macro:: PyObject_GC_New(TYPE, typeobj)
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-27 02:52:40 +02:00
										 |  |  |    Analogous to :c:macro:`PyObject_New` but for container objects with the
 | 
					
						
							| 
									
										
										
										
											2023-07-21 10:52:07 +03:00
										 |  |  |    :c:macro:`Py_TPFLAGS_HAVE_GC` flag set.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-20 08:25:50 -04:00
										 |  |  |    Do not call this directly to allocate memory for an object; call the type's
 | 
					
						
							|  |  |  |    :c:member:`~PyTypeObject.tp_alloc` slot instead.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    When populating a type's :c:member:`~PyTypeObject.tp_alloc` slot,
 | 
					
						
							|  |  |  |    :c:func:`PyType_GenericAlloc` is preferred over a custom function that
 | 
					
						
							|  |  |  |    simply calls this macro.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Memory allocated by this macro must be freed with
 | 
					
						
							|  |  |  |    :c:func:`PyObject_GC_Del` (usually called via the object's
 | 
					
						
							|  |  |  |    :c:member:`~PyTypeObject.tp_free` slot).
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. seealso::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       * :c:func:`PyObject_GC_Del`
 | 
					
						
							|  |  |  |       * :c:macro:`PyObject_New`
 | 
					
						
							|  |  |  |       * :c:func:`PyType_GenericAlloc`
 | 
					
						
							|  |  |  |       * :c:member:`~PyTypeObject.tp_alloc`
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-27 02:52:40 +02:00
										 |  |  | .. c:macro:: PyObject_GC_NewVar(TYPE, typeobj, size)
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-27 02:52:40 +02:00
										 |  |  |    Analogous to :c:macro:`PyObject_NewVar` but for container objects with the
 | 
					
						
							| 
									
										
										
										
											2023-07-21 10:52:07 +03:00
										 |  |  |    :c:macro:`Py_TPFLAGS_HAVE_GC` flag set.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-20 08:25:50 -04:00
										 |  |  |    Do not call this directly to allocate memory for an object; call the type's
 | 
					
						
							|  |  |  |    :c:member:`~PyTypeObject.tp_alloc` slot instead.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    When populating a type's :c:member:`~PyTypeObject.tp_alloc` slot,
 | 
					
						
							|  |  |  |    :c:func:`PyType_GenericAlloc` is preferred over a custom function that
 | 
					
						
							|  |  |  |    simply calls this macro.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Memory allocated by this macro must be freed with
 | 
					
						
							|  |  |  |    :c:func:`PyObject_GC_Del` (usually called via the object's
 | 
					
						
							|  |  |  |    :c:member:`~PyTypeObject.tp_free` slot).
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. seealso::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       * :c:func:`PyObject_GC_Del`
 | 
					
						
							|  |  |  |       * :c:macro:`PyObject_NewVar`
 | 
					
						
							|  |  |  |       * :c:func:`PyType_GenericAlloc`
 | 
					
						
							|  |  |  |       * :c:member:`~PyTypeObject.tp_alloc`
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-02 13:38:46 +02:00
										 |  |  | .. c:function:: PyObject* PyUnstable_Object_GC_NewWithExtraData(PyTypeObject *type, size_t extra_size)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-27 02:52:40 +02:00
										 |  |  |    Analogous to :c:macro:`PyObject_GC_New` but allocates *extra_size*
 | 
					
						
							| 
									
										
										
										
											2023-05-02 13:38:46 +02:00
										 |  |  |    bytes at the end of the object (at offset
 | 
					
						
							|  |  |  |    :c:member:`~PyTypeObject.tp_basicsize`).
 | 
					
						
							|  |  |  |    The allocated memory is initialized to zeros,
 | 
					
						
							|  |  |  |    except for the :c:type:`Python object header <PyObject>`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The extra data will be deallocated with the object, but otherwise it is
 | 
					
						
							|  |  |  |    not managed by Python.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-20 08:25:50 -04:00
										 |  |  |    Memory allocated by this function must be freed with
 | 
					
						
							|  |  |  |    :c:func:`PyObject_GC_Del` (usually called via the object's
 | 
					
						
							|  |  |  |    :c:member:`~PyTypeObject.tp_free` slot).
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-02 13:38:46 +02:00
										 |  |  |    .. warning::
 | 
					
						
							|  |  |  |       The function is marked as unstable because the final mechanism
 | 
					
						
							|  |  |  |       for reserving extra data after an instance is not yet decided.
 | 
					
						
							|  |  |  |       For allocating a variable number of fields, prefer using
 | 
					
						
							|  |  |  |       :c:type:`PyVarObject` and :c:member:`~PyTypeObject.tp_itemsize`
 | 
					
						
							|  |  |  |       instead.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.12
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 71920-71923,71925-71929,71931-71934,71937 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r71920 | jeroen.ruigrok | 2009-04-25 21:44:55 +0200 (za, 25 apr 2009) | 5 lines
  Issue #4129: More documentation pointers about int -> Py_ssize_t.
  Also fix up the documentation for PyObject_GC_Resize(). It seems that since
  it first got documented, the documentation was actually for
  _PyObject_GC_Resize().
........
  r71921 | jeroen.ruigrok | 2009-04-25 21:46:19 +0200 (za, 25 apr 2009) | 2 lines
  Issue #4129: Documentation notes for int -> Py_ssize_t changes.
........
  r71922 | jeroen.ruigrok | 2009-04-25 21:49:05 +0200 (za, 25 apr 2009) | 2 lines
  Reformat, since I've been busy here anyway.
........
  r71923 | jeroen.ruigrok | 2009-04-25 21:54:34 +0200 (za, 25 apr 2009) | 2 lines
  Issue #4129: Add a versionchanged notice for a few forgotten entries.
........
  r71925 | jeroen.ruigrok | 2009-04-25 22:37:39 +0200 (za, 25 apr 2009) | 2 lines
  Since it's a macro, actually refer to it as such instead of function.
........
  r71926 | jeroen.ruigrok | 2009-04-25 22:40:10 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71927 | jeroen.ruigrok | 2009-04-25 22:41:40 +0200 (za, 25 apr 2009) | 2 lines
  Issue #4129: int -> Py_ssize_t documentation.
........
  r71928 | jeroen.ruigrok | 2009-04-25 22:43:30 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71929 | jeroen.ruigrok | 2009-04-25 22:44:58 +0200 (za, 25 apr 2009) | 2 lines
  Issue #4129: int -> Py_ssize_t documentation.
........
  r71931 | jeroen.ruigrok | 2009-04-25 22:50:27 +0200 (za, 25 apr 2009) | 2 lines
  Issue #4129: int -> Py_ssize_t documentation.
........
  r71932 | jeroen.ruigrok | 2009-04-25 22:55:39 +0200 (za, 25 apr 2009) | 2 lines
  Issue #4129: more int -> Py_ssize_t documentation.
........
  r71933 | jeroen.ruigrok | 2009-04-25 22:58:35 +0200 (za, 25 apr 2009) | 2 lines
  Issue #4129: more int -> Py_ssize_t documentation.
........
  r71934 | jeroen.ruigrok | 2009-04-25 23:02:34 +0200 (za, 25 apr 2009) | 2 lines
  Issue #4129: field changed from int to Py_ssize_t.
........
  r71937 | jeroen.ruigrok | 2009-04-25 23:16:05 +0200 (za, 25 apr 2009) | 2 lines
  Issue #4129: document int -> Py_ssize_t changes.
........
											
										 
											2009-04-27 05:43:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-11 01:59:23 +03:00
										 |  |  | .. c:macro:: PyObject_GC_Resize(TYPE, op, newsize)
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-11 01:59:23 +03:00
										 |  |  |    Resize an object allocated by :c:macro:`PyObject_NewVar`.
 | 
					
						
							|  |  |  |    Returns the resized object of type ``TYPE*`` (refers to any C type)
 | 
					
						
							|  |  |  |    or ``NULL`` on failure.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    *op* must be of type :c:expr:`PyVarObject *`
 | 
					
						
							|  |  |  |    and must not be tracked by the collector yet.
 | 
					
						
							|  |  |  |    *newsize* must be of type :c:type:`Py_ssize_t`.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:function:: void PyObject_GC_Track(PyObject *op)
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 71898-71900,71910,71914-71919 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r71898 | jeroen.ruigrok | 2009-04-25 16:24:30 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71899 | jeroen.ruigrok | 2009-04-25 16:27:00 +0200 (za, 25 apr 2009) | 3 lines
  The type for ppos has been Py_ssize_t since 2.5, reflect this in the
  documentation.
........
  r71900 | jeroen.ruigrok | 2009-04-25 16:28:02 +0200 (za, 25 apr 2009) | 2 lines
  Reformat paragraph.
........
  r71910 | jeroen.ruigrok | 2009-04-25 19:59:03 +0200 (za, 25 apr 2009) | 4 lines
  Issue #4129: Belatedly document which C API functions had their argument(s) or
  return type changed from int or int * to Py_ssize_t or Py_ssize_t * as this
  might cause problems on 64-bit platforms.
........
  r71914 | jeroen.ruigrok | 2009-04-25 20:31:20 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71915 | jeroen.ruigrok | 2009-04-25 20:46:03 +0200 (za, 25 apr 2009) | 2 lines
  Issue #4129: Document more int -> Py_ssize_t changes.
........
  r71916 | jeroen.ruigrok | 2009-04-25 20:53:48 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71917 | jeroen.ruigrok | 2009-04-25 20:57:32 +0200 (za, 25 apr 2009) | 2 lines
  Reference to an int type, whereas it's a Py_ssize_t as the synopsis states.
........
  r71918 | jeroen.ruigrok | 2009-04-25 21:04:15 +0200 (za, 25 apr 2009) | 2 lines
  Since I edited this file, reformat for future edits.
........
  r71919 | jeroen.ruigrok | 2009-04-25 21:10:52 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
											
										 
											2009-04-26 21:06:15 +00:00
										 |  |  |    Adds the object *op* to the set of container objects tracked by the
 | 
					
						
							|  |  |  |    collector.  The collector can run at unexpected times so objects must be
 | 
					
						
							|  |  |  |    valid while being tracked.  This should be called once all the fields
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    followed by the :c:member:`~PyTypeObject.tp_traverse` handler become valid, usually near the
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 71898-71900,71910,71914-71919 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r71898 | jeroen.ruigrok | 2009-04-25 16:24:30 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71899 | jeroen.ruigrok | 2009-04-25 16:27:00 +0200 (za, 25 apr 2009) | 3 lines
  The type for ppos has been Py_ssize_t since 2.5, reflect this in the
  documentation.
........
  r71900 | jeroen.ruigrok | 2009-04-25 16:28:02 +0200 (za, 25 apr 2009) | 2 lines
  Reformat paragraph.
........
  r71910 | jeroen.ruigrok | 2009-04-25 19:59:03 +0200 (za, 25 apr 2009) | 4 lines
  Issue #4129: Belatedly document which C API functions had their argument(s) or
  return type changed from int or int * to Py_ssize_t or Py_ssize_t * as this
  might cause problems on 64-bit platforms.
........
  r71914 | jeroen.ruigrok | 2009-04-25 20:31:20 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71915 | jeroen.ruigrok | 2009-04-25 20:46:03 +0200 (za, 25 apr 2009) | 2 lines
  Issue #4129: Document more int -> Py_ssize_t changes.
........
  r71916 | jeroen.ruigrok | 2009-04-25 20:53:48 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71917 | jeroen.ruigrok | 2009-04-25 20:57:32 +0200 (za, 25 apr 2009) | 2 lines
  Reference to an int type, whereas it's a Py_ssize_t as the synopsis states.
........
  r71918 | jeroen.ruigrok | 2009-04-25 21:04:15 +0200 (za, 25 apr 2009) | 2 lines
  Since I edited this file, reformat for future edits.
........
  r71919 | jeroen.ruigrok | 2009-04-25 21:10:52 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
											
										 
											2009-04-26 21:06:15 +00:00
										 |  |  |    end of the constructor.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-15 02:11:20 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. c:function:: int PyObject_IS_GC(PyObject *obj)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Returns non-zero if the object implements the garbage collector protocol,
 | 
					
						
							|  |  |  |    otherwise returns 0.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The object cannot be tracked by the garbage collector if this function returns 0.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-11 01:21:54 +01:00
										 |  |  | .. c:function:: int PyObject_GC_IsTracked(PyObject *op)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Returns 1 if the object type of *op* implements the GC protocol and *op* is being
 | 
					
						
							|  |  |  |    currently tracked by the garbage collector and 0 otherwise.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This is analogous to the Python function :func:`gc.is_tracked`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.9
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. c:function:: int PyObject_GC_IsFinalized(PyObject *op)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Returns 1 if the object type of *op* implements the GC protocol and *op* has been
 | 
					
						
							|  |  |  |    already finalized by the garbage collector and 0 otherwise.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This is analogous to the Python function :func:`gc.is_finalized`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.9
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:function:: void PyObject_GC_Del(void *op)
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-27 02:52:40 +02:00
										 |  |  |    Releases memory allocated to an object using :c:macro:`PyObject_GC_New` or
 | 
					
						
							|  |  |  |    :c:macro:`PyObject_GC_NewVar`.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-20 08:25:50 -04:00
										 |  |  |    Do not call this directly to free an object's memory; call the type's
 | 
					
						
							|  |  |  |    :c:member:`~PyTypeObject.tp_free` slot instead.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Do not use this for memory allocated by :c:macro:`PyObject_New`,
 | 
					
						
							|  |  |  |    :c:macro:`PyObject_NewVar`, or related allocation functions; use
 | 
					
						
							|  |  |  |    :c:func:`PyObject_Free` instead.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. seealso::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       * :c:func:`PyObject_Free` is the non-GC equivalent of this function.
 | 
					
						
							|  |  |  |       * :c:macro:`PyObject_GC_New`
 | 
					
						
							|  |  |  |       * :c:macro:`PyObject_GC_NewVar`
 | 
					
						
							|  |  |  |       * :c:func:`PyType_GenericAlloc`
 | 
					
						
							|  |  |  |       * :c:member:`~PyTypeObject.tp_free`
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:function:: void PyObject_GC_UnTrack(void *op)
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Remove the object *op* from the set of container objects tracked by the
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    collector.  Note that :c:func:`PyObject_GC_Track` can be called again on
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 71898-71900,71910,71914-71919 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r71898 | jeroen.ruigrok | 2009-04-25 16:24:30 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71899 | jeroen.ruigrok | 2009-04-25 16:27:00 +0200 (za, 25 apr 2009) | 3 lines
  The type for ppos has been Py_ssize_t since 2.5, reflect this in the
  documentation.
........
  r71900 | jeroen.ruigrok | 2009-04-25 16:28:02 +0200 (za, 25 apr 2009) | 2 lines
  Reformat paragraph.
........
  r71910 | jeroen.ruigrok | 2009-04-25 19:59:03 +0200 (za, 25 apr 2009) | 4 lines
  Issue #4129: Belatedly document which C API functions had their argument(s) or
  return type changed from int or int * to Py_ssize_t or Py_ssize_t * as this
  might cause problems on 64-bit platforms.
........
  r71914 | jeroen.ruigrok | 2009-04-25 20:31:20 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71915 | jeroen.ruigrok | 2009-04-25 20:46:03 +0200 (za, 25 apr 2009) | 2 lines
  Issue #4129: Document more int -> Py_ssize_t changes.
........
  r71916 | jeroen.ruigrok | 2009-04-25 20:53:48 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71917 | jeroen.ruigrok | 2009-04-25 20:57:32 +0200 (za, 25 apr 2009) | 2 lines
  Reference to an int type, whereas it's a Py_ssize_t as the synopsis states.
........
  r71918 | jeroen.ruigrok | 2009-04-25 21:04:15 +0200 (za, 25 apr 2009) | 2 lines
  Since I edited this file, reformat for future edits.
........
  r71919 | jeroen.ruigrok | 2009-04-25 21:10:52 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
											
										 
											2009-04-26 21:06:15 +00:00
										 |  |  |    this object to add it back to the set of tracked objects.  The deallocator
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    (:c:member:`~PyTypeObject.tp_dealloc` handler) should call this for the object before any of
 | 
					
						
							|  |  |  |    the fields used by the :c:member:`~PyTypeObject.tp_traverse` handler become invalid.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-13 12:52:18 +01:00
										 |  |  | .. versionchanged:: 3.8
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-27 01:41:15 +02:00
										 |  |  |    The :c:func:`!_PyObject_GC_TRACK` and :c:func:`!_PyObject_GC_UNTRACK` macros
 | 
					
						
							| 
									
										
										
										
											2018-11-13 12:52:18 +01:00
										 |  |  |    have been removed from the public C API.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  | The :c:member:`~PyTypeObject.tp_traverse` handler accepts a function parameter of this type:
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:type:: int (*visitproc)(PyObject *object, void *arg)
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    Type of the visitor function passed to the :c:member:`~PyTypeObject.tp_traverse` handler.
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 71898-71900,71910,71914-71919 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r71898 | jeroen.ruigrok | 2009-04-25 16:24:30 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71899 | jeroen.ruigrok | 2009-04-25 16:27:00 +0200 (za, 25 apr 2009) | 3 lines
  The type for ppos has been Py_ssize_t since 2.5, reflect this in the
  documentation.
........
  r71900 | jeroen.ruigrok | 2009-04-25 16:28:02 +0200 (za, 25 apr 2009) | 2 lines
  Reformat paragraph.
........
  r71910 | jeroen.ruigrok | 2009-04-25 19:59:03 +0200 (za, 25 apr 2009) | 4 lines
  Issue #4129: Belatedly document which C API functions had their argument(s) or
  return type changed from int or int * to Py_ssize_t or Py_ssize_t * as this
  might cause problems on 64-bit platforms.
........
  r71914 | jeroen.ruigrok | 2009-04-25 20:31:20 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71915 | jeroen.ruigrok | 2009-04-25 20:46:03 +0200 (za, 25 apr 2009) | 2 lines
  Issue #4129: Document more int -> Py_ssize_t changes.
........
  r71916 | jeroen.ruigrok | 2009-04-25 20:53:48 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71917 | jeroen.ruigrok | 2009-04-25 20:57:32 +0200 (za, 25 apr 2009) | 2 lines
  Reference to an int type, whereas it's a Py_ssize_t as the synopsis states.
........
  r71918 | jeroen.ruigrok | 2009-04-25 21:04:15 +0200 (za, 25 apr 2009) | 2 lines
  Since I edited this file, reformat for future edits.
........
  r71919 | jeroen.ruigrok | 2009-04-25 21:10:52 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
											
										 
											2009-04-26 21:06:15 +00:00
										 |  |  |    The function should be called with an object to traverse as *object* and
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    the third parameter to the :c:member:`~PyTypeObject.tp_traverse` handler as *arg*.  The
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 71898-71900,71910,71914-71919 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r71898 | jeroen.ruigrok | 2009-04-25 16:24:30 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71899 | jeroen.ruigrok | 2009-04-25 16:27:00 +0200 (za, 25 apr 2009) | 3 lines
  The type for ppos has been Py_ssize_t since 2.5, reflect this in the
  documentation.
........
  r71900 | jeroen.ruigrok | 2009-04-25 16:28:02 +0200 (za, 25 apr 2009) | 2 lines
  Reformat paragraph.
........
  r71910 | jeroen.ruigrok | 2009-04-25 19:59:03 +0200 (za, 25 apr 2009) | 4 lines
  Issue #4129: Belatedly document which C API functions had their argument(s) or
  return type changed from int or int * to Py_ssize_t or Py_ssize_t * as this
  might cause problems on 64-bit platforms.
........
  r71914 | jeroen.ruigrok | 2009-04-25 20:31:20 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71915 | jeroen.ruigrok | 2009-04-25 20:46:03 +0200 (za, 25 apr 2009) | 2 lines
  Issue #4129: Document more int -> Py_ssize_t changes.
........
  r71916 | jeroen.ruigrok | 2009-04-25 20:53:48 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71917 | jeroen.ruigrok | 2009-04-25 20:57:32 +0200 (za, 25 apr 2009) | 2 lines
  Reference to an int type, whereas it's a Py_ssize_t as the synopsis states.
........
  r71918 | jeroen.ruigrok | 2009-04-25 21:04:15 +0200 (za, 25 apr 2009) | 2 lines
  Since I edited this file, reformat for future edits.
........
  r71919 | jeroen.ruigrok | 2009-04-25 21:10:52 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
											
										 
											2009-04-26 21:06:15 +00:00
										 |  |  |    Python core uses several visitor functions to implement cyclic garbage
 | 
					
						
							|  |  |  |    detection; it's not expected that users will need to write their own
 | 
					
						
							|  |  |  |    visitor functions.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  | The :c:member:`~PyTypeObject.tp_traverse` handler must have the following type:
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:type:: int (*traverseproc)(PyObject *self, visitproc visit, void *arg)
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Traversal function for a container object.  Implementations must call the
 | 
					
						
							|  |  |  |    *visit* function for each object directly contained by *self*, with the
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 71898-71900,71910,71914-71919 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r71898 | jeroen.ruigrok | 2009-04-25 16:24:30 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71899 | jeroen.ruigrok | 2009-04-25 16:27:00 +0200 (za, 25 apr 2009) | 3 lines
  The type for ppos has been Py_ssize_t since 2.5, reflect this in the
  documentation.
........
  r71900 | jeroen.ruigrok | 2009-04-25 16:28:02 +0200 (za, 25 apr 2009) | 2 lines
  Reformat paragraph.
........
  r71910 | jeroen.ruigrok | 2009-04-25 19:59:03 +0200 (za, 25 apr 2009) | 4 lines
  Issue #4129: Belatedly document which C API functions had their argument(s) or
  return type changed from int or int * to Py_ssize_t or Py_ssize_t * as this
  might cause problems on 64-bit platforms.
........
  r71914 | jeroen.ruigrok | 2009-04-25 20:31:20 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71915 | jeroen.ruigrok | 2009-04-25 20:46:03 +0200 (za, 25 apr 2009) | 2 lines
  Issue #4129: Document more int -> Py_ssize_t changes.
........
  r71916 | jeroen.ruigrok | 2009-04-25 20:53:48 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71917 | jeroen.ruigrok | 2009-04-25 20:57:32 +0200 (za, 25 apr 2009) | 2 lines
  Reference to an int type, whereas it's a Py_ssize_t as the synopsis states.
........
  r71918 | jeroen.ruigrok | 2009-04-25 21:04:15 +0200 (za, 25 apr 2009) | 2 lines
  Since I edited this file, reformat for future edits.
........
  r71919 | jeroen.ruigrok | 2009-04-25 21:10:52 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
											
										 
											2009-04-26 21:06:15 +00:00
										 |  |  |    parameters to *visit* being the contained object and the *arg* value passed
 | 
					
						
							| 
									
										
										
										
											2019-10-30 12:03:20 +02:00
										 |  |  |    to the handler.  The *visit* function must not be called with a ``NULL``
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 71898-71900,71910,71914-71919 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r71898 | jeroen.ruigrok | 2009-04-25 16:24:30 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71899 | jeroen.ruigrok | 2009-04-25 16:27:00 +0200 (za, 25 apr 2009) | 3 lines
  The type for ppos has been Py_ssize_t since 2.5, reflect this in the
  documentation.
........
  r71900 | jeroen.ruigrok | 2009-04-25 16:28:02 +0200 (za, 25 apr 2009) | 2 lines
  Reformat paragraph.
........
  r71910 | jeroen.ruigrok | 2009-04-25 19:59:03 +0200 (za, 25 apr 2009) | 4 lines
  Issue #4129: Belatedly document which C API functions had their argument(s) or
  return type changed from int or int * to Py_ssize_t or Py_ssize_t * as this
  might cause problems on 64-bit platforms.
........
  r71914 | jeroen.ruigrok | 2009-04-25 20:31:20 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71915 | jeroen.ruigrok | 2009-04-25 20:46:03 +0200 (za, 25 apr 2009) | 2 lines
  Issue #4129: Document more int -> Py_ssize_t changes.
........
  r71916 | jeroen.ruigrok | 2009-04-25 20:53:48 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71917 | jeroen.ruigrok | 2009-04-25 20:57:32 +0200 (za, 25 apr 2009) | 2 lines
  Reference to an int type, whereas it's a Py_ssize_t as the synopsis states.
........
  r71918 | jeroen.ruigrok | 2009-04-25 21:04:15 +0200 (za, 25 apr 2009) | 2 lines
  Since I edited this file, reformat for future edits.
........
  r71919 | jeroen.ruigrok | 2009-04-25 21:10:52 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
											
										 
											2009-04-26 21:06:15 +00:00
										 |  |  |    object argument.  If *visit* returns a non-zero value that value should be
 | 
					
						
							|  |  |  |    returned immediately.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  | To simplify writing :c:member:`~PyTypeObject.tp_traverse` handlers, a :c:func:`Py_VISIT` macro is
 | 
					
						
							|  |  |  | provided.  In order to use this macro, the :c:member:`~PyTypeObject.tp_traverse` implementation
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | must name its arguments exactly *visit* and *arg*:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-18 17:28:43 +01:00
										 |  |  | .. c:macro:: Py_VISIT(o)
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-18 17:28:43 +01:00
										 |  |  |    If the :c:expr:`PyObject *` *o* is not ``NULL``, call the *visit* callback, with arguments *o*
 | 
					
						
							| 
									
										
										
										
											2016-06-02 11:35:59 -07:00
										 |  |  |    and *arg*.  If *visit* returns a non-zero value, then return it.
 | 
					
						
							|  |  |  |    Using this macro, :c:member:`~PyTypeObject.tp_traverse` handlers
 | 
					
						
							|  |  |  |    look like::
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       static int
 | 
					
						
							|  |  |  |       my_traverse(Noddy *self, visitproc visit, void *arg)
 | 
					
						
							|  |  |  |       {
 | 
					
						
							|  |  |  |           Py_VISIT(self->foo);
 | 
					
						
							|  |  |  |           Py_VISIT(self->bar);
 | 
					
						
							|  |  |  |           return 0;
 | 
					
						
							|  |  |  |       }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-30 12:03:20 +02:00
										 |  |  | The :c:member:`~PyTypeObject.tp_clear` handler must be of the :c:type:`inquiry` type, or ``NULL``
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 71898-71900,71910,71914-71919 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r71898 | jeroen.ruigrok | 2009-04-25 16:24:30 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71899 | jeroen.ruigrok | 2009-04-25 16:27:00 +0200 (za, 25 apr 2009) | 3 lines
  The type for ppos has been Py_ssize_t since 2.5, reflect this in the
  documentation.
........
  r71900 | jeroen.ruigrok | 2009-04-25 16:28:02 +0200 (za, 25 apr 2009) | 2 lines
  Reformat paragraph.
........
  r71910 | jeroen.ruigrok | 2009-04-25 19:59:03 +0200 (za, 25 apr 2009) | 4 lines
  Issue #4129: Belatedly document which C API functions had their argument(s) or
  return type changed from int or int * to Py_ssize_t or Py_ssize_t * as this
  might cause problems on 64-bit platforms.
........
  r71914 | jeroen.ruigrok | 2009-04-25 20:31:20 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71915 | jeroen.ruigrok | 2009-04-25 20:46:03 +0200 (za, 25 apr 2009) | 2 lines
  Issue #4129: Document more int -> Py_ssize_t changes.
........
  r71916 | jeroen.ruigrok | 2009-04-25 20:53:48 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71917 | jeroen.ruigrok | 2009-04-25 20:57:32 +0200 (za, 25 apr 2009) | 2 lines
  Reference to an int type, whereas it's a Py_ssize_t as the synopsis states.
........
  r71918 | jeroen.ruigrok | 2009-04-25 21:04:15 +0200 (za, 25 apr 2009) | 2 lines
  Since I edited this file, reformat for future edits.
........
  r71919 | jeroen.ruigrok | 2009-04-25 21:10:52 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
											
										 
											2009-04-26 21:06:15 +00:00
										 |  |  | if the object is immutable.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:type:: int (*inquiry)(PyObject *self)
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 71898-71900,71910,71914-71919 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r71898 | jeroen.ruigrok | 2009-04-25 16:24:30 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71899 | jeroen.ruigrok | 2009-04-25 16:27:00 +0200 (za, 25 apr 2009) | 3 lines
  The type for ppos has been Py_ssize_t since 2.5, reflect this in the
  documentation.
........
  r71900 | jeroen.ruigrok | 2009-04-25 16:28:02 +0200 (za, 25 apr 2009) | 2 lines
  Reformat paragraph.
........
  r71910 | jeroen.ruigrok | 2009-04-25 19:59:03 +0200 (za, 25 apr 2009) | 4 lines
  Issue #4129: Belatedly document which C API functions had their argument(s) or
  return type changed from int or int * to Py_ssize_t or Py_ssize_t * as this
  might cause problems on 64-bit platforms.
........
  r71914 | jeroen.ruigrok | 2009-04-25 20:31:20 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71915 | jeroen.ruigrok | 2009-04-25 20:46:03 +0200 (za, 25 apr 2009) | 2 lines
  Issue #4129: Document more int -> Py_ssize_t changes.
........
  r71916 | jeroen.ruigrok | 2009-04-25 20:53:48 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71917 | jeroen.ruigrok | 2009-04-25 20:57:32 +0200 (za, 25 apr 2009) | 2 lines
  Reference to an int type, whereas it's a Py_ssize_t as the synopsis states.
........
  r71918 | jeroen.ruigrok | 2009-04-25 21:04:15 +0200 (za, 25 apr 2009) | 2 lines
  Since I edited this file, reformat for future edits.
........
  r71919 | jeroen.ruigrok | 2009-04-25 21:10:52 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
											
										 
											2009-04-26 21:06:15 +00:00
										 |  |  |    Drop references that may have created reference cycles.  Immutable objects
 | 
					
						
							|  |  |  |    do not have to define this method since they can never directly create
 | 
					
						
							|  |  |  |    reference cycles.  Note that the object must still be valid after calling
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    this method (don't just call :c:func:`Py_DECREF` on a reference).  The
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 71898-71900,71910,71914-71919 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r71898 | jeroen.ruigrok | 2009-04-25 16:24:30 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71899 | jeroen.ruigrok | 2009-04-25 16:27:00 +0200 (za, 25 apr 2009) | 3 lines
  The type for ppos has been Py_ssize_t since 2.5, reflect this in the
  documentation.
........
  r71900 | jeroen.ruigrok | 2009-04-25 16:28:02 +0200 (za, 25 apr 2009) | 2 lines
  Reformat paragraph.
........
  r71910 | jeroen.ruigrok | 2009-04-25 19:59:03 +0200 (za, 25 apr 2009) | 4 lines
  Issue #4129: Belatedly document which C API functions had their argument(s) or
  return type changed from int or int * to Py_ssize_t or Py_ssize_t * as this
  might cause problems on 64-bit platforms.
........
  r71914 | jeroen.ruigrok | 2009-04-25 20:31:20 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71915 | jeroen.ruigrok | 2009-04-25 20:46:03 +0200 (za, 25 apr 2009) | 2 lines
  Issue #4129: Document more int -> Py_ssize_t changes.
........
  r71916 | jeroen.ruigrok | 2009-04-25 20:53:48 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
  r71917 | jeroen.ruigrok | 2009-04-25 20:57:32 +0200 (za, 25 apr 2009) | 2 lines
  Reference to an int type, whereas it's a Py_ssize_t as the synopsis states.
........
  r71918 | jeroen.ruigrok | 2009-04-25 21:04:15 +0200 (za, 25 apr 2009) | 2 lines
  Since I edited this file, reformat for future edits.
........
  r71919 | jeroen.ruigrok | 2009-04-25 21:10:52 +0200 (za, 25 apr 2009) | 2 lines
  Reformat prior to editing.
........
											
										 
											2009-04-26 21:06:15 +00:00
										 |  |  |    collector will call this method if it detects that this object is involved
 | 
					
						
							|  |  |  |    in a reference cycle.
 | 
					
						
							| 
									
										
										
										
											2021-04-28 18:12:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Controlling the Garbage Collector State
 | 
					
						
							|  |  |  | ---------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The C-API provides the following functions for controlling
 | 
					
						
							|  |  |  | garbage collection runs.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. c:function:: Py_ssize_t PyGC_Collect(void)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Perform a full garbage collection, if the garbage collector is enabled.
 | 
					
						
							|  |  |  |    (Note that :func:`gc.collect` runs it unconditionally.)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Returns the number of collected + unreachable objects which cannot
 | 
					
						
							|  |  |  |    be collected.
 | 
					
						
							|  |  |  |    If the garbage collector is disabled or already collecting,
 | 
					
						
							|  |  |  |    returns ``0`` immediately.
 | 
					
						
							|  |  |  |    Errors during garbage collection are passed to :data:`sys.unraisablehook`.
 | 
					
						
							|  |  |  |    This function does not raise exceptions.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. c:function:: int PyGC_Enable(void)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Enable the garbage collector: similar to :func:`gc.enable`.
 | 
					
						
							|  |  |  |    Returns the previous state, 0 for disabled and 1 for enabled.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.10
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. c:function:: int PyGC_Disable(void)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Disable the garbage collector: similar to :func:`gc.disable`.
 | 
					
						
							|  |  |  |    Returns the previous state, 0 for disabled and 1 for enabled.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.10
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. c:function:: int PyGC_IsEnabled(void)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Query the state of the garbage collector: similar to :func:`gc.isenabled`.
 | 
					
						
							|  |  |  |    Returns the current state, 0 for disabled and 1 for enabled.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.10
 | 
					
						
							| 
									
										
										
										
											2023-03-13 20:35:54 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Querying Garbage Collector State
 | 
					
						
							|  |  |  | --------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The C-API provides the following interface for querying information about
 | 
					
						
							|  |  |  | the garbage collector.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. c:function:: void PyUnstable_GC_VisitObjects(gcvisitobjects_t callback, void *arg)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Run supplied *callback* on all live GC-capable objects. *arg* is passed through to
 | 
					
						
							|  |  |  |    all invocations of *callback*.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. warning::
 | 
					
						
							|  |  |  |       If new objects are (de)allocated by the callback it is undefined if they
 | 
					
						
							|  |  |  |       will be visited.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Garbage collection is disabled during operation. Explicitly running a collection
 | 
					
						
							|  |  |  |       in the callback may lead to undefined behaviour e.g. visiting the same objects
 | 
					
						
							|  |  |  |       multiple times or not at all.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.12
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. c:type:: int (*gcvisitobjects_t)(PyObject *object, void *arg)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Type of the visitor function to be passed to :c:func:`PyUnstable_GC_VisitObjects`.
 | 
					
						
							|  |  |  |    *arg* is the same as the *arg* passed to ``PyUnstable_GC_VisitObjects``.
 | 
					
						
							| 
									
										
										
										
											2025-04-12 16:36:02 +01:00
										 |  |  |    Return ``1`` to continue iteration, return ``0`` to stop iteration. Other return
 | 
					
						
							| 
									
										
										
										
											2023-03-13 20:35:54 -05:00
										 |  |  |    values are reserved for now so behavior on returning anything else is undefined.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.12
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 |