diff Python/getargs.c @ 20371:8ef3e95182c3 legacy-trunk

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().
author Jeremy Hylton <jeremy@alum.mit.edu>
date Thu, 11 Oct 2001 14:40:37 +0000
parents 92d56ae63ed3
children acc7e3b4d042
line wrap: on
line diff
--- a/Python/getargs.c	Thu Oct 11 14:09:03 2001 +0000
+++ b/Python/getargs.c	Thu Oct 11 14:40:37 2001 +0000
@@ -635,7 +635,6 @@
 			else { /* any buffer-like object */
 				char *buf;
 				int count = convertbuffer(arg, p, &buf);
-
 				if (count < 0)
 					return converterr(buf, arg, msgbuf);
 				*q = count;
@@ -936,7 +935,7 @@
 		
 	case 't': { /* 8-bit character buffer, read-only access */
 		const char **p = va_arg(*p_va, const char **);
-		char *buf;
+		PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
 		int count;
 		
 		if (*format++ != '#')
@@ -944,14 +943,21 @@
 				"invalid use of 't' format character", 
 				arg, msgbuf);
 		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(
 				"string or read-only character buffer",
 				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)
-			return converterr(buf, arg, msgbuf);
+			return converterr("(unspecified)", arg, msgbuf);
 		*va_arg(*p_va, int *) = count;
 		break;
 	}