Index: Python/getargs.c =================================================================== --- Python/getargs.c (révision 81589) +++ Python/getargs.c (copie de travail) @@ -881,9 +881,9 @@ 1, 0); } else { /* any buffer-like object */ - char *buf; - if (getbuffer(arg, p, &buf) < 0) - return converterr(buf, arg, msgbuf, bufsize); + char *expected; + if (getbuffer(arg, p, &expected) < 0) + return converterr(expected, arg, msgbuf, bufsize); } if (addcleanup(p, freelist, cleanup_buffer)) { return converterr( @@ -904,11 +904,10 @@ STORE_SIZE(PyBytes_GET_SIZE(uarg)); } else { /* any buffer-like object */ - /* XXX Really? */ - char *buf; - Py_ssize_t count = convertbuffer(arg, p, &buf); + char *expected; + Py_ssize_t count = convertbuffer(arg, p, &expected); if (count < 0) - return converterr(buf, arg, msgbuf, bufsize); + return converterr(expected, arg, msgbuf, bufsize); STORE_SIZE(count); } format++; @@ -933,11 +932,11 @@ case 'y': {/* any buffer-like object, but not PyUnicode */ void **p = (void **)va_arg(*p_va, char **); - char *buf; + char *expected; Py_ssize_t count; if (*format == '*') { - if (getbuffer(arg, (Py_buffer*)p, &buf) < 0) - return converterr(buf, arg, msgbuf, bufsize); + if (getbuffer(arg, (Py_buffer*)p, &expected) < 0) + return converterr(expected, arg, msgbuf, bufsize); format++; if (addcleanup(p, freelist, cleanup_buffer)) { return converterr( @@ -946,9 +945,9 @@ } break; } - count = convertbuffer(arg, p, &buf); + count = convertbuffer(arg, p, &expected); if (count < 0) - return converterr(buf, arg, msgbuf, bufsize); + return converterr(expected, arg, msgbuf, bufsize); else if (*format == '#') { FETCH_SIZE; STORE_SIZE(count); @@ -973,9 +972,9 @@ 1, 0); } else { /* any buffer-like object */ - char *buf; - if (getbuffer(arg, p, &buf) < 0) - return converterr(buf, arg, msgbuf, bufsize); + char *expected; + if (getbuffer(arg, p, &expected) < 0) + return converterr(expected, arg, msgbuf, bufsize); } if (addcleanup(p, freelist, cleanup_buffer)) { return converterr( @@ -1000,11 +999,10 @@ STORE_SIZE(PyBytes_GET_SIZE(uarg)); } else { /* any buffer-like object */ - /* XXX Really? */ - char *buf; - Py_ssize_t count = convertbuffer(arg, p, &buf); + char *expected; + Py_ssize_t count = convertbuffer(arg, p, &expected); if (count < 0) - return converterr(buf, arg, msgbuf, bufsize); + return converterr(expected, arg, msgbuf, bufsize); STORE_SIZE(count); } format++; @@ -1419,61 +1417,46 @@ } static Py_ssize_t -convertbuffer(PyObject *arg, void **p, char **errmsg) +convertbuffer(PyObject *arg, void **p, char **expected) { - PyBufferProcs *pb = arg->ob_type->tp_as_buffer; + PyBufferProcs *pb = Py_TYPE(arg)->tp_as_buffer; Py_ssize_t count; Py_buffer view; - *errmsg = NULL; + *expected = NULL; *p = NULL; if (pb == NULL || pb->bf_getbuffer == NULL || pb->bf_releasebuffer != NULL) { - *errmsg = "bytes or read-only buffer"; + *expected = "bytes or read-only buffer"; return -1; } - if (PyObject_GetBuffer(arg, &view, PyBUF_SIMPLE) != 0) { - *errmsg = "bytes or single-segment read-only buffer"; + if (getbuffer(arg, &view, expected) < 0) return -1; - } count = view.len; *p = view.buf; PyBuffer_Release(&view); return count; } -/* XXX for 3.x, getbuffer and convertbuffer can probably - be merged again. */ static int -getbuffer(PyObject *arg, Py_buffer *view, char **errmsg) +getbuffer(PyObject *arg, Py_buffer *view, char **expected) { - void *buf; - Py_ssize_t count; - PyBufferProcs *pb = arg->ob_type->tp_as_buffer; + PyBufferProcs *pb = Py_TYPE(arg)->tp_as_buffer; if (pb == NULL) { - *errmsg = "bytes or buffer"; + *expected = "bytes or buffer"; return -1; } - if (pb->bf_getbuffer) { - if (PyObject_GetBuffer(arg, view, 0) < 0) { - *errmsg = "convertible to a buffer"; - return -1; - } - if (!PyBuffer_IsContiguous(view, 'C')) { - *errmsg = "contiguous buffer"; - return -1; - } - return 0; + if (PyObject_GetBuffer(arg, view, PyBUF_SIMPLE) < 0) { + *expected = "convertible to a buffer"; + return -1; } - - count = convertbuffer(arg, &buf, errmsg); - if (count < 0) { - *errmsg = "convertible to a buffer"; - return count; + if (!PyBuffer_IsContiguous(view, 'C')) { + PyBuffer_Release(view); + *expected = "contiguous buffer"; + return -1; } - PyBuffer_FillInfo(view, NULL, buf, count, 1, 0); return 0; }