Skip to content

Commit e5d70d9

Browse files
[3.13] gh-144473: Add "steal" term to glossary; clarify "stealing" onerror (GH-144502) (GH-152772) (GH-152779)
With one exception, all "stealing" functions also steal on error, but it makes sense to note this in each case. (cherry picked from commit 34503f3) (cherry picked from commit f8fb02d) Co-authored-by: Peter Bierma <zintensitydev@gmail.com>
1 parent 3f0ef65 commit e5d70d9

10 files changed

Lines changed: 52 additions & 33 deletions

File tree

Doc/c-api/bytes.rst

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -176,10 +176,11 @@ called with a non-bytes parameter.
176176
.. c:function:: void PyBytes_Concat(PyObject **bytes, PyObject *newpart)
177177
178178
Create a new bytes object in *\*bytes* containing the contents of *newpart*
179-
appended to *bytes*; the caller will own the new reference. The reference to
180-
the old value of *bytes* will be stolen. If the new object cannot be
181-
created, the old reference to *bytes* will still be discarded and the value
182-
of *\*bytes* will be set to ``NULL``; the appropriate exception will be set.
179+
appended to *bytes*; the caller will own the new reference.
180+
The reference to the old value of *bytes* will be ":term:`stolen <steal>`".
181+
If the new object cannot be created, the old reference to *bytes* will still
182+
be "stolen", the value of *\*bytes* will be set to ``NULL``, and
183+
the appropriate exception will be set.
183184
184185
185186
.. c:function:: void PyBytes_ConcatAndDel(PyObject **bytes, PyObject *newpart)

Doc/c-api/dict.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ Dictionary Objects
8484
8585
Insert *val* into the dictionary *p* with a key of *key*. *key* must be
8686
:term:`hashable`; if it isn't, :exc:`TypeError` will be raised. Return
87-
``0`` on success or ``-1`` on failure. This function *does not* steal a
88-
reference to *val*.
87+
``0`` on success or ``-1`` on failure.
88+
This function *does not* ":term:`steal`" a reference to *val*.
8989
9090
9191
.. c:function:: int PyDict_SetItemString(PyObject *p, const char *key, PyObject *val)

Doc/c-api/exceptions.rst

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,8 @@ Querying the error indicator
503503
504504
.. warning::
505505
506-
This call steals a reference to *exc*, which must be a valid exception.
506+
This call ":term:`steals <steal>`" a reference to *exc*,
507+
which must be a valid exception.
507508
508509
.. versionadded:: 3.12
509510
@@ -641,7 +642,8 @@ Querying the error indicator
641642
642643
Set the exception info, as known from ``sys.exc_info()``. This refers
643644
to an exception that was *already caught*, not to an exception that was
644-
freshly raised. This function steals the references of the arguments.
645+
freshly raised. This function ":term:`steals <steal>`" the references
646+
of the arguments.
645647
To clear the exception state, pass ``NULL`` for all three arguments.
646648
This function is kept for backwards compatibility. Prefer using
647649
:c:func:`PyErr_SetHandledException`.
@@ -658,8 +660,8 @@ Querying the error indicator
658660
.. versionchanged:: 3.11
659661
The ``type`` and ``traceback`` arguments are no longer used and
660662
can be NULL. The interpreter now derives them from the exception
661-
instance (the ``value`` argument). The function still steals
662-
references of all three arguments.
663+
instance (the ``value`` argument). The function still
664+
":term:`steals <steal>`" references of all three arguments.
663665
664666
665667
Signal Handling
@@ -845,7 +847,7 @@ Exception Objects
845847
846848
Set the context associated with the exception to *ctx*. Use ``NULL`` to clear
847849
it. There is no type check to make sure that *ctx* is an exception instance.
848-
This steals a reference to *ctx*.
850+
This ":term:`steals <steal>`" a reference to *ctx*.
849851
850852
851853
.. c:function:: PyObject* PyException_GetCause(PyObject *ex)
@@ -860,7 +862,8 @@ Exception Objects
860862
861863
Set the cause associated with the exception to *cause*. Use ``NULL`` to clear
862864
it. There is no type check to make sure that *cause* is either an exception
863-
instance or ``None``. This steals a reference to *cause*.
865+
instance or ``None``.
866+
This ":term:`steals <steal>`" a reference to *cause*.
864867
865868
The :attr:`~BaseException.__suppress_context__` attribute is implicitly set
866869
to ``True`` by this function.

Doc/c-api/gen.rst

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,15 @@ than explicitly calling :c:func:`PyGen_New` or :c:func:`PyGen_NewWithQualName`.
3535
.. c:function:: PyObject* PyGen_New(PyFrameObject *frame)
3636
3737
Create and return a new generator object based on the *frame* object.
38-
A reference to *frame* is stolen by this function. The argument must not be
39-
``NULL``.
38+
A reference to *frame* is ":term:`stolen <steal>`" by this function (even
39+
on error). The argument must not be ``NULL``.
4040
4141
.. c:function:: PyObject* PyGen_NewWithQualName(PyFrameObject *frame, PyObject *name, PyObject *qualname)
4242
4343
Create and return a new generator object based on the *frame* object,
4444
with ``__name__`` and ``__qualname__`` set to *name* and *qualname*.
45-
A reference to *frame* is stolen by this function. The *frame* argument
46-
must not be ``NULL``.
45+
A reference to *frame* is ":term:`stolen <steal>`" by this function (even
46+
on error). The *frame* argument must not be ``NULL``.
4747
4848
.. c:function:: PyCodeObject* PyGen_GetCode(PyGenObject *gen)
4949
@@ -67,8 +67,9 @@ Asynchronous Generator Objects
6767
.. c:function:: PyObject *PyAsyncGen_New(PyFrameObject *frame, PyObject *name, PyObject *qualname)
6868
6969
Create a new asynchronous generator wrapping *frame*, with ``__name__`` and
70-
``__qualname__`` set to *name* and *qualname*. *frame* is stolen by this
71-
function and must not be ``NULL``.
70+
``__qualname__`` set to *name* and *qualname*.
71+
*frame* is ":term:`stolen <steal>`" by this function (even on error) and
72+
must not be ``NULL``.
7273
7374
On success, this function returns a :term:`strong reference` to the
7475
new asynchronous generator. On failure, this function returns ``NULL``

Doc/c-api/intro.rst

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -592,9 +592,12 @@ the caller is said to *borrow* the reference. Nothing needs to be done for a
592592

593593
Conversely, when a calling function passes in a reference to an object, there
594594
are two possibilities: the function *steals* a reference to the object, or it
595-
does not. *Stealing a reference* means that when you pass a reference to a
596-
function, that function assumes that it now owns that reference, and you are not
597-
responsible for it any longer.
595+
does not.
596+
597+
*Stealing a reference* means that when you pass a reference to a
598+
function, that function assumes that it now owns that reference.
599+
Since the new owner can use :c:func:`!Py_DECREF` at its discretion,
600+
you (the caller) must not use that reference after the call.
598601

599602
.. index::
600603
single: PyList_SetItem (C function)

Doc/c-api/list.rst

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,10 @@ List Objects
8888
8989
.. note::
9090
91-
This function "steals" a reference to *item* and discards a reference to
92-
an item already in the list at the affected position.
91+
This function ":term:`steals <steal>`" a reference to *item*,
92+
even on error.
93+
On success, it discards a reference to an item already in the list
94+
at the affected position (unless it was ``NULL``).
9395
9496
9597
.. c:function:: void PyList_SET_ITEM(PyObject *list, Py_ssize_t i, PyObject *o)
@@ -103,7 +105,7 @@ List Objects
103105
104106
.. note::
105107
106-
This macro "steals" a reference to *item*, and, unlike
108+
This macro ":term:`steals <steal>`" a reference to *item*, and, unlike
107109
:c:func:`PyList_SetItem`, does *not* discard a reference to any item that
108110
is being replaced; any reference in *list* at position *i* will be
109111
leaked.

Doc/c-api/module.rst

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -617,8 +617,8 @@ state:
617617
618618
.. c:function:: int PyModule_Add(PyObject *module, const char *name, PyObject *value)
619619
620-
Similar to :c:func:`PyModule_AddObjectRef`, but "steals" a reference
621-
to *value*.
620+
Similar to :c:func:`PyModule_AddObjectRef`, but ":term:`steals <steal>`"
621+
a reference to *value* (even on error).
622622
It can be called with a result of function that returns a new reference
623623
without bothering to check its result or even saving it to a variable.
624624
@@ -633,8 +633,8 @@ state:
633633
634634
.. c:function:: int PyModule_AddObject(PyObject *module, const char *name, PyObject *value)
635635
636-
Similar to :c:func:`PyModule_AddObjectRef`, but steals a reference to
637-
*value* on success (if it returns ``0``).
636+
Similar to :c:func:`PyModule_AddObjectRef`, but :term:`steals <steal>`
637+
a reference to *value* on success (if it returns ``0``).
638638
639639
The new :c:func:`PyModule_Add` or :c:func:`PyModule_AddObjectRef`
640640
functions are recommended, since it is

Doc/c-api/sequence.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ Sequence Protocol
6767
Assign object *v* to the *i*\ th element of *o*. Raise an exception
6868
and return ``-1`` on failure; return ``0`` on success. This
6969
is the equivalent of the Python statement ``o[i] = v``. This function *does
70-
not* steal a reference to *v*.
70+
not* ":term:`steal`" a reference to *v*.
7171
7272
If *v* is ``NULL``, the element is deleted, but this feature is
7373
deprecated in favour of using :c:func:`PySequence_DelItem`.

Doc/c-api/tuple.rst

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,9 @@ Tuple Objects
9090
9191
.. note::
9292
93-
This function "steals" a reference to *o* and discards a reference to
94-
an item already in the tuple at the affected position.
93+
This function ":term:`steals <steal>`" a reference to *o* and discards
94+
a reference to an item already in the tuple at the affected position
95+
(unless it was NULL).
9596
9697
9798
.. c:function:: void PyTuple_SET_ITEM(PyObject *p, Py_ssize_t pos, PyObject *o)
@@ -104,7 +105,7 @@ Tuple Objects
104105
105106
.. note::
106107
107-
This function "steals" a reference to *o*, and, unlike
108+
This function ":term:`steals <steal>`" a reference to *o*, and, unlike
108109
:c:func:`PyTuple_SetItem`, does *not* discard a reference to any item that
109110
is being replaced; any reference in the tuple at position *pos* will be
110111
leaked.
@@ -238,7 +239,7 @@ type.
238239
239240
.. note::
240241
241-
This function "steals" a reference to *o*.
242+
This function ":term:`steals <steal>`" a reference to *o*.
242243
243244
244245
.. c:function:: void PyStructSequence_SET_ITEM(PyObject *p, Py_ssize_t *pos, PyObject *o)

Doc/glossary.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1435,6 +1435,14 @@ Glossary
14351435
stdlib
14361436
An abbreviation of :term:`standard library`.
14371437

1438+
steal
1439+
In Python's C API, "*stealing*" an argument means that ownership of the
1440+
argument is transferred to the called function.
1441+
The caller must not use that reference after the call.
1442+
Generally, functions that "steal" an argument do so even if they fail.
1443+
1444+
See :ref:`api-refcountdetails` for a full explanation.
1445+
14381446
strong reference
14391447
In Python's C API, a strong reference is a reference to an object
14401448
which is owned by the code holding the reference. The strong

0 commit comments

Comments
 (0)