Mercurial > cpython-lru_cache-weakref
diff Python/getargs.c @ 42665:85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
| author | Travis E. Oliphant <oliphant@enthought.com> |
|---|---|
| date | Sat, 18 Aug 2007 11:21:56 +0000 |
| parents | 1f7b66a9ffb0 |
| children | b9226cad9dfd |
line wrap: on
line diff
--- a/Python/getargs.c Sat Aug 18 00:10:33 2007 +0000 +++ b/Python/getargs.c Sat Aug 18 11:21:56 2007 +0000 @@ -1179,21 +1179,31 @@ void **p = va_arg(*p_va, void **); PyBufferProcs *pb = arg->ob_type->tp_as_buffer; int count; + int temp=-1; + PyBuffer view; if (pb == NULL || - pb->bf_getwritebuffer == NULL || - pb->bf_getsegcount == NULL) - return converterr("read-write buffer", arg, msgbuf, bufsize); - if ((*pb->bf_getsegcount)(arg, NULL) != 1) + pb->bf_getbuffer == NULL || + ((temp = (*pb->bf_getbuffer)(arg, &view, + PyBUF_SIMPLE)) != 0) || + view.readonly == 1) { + if (temp==0 && pb->bf_releasebuffer != NULL) { + (*pb->bf_releasebuffer)(arg, &view); + } return converterr("single-segment read-write buffer", arg, msgbuf, bufsize); - if ((count = pb->bf_getwritebuffer(arg, 0, p)) < 0) + } + + if ((count = view.len) < 0) return converterr("(unspecified)", arg, msgbuf, bufsize); + *p = view.buf; if (*format == '#') { FETCH_SIZE; STORE_SIZE(count); format++; } + if (pb->bf_releasebuffer != NULL) + (*pb->bf_releasebuffer)(arg, &view); break; } @@ -1201,23 +1211,27 @@ char **p = va_arg(*p_va, char **); PyBufferProcs *pb = arg->ob_type->tp_as_buffer; int count; + PyBuffer view; if (*format++ != '#') return converterr( "invalid use of 't' format character", arg, msgbuf, bufsize); - if (pb == NULL || pb->bf_getcharbuffer == NULL || - pb->bf_getsegcount == NULL) + if (pb == NULL || pb->bf_getbuffer == NULL) return converterr( "string or read-only character buffer", arg, msgbuf, bufsize); - if (pb->bf_getsegcount(arg, NULL) != 1) - return converterr( - "string or single-segment read-only buffer", - arg, msgbuf, bufsize); + if ((*pb->bf_getbuffer)(arg, &view, PyBUF_CHARACTER) != 0) + return converterr("string or single-segment read-only buffer", + arg, msgbuf, bufsize); - count = pb->bf_getcharbuffer(arg, 0, p); + count = view.len; + *p = view.buf; + /* XXX : shouldn't really release buffer, but it should be O.K. + */ + if (pb->bf_releasebuffer != NULL) + (*pb->bf_releasebuffer)(arg, &view); if (count < 0) return converterr("(unspecified)", arg, msgbuf, bufsize); { @@ -1241,19 +1255,24 @@ { PyBufferProcs *pb = arg->ob_type->tp_as_buffer; Py_ssize_t count; + PyBuffer view; + + *errmsg = NULL; + *p = NULL; if (pb == NULL || - pb->bf_getreadbuffer == NULL || - pb->bf_getsegcount == NULL) { + pb->bf_getbuffer == NULL) { *errmsg = "string or read-only buffer"; return -1; } - if ((*pb->bf_getsegcount)(arg, NULL) != 1) { + + if ((*pb->bf_getbuffer)(arg, &view, PyBUF_SIMPLE) != 0) { *errmsg = "string or single-segment read-only buffer"; return -1; } - if ((count = (*pb->bf_getreadbuffer)(arg, 0, p)) < 0) { - *errmsg = "(unspecified)"; - } + count = view.len; + *p = view.buf; + if (pb->bf_releasebuffer != NULL) + (*pb->bf_releasebuffer)(arg, &view); return count; }
