diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2010-09-08 21:57:37 +0000 |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2010-09-08 21:57:37 +0000 |
commit | 7fa4ab3d24b3141e033484275d7e84609f414cfb (patch) | |
tree | f846bb56a2d2e84a11db8b04173b4fb9e1d1c57b /Tools/gdb/libpython.py | |
parent | 975df9fcb3bb8e711cddb7548e4ae3c786282366 (diff) | |
download | cpython-7fa4ab3d24b3141e033484275d7e84609f414cfb.tar.gz |
gdb: fix representation of non-printable surrogate pairs, and workaround
a bug in ascii().
Diffstat (limited to 'Tools/gdb/libpython.py')
-rw-r--r-- | Tools/gdb/libpython.py | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py index 361fb03303..8a6980388e 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: |