[Python-checkins] bpo-35384: The repr of ctypes.CArgObject no longer fails for non-ascii character. (GH-10863)
Miss Islington (bot)
webhook-mailer at python.org
Thu Dec 6 04:58:31 EST 2018
https://github.com/python/cpython/commit/f740818f3d92497c564d515a661039dc8434fc6c
commit: f740818f3d92497c564d515a661039dc8434fc6c
branch: 3.7
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: GitHub <noreply at github.com>
date: 2018-12-06T01:58:24-08:00
summary:
bpo-35384: The repr of ctypes.CArgObject no longer fails for non-ascii character. (GH-10863)
(cherry picked from commit 3ffa8b9ba190101f674a0e524e482a83ed09cccd)
Co-authored-by: Serhiy Storchaka <storchaka at gmail.com>
files:
M Lib/ctypes/test/test_bytes.py
M Modules/_ctypes/callproc.c
diff --git a/Lib/ctypes/test/test_bytes.py b/Lib/ctypes/test/test_bytes.py
index 20fa05650340..092ec5af0524 100644
--- a/Lib/ctypes/test/test_bytes.py
+++ b/Lib/ctypes/test/test_bytes.py
@@ -12,6 +12,7 @@ def test_c_char(self):
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 ad40ca1c5247..ec596b4de31d 100644
--- a/Modules/_ctypes/callproc.c
+++ b/Modules/_ctypes/callproc.c
@@ -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);
More information about the Python-checkins
mailing list