]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-35384: The repr of ctypes.CArgObject no longer fails for non-ascii character...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Thu, 6 Dec 2018 09:41:16 +0000 (01:41 -0800)
committerGitHub <noreply@github.com>
Thu, 6 Dec 2018 09:41:16 +0000 (01:41 -0800)
(cherry picked from commit 3ffa8b9ba190101f674a0e524e482a83ed09cccd)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Lib/ctypes/test/test_bytes.py
Modules/_ctypes/callproc.c

index 20fa05650340a05608470f4091ee0bb3e1a7223c..092ec5af0524c408a2e78dbf8fa568db5233bce6 100644 (file)
@@ -12,6 +12,7 @@ class BytesTest(unittest.TestCase):
             x.value = "y"
         c_char.from_param(b"x")
         self.assertRaises(TypeError, c_char.from_param, "x")
+        self.assertIn('xbd', repr(c_char.from_param(b"\xbd")))
         (c_char * 3)(b"a", b"b", b"c")
         self.assertRaises(TypeError, c_char * 3, "a", "b", "c")
 
index 04fbc010ca7dfc88a413b00dedad1ef34d557e67..d1c190f3591086e152ce869acd582c458c31c70b 100644 (file)
@@ -452,6 +452,12 @@ PyCArg_dealloc(PyCArgObject *self)
     PyObject_Del(self);
 }
 
+static int
+is_literal_char(unsigned char c)
+{
+    return c < 128 && _PyUnicode_IsPrintable(c) && c != '\\' && c != '\'';
+}
+
 static PyObject *
 PyCArg_repr(PyCArgObject *self)
 {
@@ -498,8 +504,14 @@ PyCArg_repr(PyCArgObject *self)
         break;
 
     case 'c':
-        sprintf(buffer, "<cparam '%c' (%c)>",
-            self->tag, self->value.c);
+        if (is_literal_char((unsigned char)self->value.c)) {
+            sprintf(buffer, "<cparam '%c' ('%c')>",
+                self->tag, self->value.c);
+        }
+        else {
+            sprintf(buffer, "<cparam '%c' ('\\x%02x')>",
+                self->tag, (unsigned char)self->value.c);
+        }
         break;
 
 /* Hm, are these 'z' and 'Z' codes useful at all?
@@ -514,8 +526,14 @@ PyCArg_repr(PyCArgObject *self)
         break;
 
     default:
-        sprintf(buffer, "<cparam '%c' at %p>",
-            self->tag, self);
+        if (is_literal_char((unsigned char)self->tag)) {
+            sprintf(buffer, "<cparam '%c' at %p>",
+                (unsigned char)self->tag, self);
+        }
+        else {
+            sprintf(buffer, "<cparam 0x%02x at %p>",
+                (unsigned char)self->tag, self);
+        }
         break;
     }
     return PyUnicode_FromString(buffer);