[Python-Dev] Deprecate the buffer object?

Mark Hammond mhammond at skippinet.com.au
Wed Oct 29 18:21:50 EST 2003


Neil Schemenauer
> Okay.  Perhaps I am missing something but would fixing it be as
> simple as adding another field to the tp_as_buffer struct?
>
>     /* references returned by the buffer functins are valid while
>      * the object remains alive */
>     #define PyBuffer_FLAG_SAFE 1
>
> Then in stringobject.c (and elsewhere as appropriate):
>
>     static PyBufferProcs buffer_as_buffer = {
>         (getreadbufferproc)buffer_getreadbuf,
>         (getwritebufferproc)buffer_getwritebuf,
>         (getsegcountproc)buffer_getsegcount,
>         (getcharbufferproc)buffer_getcharbuf,
>         PyBuffer_FLAG_SAFE,
>     };
>
> Then change bufferobject so that it can only be created from objects
> that set PyBuffer_FLAG_SAFE.

As the essence of the solution, I think that sounds good!  I think that the
following should also be done:

* Update the docs for the buffer functions to indicate that these are *short
term* pointers, that are not guaranteed once *any* Python code is called.

* Add new public buffer functions with "LongTerm" in the name (and docs that
buffer is valid as long as the object).  These check the flag as you
propose.

* Buffer object uses new LongTerm buffer functions.

It points out that the buffer object itself is less at fault than the
interface.  I'm trying to short-circuit bugs in external extension modules
that use the buffer functions without realizing the subtle assumptions made.

Mark.




More information about the Python-Dev mailing list