summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2018-12-06 09:16:24 (GMT)
committerGitHub <noreply@github.com>2018-12-06 09:16:24 (GMT)
commit3ffa8b9ba190101f674a0e524e482a83ed09cccd (patch)
tree3f428419dfb3e5a9a244e95ec9924ed36308208a /Modules
parent9dfc754d61c55a526304e10a328bad448efa9ee9 (diff)
downloadcpython-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)
Diffstat (limited to 'Modules')
-rw-r--r--Modules/_ctypes/callproc.c26
1 files changed, 22 insertions, 4 deletions
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);