[Python-checkins] r84638 - in python/branches/py3k: Lib/test/test_gdb.py Tools/gdb/libpython.py

antoine.pitrou python-checkins at python.org
Wed Sep 8 23:57:37 CEST 2010


Author: antoine.pitrou
Date: Wed Sep 8 23:57:37 2010
New Revision: 84638
Log:
gdb: fix representation of non-printable surrogate pairs, and workaround
a bug in ascii().
Modified:
 python/branches/py3k/Lib/test/test_gdb.py
 python/branches/py3k/Tools/gdb/libpython.py
Modified: python/branches/py3k/Lib/test/test_gdb.py
==============================================================================
--- python/branches/py3k/Lib/test/test_gdb.py	(original)
+++ python/branches/py3k/Lib/test/test_gdb.py	Wed Sep 8 23:57:37 2010
@@ -234,7 +234,9 @@
 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)
 
Modified: python/branches/py3k/Tools/gdb/libpython.py
==============================================================================
--- python/branches/py3k/Tools/gdb/libpython.py	(original)
+++ python/branches/py3k/Tools/gdb/libpython.py	Wed Sep 8 23:57:37 2010
@@ -1171,9 +1171,8 @@
 # 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 @@
 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:


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /