On 2 March 2012 10:09, Stefan Behnel <stefan_ml@behnel.de> wrote:
Stefan Behnel, 02.03.2012 10:45:
the builtin Py_buffer struct type is currently defined as follows:
""" builtin_structs_table = [ ('Py_buffer', 'Py_buffer', [("buf", PyrexTypes.c_void_ptr_type), ("obj", PyrexTypes.py_object_type), ("len", PyrexTypes.c_py_ssize_t_type), ... """
I hadn't noticed this before, but when you actually use it in a "__getbuffer__()" special method, you have to assign the buffer owner (i.e. self) to the .obj field, which is currently defined as "object".
Oh, well, I should really learn to read code before composing a lengthy e-mail...
"__getbuffer__()" is already special-cased and sets the value to None. I think I even recall that we discussed this back when Dag implemented support for buffers. The reason I had originally noticed this was this recent change in Py3.3:
""" static PyObject * _PyManagedBuffer_FromObject(PyObject *base) { _PyManagedBufferObject *mbuf;
mbuf = mbuf_alloc(); if (mbuf == NULL) return NULL;
if (PyObject_GetBuffer(base, &mbuf->master, PyBUF_FULL_RO) < 0) { /* mbuf->master.obj must be NULL. */ Py_DECREF(mbuf); return NULL; }
/* Assume that master.obj is a new reference to base. */ assert(mbuf->master.obj == base);
return (PyObject *)mbuf; } """
Note the assertion (which is unreleased as of now, so it may still be subject to changes). Is there any reason the value should be set to None by Cython's special casing code instead of self?
It sets it to None to it can later reset it to NULL. Python 3.3 is the first version to document the 'obj' Py_buffer attribute, and it mentions that the exporter may set it to NULL. The code above is not the PyObject_GetBuffer function, so setting it to NULL should still work. Defaulting it to 'self' instead would work equally well I'd think.
Stefan _______________________________________________ cython-devel mailing list cython-devel@python.org http://mail.python.org/mailman/listinfo/cython-devel