mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	bpo-41103: Remove old buffer protocol support (#21117)
They are deprecated since Python 3.0.
This commit is contained in:
		
							parent
							
								
									77ed29b2c2
								
							
						
					
					
						commit
						6f8a6ee59c
					
				
					 8 changed files with 9 additions and 204 deletions
				
			
		|  | @ -24,4 +24,3 @@ but whose items have not been set to some non-\ ``NULL`` value yet. | |||
|    mapping.rst | ||||
|    iter.rst | ||||
|    buffer.rst | ||||
|    objbuffer.rst | ||||
|  |  | |||
|  | @ -1,55 +0,0 @@ | |||
| .. highlight:: c | ||||
| 
 | ||||
| Old Buffer Protocol | ||||
| ------------------- | ||||
| 
 | ||||
| .. deprecated:: 3.0 | ||||
| 
 | ||||
| These functions were part of the "old buffer protocol" API in Python 2. | ||||
| In Python 3, this protocol doesn't exist anymore but the functions are still | ||||
| exposed to ease porting 2.x code.  They act as a compatibility wrapper | ||||
| around the :ref:`new buffer protocol <bufferobjects>`, but they don't give | ||||
| you control over the lifetime of the resources acquired when a buffer is | ||||
| exported. | ||||
| 
 | ||||
| Therefore, it is recommended that you call :c:func:`PyObject_GetBuffer` | ||||
| (or the ``y*`` or ``w*`` :ref:`format codes <arg-parsing>` with the | ||||
| :c:func:`PyArg_ParseTuple` family of functions) to get a buffer view over | ||||
| an object, and :c:func:`PyBuffer_Release` when the buffer view can be released. | ||||
| 
 | ||||
| 
 | ||||
| .. c:function:: int PyObject_AsCharBuffer(PyObject *obj, const char **buffer, Py_ssize_t *buffer_len) | ||||
| 
 | ||||
|    Returns a pointer to a read-only memory location usable as character-based | ||||
|    input.  The *obj* argument must support the single-segment character buffer | ||||
|    interface.  On success, returns ``0``, sets *buffer* to the memory location | ||||
|    and *buffer_len* to the buffer length.  Returns ``-1`` and sets a | ||||
|    :exc:`TypeError` on error. | ||||
| 
 | ||||
| 
 | ||||
| .. c:function:: int PyObject_AsReadBuffer(PyObject *obj, const void **buffer, Py_ssize_t *buffer_len) | ||||
| 
 | ||||
|    Returns a pointer to a read-only memory location containing arbitrary data. | ||||
|    The *obj* argument must support the single-segment readable buffer | ||||
|    interface.  On success, returns ``0``, sets *buffer* to the memory location | ||||
|    and *buffer_len* to the buffer length.  Returns ``-1`` and sets a | ||||
|    :exc:`TypeError` on error. | ||||
| 
 | ||||
| 
 | ||||
| .. c:function:: int PyObject_CheckReadBuffer(PyObject *o) | ||||
| 
 | ||||
|    Returns ``1`` if *o* supports the single-segment readable buffer interface. | ||||
|    Otherwise returns ``0``.  This function always succeeds. | ||||
| 
 | ||||
|    Note that this function tries to get and release a buffer, and exceptions | ||||
|    which occur while calling corresponding functions will get suppressed. | ||||
|    To get error reporting use :c:func:`PyObject_GetBuffer()` instead. | ||||
| 
 | ||||
| 
 | ||||
| .. c:function:: int PyObject_AsWriteBuffer(PyObject *obj, void **buffer, Py_ssize_t *buffer_len) | ||||
| 
 | ||||
|    Returns a pointer to a writable memory location.  The *obj* argument must | ||||
|    support the single-segment, character buffer interface.  On success, | ||||
|    returns ``0``, sets *buffer* to the memory location and *buffer_len* to the | ||||
|    buffer length.  Returns ``-1`` and sets a :exc:`TypeError` on error. | ||||
| 
 | ||||
|  | @ -1568,21 +1568,6 @@ PyOS_FSPath:PyObject*:path:0: | |||
| PyObject_ASCII:PyObject*::+1: | ||||
| PyObject_ASCII:PyObject*:o:0: | ||||
| 
 | ||||
| PyObject_AsCharBuffer:int::: | ||||
| PyObject_AsCharBuffer:PyObject*:obj:0: | ||||
| PyObject_AsCharBuffer:const char**:buffer:: | ||||
| PyObject_AsCharBuffer:Py_ssize_t*:buffer_len:: | ||||
| 
 | ||||
| PyObject_AsReadBuffer:int::: | ||||
| PyObject_AsReadBuffer:PyObject*:obj:0: | ||||
| PyObject_AsReadBuffer:const void**:buffer:: | ||||
| PyObject_AsReadBuffer:Py_ssize_t*:buffer_len:: | ||||
| 
 | ||||
| PyObject_AsWriteBuffer:int::: | ||||
| PyObject_AsWriteBuffer:PyObject*:obj:0: | ||||
| PyObject_AsWriteBuffer:void**:buffer:: | ||||
| PyObject_AsWriteBuffer:Py_ssize_t*:buffer_len:: | ||||
| 
 | ||||
| PyObject_Bytes:PyObject*::+1: | ||||
| PyObject_Bytes:PyObject*:o:0: | ||||
| 
 | ||||
|  | @ -1618,9 +1603,6 @@ PyObject_CallObject:PyObject*:args:0: | |||
| PyObject_CheckBuffer:int::: | ||||
| PyObject_CheckBuffer:PyObject*:obj:0: | ||||
| 
 | ||||
| PyObject_CheckReadBuffer:int::: | ||||
| PyObject_CheckReadBuffer:PyObject*:o:0: | ||||
| 
 | ||||
| PyObject_DelAttr:int::: | ||||
| PyObject_DelAttr:PyObject*:o:0: | ||||
| PyObject_DelAttr:PyObject*:attr_name:0: | ||||
|  |  | |||
|  | @ -204,3 +204,8 @@ Porting to Python 3.10 | |||
| 
 | ||||
| Removed | ||||
| ------- | ||||
| 
 | ||||
| * ``PyObject_AsCharBuffer()``, ``PyObject_AsReadBuffer()``, ``PyObject_CheckReadBuffer()``, | ||||
|   and ``PyObject_AsWriteBuffer()`` are removed. Please migrate to new buffer protocol; | ||||
|   :c:func:`PyObject_GetBuffer` and :c:func:`PyBuffer_Release`. | ||||
|   (Contributed by Inada Naoki in :issue:`41103`. | ||||
|  |  | |||
|  | @ -309,53 +309,6 @@ PyAPI_FUNC(int) PyObject_DelItemString(PyObject *o, const char *key); | |||
| PyAPI_FUNC(int) PyObject_DelItem(PyObject *o, PyObject *key); | ||||
| 
 | ||||
| 
 | ||||
| /* === Old Buffer API ============================================ */ | ||||
| 
 | ||||
| /* FIXME:  usage of these should all be replaced in Python itself
 | ||||
|    but for backwards compatibility we will implement them. | ||||
|    Their usage without a corresponding "unlock" mechanism | ||||
|    may create issues (but they would already be there). */ | ||||
| 
 | ||||
| /* Takes an arbitrary object which must support the (character, single segment)
 | ||||
|    buffer interface and returns a pointer to a read-only memory location | ||||
|    useable as character based input for subsequent processing. | ||||
| 
 | ||||
|    Return 0 on success.  buffer and buffer_len are only set in case no error | ||||
|    occurs. Otherwise, -1 is returned and an exception set. */ | ||||
| Py_DEPRECATED(3.0) | ||||
| PyAPI_FUNC(int) PyObject_AsCharBuffer(PyObject *obj, | ||||
|                                       const char **buffer, | ||||
|                                       Py_ssize_t *buffer_len); | ||||
| 
 | ||||
| /* Checks whether an arbitrary object supports the (character, single segment)
 | ||||
|    buffer interface. | ||||
| 
 | ||||
|    Returns 1 on success, 0 on failure. */ | ||||
| Py_DEPRECATED(3.0) PyAPI_FUNC(int) PyObject_CheckReadBuffer(PyObject *obj); | ||||
| 
 | ||||
| /* Same as PyObject_AsCharBuffer() except that this API expects (readable,
 | ||||
|    single segment) buffer interface and returns a pointer to a read-only memory | ||||
|    location which can contain arbitrary data. | ||||
| 
 | ||||
|    0 is returned on success.  buffer and buffer_len are only set in case no | ||||
|    error occurs.  Otherwise, -1 is returned and an exception set. */ | ||||
| Py_DEPRECATED(3.0) | ||||
| PyAPI_FUNC(int) PyObject_AsReadBuffer(PyObject *obj, | ||||
|                                       const void **buffer, | ||||
|                                       Py_ssize_t *buffer_len); | ||||
| 
 | ||||
| /* Takes an arbitrary object which must support the (writable, single segment)
 | ||||
|    buffer interface and returns a pointer to a writable memory location in | ||||
|    buffer of size 'buffer_len'. | ||||
| 
 | ||||
|    Return 0 on success.  buffer and buffer_len are only set in case no error | ||||
|    occurs. Otherwise, -1 is returned and an exception set. */ | ||||
| Py_DEPRECATED(3.0) | ||||
| PyAPI_FUNC(int) PyObject_AsWriteBuffer(PyObject *obj, | ||||
|                                        void **buffer, | ||||
|                                        Py_ssize_t *buffer_len); | ||||
| 
 | ||||
| 
 | ||||
| /* === New Buffer API ============================================ */ | ||||
| 
 | ||||
| /* Takes an arbitrary object and returns the result of calling
 | ||||
|  |  | |||
|  | @ -0,0 +1,4 @@ | |||
| ``PyObject_AsCharBuffer()``, ``PyObject_AsReadBuffer()``, | ||||
| ``PyObject_CheckReadBuffer()``, and ``PyObject_AsWriteBuffer()`` are | ||||
| removed. Please migrate to new buffer protocol; :c:func:`PyObject_GetBuffer` | ||||
| and :c:func:`PyBuffer_Release`. | ||||
|  | @ -292,85 +292,6 @@ PyObject_CheckBuffer(PyObject *obj) | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| /* We release the buffer right after use of this function which could
 | ||||
|    cause issues later on.  Don't use these functions in new code. | ||||
|  */ | ||||
| int | ||||
| PyObject_CheckReadBuffer(PyObject *obj) | ||||
| { | ||||
|     PyBufferProcs *pb = Py_TYPE(obj)->tp_as_buffer; | ||||
|     Py_buffer view; | ||||
| 
 | ||||
|     if (pb == NULL || | ||||
|         pb->bf_getbuffer == NULL) | ||||
|         return 0; | ||||
|     if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE) == -1) { | ||||
|         PyErr_Clear(); | ||||
|         return 0; | ||||
|     } | ||||
|     PyBuffer_Release(&view); | ||||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| as_read_buffer(PyObject *obj, const void **buffer, Py_ssize_t *buffer_len) | ||||
| { | ||||
|     Py_buffer view; | ||||
| 
 | ||||
|     if (obj == NULL || buffer == NULL || buffer_len == NULL) { | ||||
|         null_error(); | ||||
|         return -1; | ||||
|     } | ||||
|     if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) != 0) | ||||
|         return -1; | ||||
| 
 | ||||
