summaryrefslogtreecommitdiffstats
path: root/Tools
diff options
context:
space:
mode:
Diffstat (limited to 'Tools')
-rw-r--r--Tools/gdb/libpython.py19
1 files changed, 11 insertions, 8 deletions
diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py
index 361fb03..8a69803 100644
--- a/Tools/gdb/libpython.py
+++ b/Tools/gdb/libpython.py
@@ -1171,9 +1171,8 @@ class PyUnicodeObjectPtr(PyObjectPtr):
# Non-ASCII characters
else:
ucs = ch
- orig_ucs = None
ch2 = None
- if self.char_width() == 2:
+ if sys.maxunicode < 0x10000:
# If sizeof(Py_UNICODE) is 2 here (in gdb), join
# surrogate pairs before calling _unichr_is_printable.
if (i < len(proxy)
@@ -1183,22 +1182,26 @@ class PyUnicodeObjectPtr(PyObjectPtr):
ucs = ch + ch2
i += 1
+ # Unfortuately, Python 2's unicode type doesn't seem
+ # to expose the "isprintable" method
printable = _unichr_is_printable(ucs)
if printable:
try:
ucs.encode(ENCODING)
except UnicodeEncodeError:
printable = False
- if orig_ucs is not None:
- ucs = orig_ucs
- i -= 1
# Map Unicode whitespace and control characters
# (categories Z* and C* except ASCII space)
if not printable:
- # Unfortuately, Python 2's unicode type doesn't seem
- # to expose the "isprintable" method
- code = ord(ucs)
+ if ch2 is not None:
+ # Match Python 3's representation of non-printable
+ # wide characters.
+ code = (ord(ch) & 0x03FF) << 10
+ code |= ord(ch2) & 0x03FF
+ code += 0x00010000
+ else:
+ code = ord(ucs)
# Map 8-bit characters to '\\xhh'
if code <= 0xff: