diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2018-12-06 09:16:24 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-06 09:16:24 (GMT) |
commit | 3ffa8b9ba190101f674a0e524e482a83ed09cccd (patch) | |
tree | 3f428419dfb3e5a9a244e95ec9924ed36308208a | |
parent | 9dfc754d61c55a526304e10a328bad448efa9ee9 (diff) | |
download | cpython-3ffa8b9ba190101f674a0e524e482a83ed09cccd.zip cpython-3ffa8b9ba190101f674a0e524e482a83ed09cccd.tar.gz cpython-3ffa8b9ba190101f674a0e524e482a83ed09cccd.tar.bz2 |
bpo-35384: The repr of ctypes.CArgObject no longer fails for non-ascii character. (GH-10863)
-rw-r--r-- | Lib/ctypes/test/test_bytes.py | 1 | ||||
-rw-r--r-- | Modules/_ctypes/callproc.c | 26 |
2 files changed, 23 insertions, 4 deletions
diff --git a/Lib/ctypes/test/test_bytes.py b/Lib/ctypes/test/test_bytes.py index 20fa056..092ec5a 100644 --- a/Lib/ctypes/test/test_bytes.py +++ b/Lib/ctypes/test/test_bytes.py @@ -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") diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 1185c91..a7965c1 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -455,6 +455,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) { @@ -501,8 +507,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? @@ -517,8 +529,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); |