|     *buffer = view.buf; | ||||
|     *buffer_len = view.len; | ||||
|     PyBuffer_Release(&view); | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| int | ||||
| PyObject_AsCharBuffer(PyObject *obj, | ||||
|                       const char **buffer, | ||||
|                       Py_ssize_t *buffer_len) | ||||
| { | ||||
|     return as_read_buffer(obj, (const void **)buffer, buffer_len); | ||||
| } | ||||
| 
 | ||||
| int PyObject_AsReadBuffer(PyObject *obj, | ||||
|                           const void **buffer, | ||||
|                           Py_ssize_t *buffer_len) | ||||
| { | ||||
|     return as_read_buffer(obj, buffer, buffer_len); | ||||
| } | ||||
| 
 | ||||
| int PyObject_AsWriteBuffer(PyObject *obj, | ||||
|                            void **buffer, | ||||
|                            Py_ssize_t *buffer_len) | ||||
| { | ||||
|     PyBufferProcs *pb; | ||||
|     Py_buffer view; | ||||
| 
 | ||||
|     if (obj == NULL || buffer == NULL || buffer_len == NULL) { | ||||
|         null_error(); | ||||
|         return -1; | ||||
|     } | ||||
|     pb = Py_TYPE(obj)->tp_as_buffer; | ||||
|     if (pb == NULL || | ||||
|         pb->bf_getbuffer == NULL || | ||||
|         ((*pb->bf_getbuffer)(obj, &view, PyBUF_WRITABLE) != 0)) { | ||||
|         PyErr_SetString(PyExc_TypeError, | ||||
|                         "expected a writable bytes-like object"); | ||||
|         return -1; | ||||
|     } | ||||
| 
 | ||||
|     *buffer = view.buf; | ||||
|     *buffer_len = view.len; | ||||
|     PyBuffer_Release(&view); | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| /* Buffer C-API for Python 3.0 */ | ||||
| 
 | ||||
| int | ||||
|  |  | |||
|  | @ -392,11 +392,8 @@ EXPORT_FUNC(PyNumber_Subtract) | |||
| EXPORT_FUNC(PyNumber_ToBase) | ||||
| EXPORT_FUNC(PyNumber_TrueDivide) | ||||
| EXPORT_FUNC(PyNumber_Xor) | ||||
| EXPORT_FUNC(PyObject_AsCharBuffer) | ||||
| EXPORT_FUNC(PyObject_ASCII) | ||||
| EXPORT_FUNC(PyObject_AsFileDescriptor) | ||||
| EXPORT_FUNC(PyObject_AsReadBuffer) | ||||
| EXPORT_FUNC(PyObject_AsWriteBuffer) | ||||
| EXPORT_FUNC(PyObject_Bytes) | ||||
| EXPORT_FUNC(PyObject_Call) | ||||
| EXPORT_FUNC(PyObject_CallFunction) | ||||
|  | @ -405,7 +402,6 @@ EXPORT_FUNC(PyObject_CallMethod) | |||
| EXPORT_FUNC(PyObject_CallMethodObjArgs) | ||||
| EXPORT_FUNC(PyObject_CallObject) | ||||
| EXPORT_FUNC(PyObject_Calloc) | ||||
| EXPORT_FUNC(PyObject_CheckReadBuffer) | ||||
| EXPORT_FUNC(PyObject_ClearWeakRefs) | ||||
| EXPORT_FUNC(PyObject_DelItem) | ||||
| EXPORT_FUNC(PyObject_DelItemString) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Inada Naoki
						Inada Naoki