mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
convertbuffer() uses the buffer interface's getreadbuffer(), but 't' should use getcharbuffer().
This commit is contained in:
parent
de7c1923c7
commit
4819e97a48
1 changed files with 11 additions and 5 deletions
|
@ -635,7 +635,6 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
else { /* any buffer-like object */
|
else { /* any buffer-like object */
|
||||||
char *buf;
|
char *buf;
|
||||||
int count = convertbuffer(arg, p, &buf);
|
int count = convertbuffer(arg, p, &buf);
|
||||||
|
|
||||||
if (count < 0)
|
if (count < 0)
|
||||||
return converterr(buf, arg, msgbuf);
|
return converterr(buf, arg, msgbuf);
|
||||||
*q = count;
|
*q = count;
|
||||||
|
@ -936,7 +935,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
|
|
||||||
case 't': { /* 8-bit character buffer, read-only access */
|
case 't': { /* 8-bit character buffer, read-only access */
|
||||||
const char **p = va_arg(*p_va, const char **);
|
const char **p = va_arg(*p_va, const char **);
|
||||||
char *buf;
|
PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
|
||||||
int count;
|
int count;
|
||||||
|
|
||||||
if (*format++ != '#')
|
if (*format++ != '#')
|
||||||
|
@ -944,14 +943,21 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
"invalid use of 't' format character",
|
"invalid use of 't' format character",
|
||||||
arg, msgbuf);
|
arg, msgbuf);
|
||||||
if (!PyType_HasFeature(arg->ob_type,
|
if (!PyType_HasFeature(arg->ob_type,
|
||||||
Py_TPFLAGS_HAVE_GETCHARBUFFER))
|
Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
|
||||||
|
pb == NULL || pb->bf_getcharbuffer == NULL ||
|
||||||
|
pb->bf_getsegcount == NULL)
|
||||||
return converterr(
|
return converterr(
|
||||||
"string or read-only character buffer",
|
"string or read-only character buffer",
|
||||||
arg, msgbuf);
|
arg, msgbuf);
|
||||||
|
|
||||||
count = convertbuffer(arg, (void **)p, &buf);
|
if (pb->bf_getsegcount(arg, NULL) != 1)
|
||||||
|
return converterr(
|
||||||
|
"string or single-segment read-only buffer",
|
||||||
|
arg, msgbuf);
|
||||||
|
|
||||||
|
count = pb->bf_getcharbuffer(arg, 0, p);
|
||||||
if (count < 0)
|
if (count < 0)
|
||||||
return converterr(buf, arg, msgbuf);
|
return converterr("(unspecified)", arg, msgbuf);
|
||||||
*va_arg(*p_va, int *) = count;
|
*va_arg(*p_va, int *) = count;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue