gdb: fix representation of non-printable surrogate pairs, and workaround

a bug in ascii().
This commit is contained in:
Antoine Pitrou 2010-09-08 21:57:37 +00:00
parent b1856d7fa7
commit 7c9cf01238
2 changed files with 14 additions and 9 deletions

View File

@ -234,7 +234,9 @@ class PrettyPrintTests(DebuggerTests):
text.encode(encoding)
printable = True
except UnicodeEncodeError:
self.assertGdbRepr(text, ascii(text))
# Workaround ascii() bug on UCS-2 builds: issue #9804
asc = "'" + text.encode('unicode-escape').decode('ascii') + "'"
self.assertGdbRepr(text, asc)
else:
self.assertGdbRepr(text)

View File

@ -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: