<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<br>
<br>
In Python's argument parsing code (convertsimple in
Python/getargs.c), a couple of format units* accept "read-only
bytes-like objects", aka read-only buffer objects. They call a
helper function called convertbuffer() which uses the buffer
protocol to extract a pointer to the memory.<br>
<br>
Here's the relevant bit of code:<br>
<blockquote><tt>static Py_ssize_t<br>
convertbuffer(PyObject *arg, void **p, char **errmsg)<br>
{<br>
Py_buffer view;<br>
...<br>
<br>
if (getbuffer(arg, &view, errmsg) < 0)<br>
return -1;<br>
count = view.len;<br>
*p = view.buf;<br>
PyBuffer_Release(&view);<br>
return count;<br>
}</tt><br>
</blockquote>
<br>
getbuffer() uses the buffer protocol to fill in the "view" buffer.
If it's successful, "view" is a valid buffer. We store the pointer
to the buffer's memory in output parameter p.<br>
<br>
THEN WE RELEASE THE BUFFER.<br>
<br>
THEN WE RETURN TO THE CALLER.<br>
<br>
In case you missed the big helpful capital letters, we are returning
a pointer given to us by PyObject_GetBuffer(), which we have already
released by calling PyBuffer_Release(). The buffer protocol
documentation for
<meta http-equiv="content-type" content="text/html; charset=utf-8">
bf_releasebuffer makes it sound like this pointer could easily be
invalid after the release call finishes.<br>
<br>
Am I missing something, or is this code relying on an implementation
detail it shouldn't--namely that you can continue using a pointer to
some (most? all?) buffer memory even after releasing it?<br>
<br>
<br>
<i>/arry</i><br>
<br>
* Specifically: s# y y# z#<br>
</body>
</html>