bpo-35384: The repr of ctypes.CArgObject no longer fails for non-ascii character. (GH-10863)

This commit is contained in:
Serhiy Storchaka 2018-12-06 11:16:24 +02:00 committed by GitHub
parent 9dfc754d61
commit 3ffa8b9ba1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 4 deletions

View 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")

View File

@ -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);