Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 3ffa8b9

Browse files
bpo-35384: The repr of ctypes.CArgObject no longer fails for non-ascii character. (GH-10863)
1 parent 9dfc754 commit 3ffa8b9

2 files changed

Lines changed: 23 additions & 4 deletions

File tree

Lib/ctypes/test/test_bytes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ def test_c_char(self):
1212
x.value = "y"
1313
c_char.from_param(b"x")
1414
self.assertRaises(TypeError, c_char.from_param, "x")
15+
self.assertIn('xbd', repr(c_char.from_param(b"\xbd")))
1516
(c_char * 3)(b"a", b"b", b"c")
1617
self.assertRaises(TypeError, c_char * 3, "a", "b", "c")
1718

Modules/_ctypes/callproc.c

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,12 @@ PyCArg_dealloc(PyCArgObject *self)
455455
PyObject_Del(self);
456456
}
457457

458+
static int
459+
is_literal_char(unsigned char c)
460+
{
461+
return c < 128 && _PyUnicode_IsPrintable(c) && c != '\\' && c != '\'';
462+
}
463+
458464
static PyObject *
459465
PyCArg_repr(PyCArgObject *self)
460466
{
@@ -501,8 +507,14 @@ PyCArg_repr(PyCArgObject *self)
501507
break;
502508

503509
case 'c':
504-
sprintf(buffer, "<cparam '%c' (%c)>",
505-
self->tag, self->value.c);
510+
if (is_literal_char((unsigned char)self->value.c)) {
511+
sprintf(buffer, "<cparam '%c' ('%c')>",
512+
self->tag, self->value.c);
513+
}
514+
else {
515+
sprintf(buffer, "<cparam '%c' ('\\x%02x')>",
516+
self->tag, (unsigned char)self->value.c);
517+
}
506518
break;
507519

508520
/* Hm, are these 'z' and 'Z' codes useful at all?
@@ -517,8 +529,14 @@ PyCArg_repr(PyCArgObject *self)
517529
break;
518530

519531
default:
520-
sprintf(buffer, "<cparam '%c' at %p>",
521-
self->tag, self);
532+
if (is_literal_char((unsigned char)self->tag)) {
533+
sprintf(buffer, "<cparam '%c' at %p>",
534+
(unsigned char)self->tag, self);
535+
}
536+
else {
537+
sprintf(buffer, "<cparam 0x%02x at %p>",
538+
(unsigned char)self->tag, self);
539+
}
522540
break;
523541
}
524542
return PyUnicode_FromString(buffer);

0 commit comments

Comments
 (0)