Mercurial > cpython-lru_cache-weakref
diff Tools/gdb/libpython.py @ 65485:023b41376290
libpython: implementation of os.fsencode() with surrogateescape error handler
| author | Victor Stinner <victor.stinner@haypocalc.com> |
|---|---|
| date | Sun, 17 Oct 2010 19:35:30 +0000 |
| parents | 441e94ce4087 |
| children | b340d1577dc5 |
line wrap: on
line diff
--- a/Tools/gdb/libpython.py Sun Oct 17 19:34:51 2010 +0000 +++ b/Tools/gdb/libpython.py Sun Oct 17 19:35:30 2010 +0000 @@ -96,6 +96,23 @@ text = text.encode(ENCODING, 'backslashreplace') file.write(text) +def os_fsencode(filename): + if not isinstance(filename, unicode): + return filename + encoding = sys.getfilesystemencoding() + if encoding == 'mbcs': + # mbcs doesn't support surrogateescape + return filename.encode(encoding) + encoded = [] + for char in filename: + # surrogateescape error handler + if 0xDC80 <= ord(char) <= 0xDCFF: + byte = chr(ord(char) - 0xDC00) + else: + byte = char.encode(encoding) + encoded.append(byte) + return ''.join(encoded) + class StringTruncated(RuntimeError): pass @@ -887,7 +904,8 @@ newline character''' if self.is_optimized_out(): return '(frame information optimized out)' - with open(self.filename(), 'r') as f: + filename = self.filename() + with open(os_fsencode(filename), 'r') as f: all_lines = f.readlines() # Convert from 1-based current_line_num to 0-based list offset: return all_lines[self.current_line_num()-1] @@ -1463,7 +1481,7 @@ if start<1: start = 1 - with open(filename, 'r') as f: + with open(os_fsencode(filename), 'r') as f: all_lines = f.readlines() # start and end are 1-based, all_lines is 0-based; # so [start-1:end] as a python slice gives us [start, end] as a
