[issue9158] PyArg_ParseTuple y* documentation is incorrect
New submission from Terrence Cole <terrence@zettabytestorage.com>: The documented C type for y* should be [Py_buffer], not [Py_buffer *], as with the documentation for z* and the convention followed by the other types. I'm not sure what 'type' this issue should have. I've set it at 'crash' initially, since that's how the bug manifested for me. ---------- assignee: docs@python components: Documentation files: PyArgs_ParseTuple_ystar_doc_fix.patch keywords: patch messages: 109285 nosy: docs@python, terrence priority: normal severity: normal status: open title: PyArg_ParseTuple y* documentation is incorrect type: crash versions: Python 3.2 Added file: http://bugs.python.org/file17862/PyArgs_ParseTuple_ystar_doc_fix.patch _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue9158> _______________________________________
Changes by Ezio Melotti <ezio.melotti@gmail.com>: ---------- nosy: +haypo stage: -> patch review type: crash -> feature request _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue9158> _______________________________________
STINNER Victor <victor.stinner@haypocalc.com> added the comment: y* and z* result is a Py_buffer, but in C you have to pass a reference to the result variable using &result. Full example: static PyObject * getargs_y_star(PyObject *self, PyObject *args) { Py_buffer buffer; PyObject *bytes; if (!PyArg_ParseTuple(args, "y*", &buffer)) return NULL; bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len); PyBuffer_Release(&buffer); return bytes; } Another example: "s" format result is char* (and not char**). You also have to pass a reference using &: static PyObject * getargs_s(PyObject *self, PyObject *args) { char *str; if (!PyArg_ParseTuple(args, "s", &str)) return NULL; return PyBytes_FromString(str); } ---------- resolution: -> invalid status: open -> closed _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue9158> _______________________________________
Terrence Cole <terrence@zettabytestorage.com> added the comment: @Victor: "y* and z* result is a Py_buffer" Correct, so why is z* documented as [Py_buffer] and y* documented as [Py_buffer*]? If I make 'buffer' from your example a Py_buffer*, as documented, then python puts writes sizeof(Py_buffer) bytes into a random spot in memory. Thus the attached patch. Thanks for giving this a look, but I don't think this issue is closed -- the documentation for y* is still wrong. ---------- _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue9158> _______________________________________
STINNER Victor <victor.stinner@haypocalc.com> added the comment: Oh ok, sorry. Fixed in r82597 (3.x) and r82598 (3.1). ---------- resolution: invalid -> fixed _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue9158> _______________________________________
Terrence Cole <terrence@zettabytestorage.com> added the comment: Awesome! Thanks, and sorry for communicating the problem so poorly initially. ---------- _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue9158> _______________________________________
participants (3)
-
Ezio Melotti -
STINNER Victor -
Terrence Cole