Index: Python/getargs.c =================================================================== --- Python/getargs.c (révision 81794) +++ Python/getargs.c (copie de travail) @@ -864,7 +864,7 @@ break; } - /* XXX WAAAAH! 's', 'y', 'z', 'u', 'Z', 'e', 'w', 't' codes all + /* XXX WAAAAH! 's', 'y', 'z', 'u', 'Z', 'e', 'w' codes all need to be cleaned up! */ case 's': {/* text string */ @@ -1361,45 +1361,6 @@ break; } - /*TEO: This can be eliminated --- here only for backward - compatibility */ - case 't': { /* 8-bit character buffer, read-only access */ - char **p = va_arg(*p_va, char **); - PyBufferProcs *pb = arg->ob_type->tp_as_buffer; - Py_ssize_t count; - Py_buffer view; - - if (*format++ != '#') - return converterr( - "invalid use of 't' format character", - arg, msgbuf, bufsize); - if (pb == NULL || pb->bf_getbuffer == NULL) - return converterr( - "bytes or read-only character buffer", - arg, msgbuf, bufsize); - - if (PyObject_GetBuffer(arg, &view, PyBUF_SIMPLE) != 0) - return converterr("string or single-segment read-only buffer", - arg, msgbuf, bufsize); - - count = view.len; - *p = view.buf; - if (pb->bf_releasebuffer) - return converterr( - "string or pinned buffer", - arg, msgbuf, bufsize); - - PyBuffer_Release(&view); - - if (count < 0) - return converterr("(unspecified)", arg, msgbuf, bufsize); - { - FETCH_SIZE; - STORE_SIZE(count); - } - break; - } - default: return converterr("impossible", arg, msgbuf, bufsize); Index: Misc/NEWS =================================================================== --- Misc/NEWS (révision 81787) +++ Misc/NEWS (copie de travail) @@ -12,6 +12,10 @@ Core and Builtins ----------------- +- Issue #8339: Remove "t#" format of PyArg_Parse*() functions, use "y#" or "y*" + instead. codecs.charbuffer_encode() now accepts modifiable buffer objects + like bytearray. + - Issue #8837: Remove "O?" format of PyArg_Parse*() functions. The format is no used anymore and it was never documented. Index: Doc/c-api/arg.rst =================================================================== --- Doc/c-api/arg.rst (révision 81787) +++ Doc/c-api/arg.rst (copie de travail) @@ -149,13 +149,6 @@ any conversion. Raises :exc:`TypeError` if the object is not a Unicode object. The C variable may also be declared as :ctype:`PyObject\*`. -``t#`` (read-only character buffer) [char \*, int] - Like ``s#``, but accepts any object which implements the read-only buffer - interface. The :ctype:`char\*` variable is set to point to the first byte of - the buffer, and the :ctype:`int` is set to the length of the buffer. Only - single-segment buffer objects are accepted; :exc:`TypeError` is raised for all - others. - ``w`` (read-write character buffer) [char \*] Similar to ``s``, but accepts any object which implements the read-write buffer interface. The caller must determine the length of the buffer by other means, Index: Doc/whatsnew/3.2.rst =================================================================== --- Doc/whatsnew/3.2.rst (révision 81787) +++ Doc/whatsnew/3.2.rst (copie de travail) @@ -173,4 +173,6 @@ * bytearray objects cannot be used anymore as filenames: convert them to bytes +* "t#" format of PyArg_Parse*() functions has been removed: use "y#" or "y*" instead + * Stub Index: Lib/test/test_codecs.py =================================================================== --- Lib/test/test_codecs.py (révision 81787) +++ Lib/test/test_codecs.py (copie de travail) @@ -632,6 +632,8 @@ def test_string(self): self.assertEqual(codecs.charbuffer_encode(b"spam"), (b"spam", 4)) + self.assertEqual(codecs.charbuffer_encode(bytearray(b"spam")), + (b"spam", 4)) def test_empty(self): self.assertEqual(codecs.charbuffer_encode(b""), (b"", 0)) @@ -639,6 +641,7 @@ def test_bad_args(self): self.assertRaises(TypeError, codecs.charbuffer_encode) self.assertRaises(TypeError, codecs.charbuffer_encode, 42) + self.assertRaises(TypeError, codecs.charbuffer_encode, "unicode") class UTF8SigTest(ReadTest): encoding = "utf-8-sig" Index: Modules/_codecsmodule.c =================================================================== --- Modules/_codecsmodule.c (révision 81787) +++ Modules/_codecsmodule.c (copie de travail) @@ -642,15 +642,20 @@ charbuffer_encode(PyObject *self, PyObject *args) { - const char *data; + Py_buffer buffer; + const char *errors = NULL; + PyObject *bytes; Py_ssize_t size; - const char *errors = NULL; - if (!PyArg_ParseTuple(args, "t#|z:charbuffer_encode", - &data, &size, &errors)) + if (!PyArg_ParseTuple(args, "y*|z:charbuffer_encode", + &buffer, &errors)) return NULL; - return codec_tuple(PyBytes_FromStringAndSize(data, size), size); + size = buffer.len; + bytes = PyBytes_FromStringAndSize(buffer.buf, size); + PyBuffer_Release(&buffer); + + return codec_tuple(bytes, size); } static PyObject *