[Python-Dev] Py_buffer.obj documentation
Jeff Allen
"ja...py" at farowl.co.uk
Thu Aug 30 03:28:07 CEST 2012
On 29/08/2012 22:28, Alexander Belopolsky wrote:
> I am trying to reconcile this section in 3.3 documentation:
>
> """
> void *obj
>
> A new reference to the exporting object. The reference is owned by the
> consumer and automatically decremented and set to NULL by
> PyBuffer_Release().
> with the following comment in the code (Objects/memoryobject.c:762):
>
> /* info->obj is either NULL or a borrowed reference. This
> reference
> should not be decremented in PyBuffer_Release(). */
I've studied this code in the interests of reproducing something similar
for Jython.
The comment is in the context of PyMemoryView_FromBuffer(Py_buffer
*info), at a point where the whole info struct is being copied to
mbuf->master, then the code sets mbuf->master.obj = NULL. I think the
comment means that the caller,
which is in the role of consumer to the original exporter, owns the info
struct and therefore the reference info.obj.
That caller will eventually call PyBuffer_Release(info), which will
result in a DECREF(obj) matching the INCREF(obj) that happened during
bf_getbuffer(info). In this sense obj is a borrowed reference as far as
the memoryview is concerned. mbuf->master must not also keep a
reference, or it risks making a second call to DECREF(obj).
Jeff Allen
More information about the Python-Dev
mailing list