From 7d54a25e4656a985c7e468b28cc1ff247e8c9a5d Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 11 Apr 2013 21:37:45 +0200 Subject: python-gdb.py: Replace invalid Unicode character with U+FFFD to be able to display invalid strings. Such strings can be found while Python is creating a new string, in a text decoder for example, when Python is compiled in debug mode. --- Tools/gdb/libpython.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'Tools/gdb') diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py index cab226e5d0..20dcda8d12 100644 --- a/Tools/gdb/libpython.py +++ b/Tools/gdb/libpython.py @@ -1160,7 +1160,9 @@ class PyUnicodeObjectPtr(PyObjectPtr): # Convert the int code points to unicode characters, and generate a # local unicode instance. # This splits surrogate pairs if sizeof(Py_UNICODE) is 2 here (in gdb). - result = u''.join([_unichr(ucs) for ucs in Py_UNICODEs]) + result = u''.join([ + (_unichr(ucs) if ucs <= 0x10ffff else '\ufffd') + for ucs in Py_UNICODEs]) return result def write_repr(self, out, visited): -- cgit v1.2.1 From c120a5b619a30e764a8f03e321b308e717195b77 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Sat, 24 Aug 2013 21:07:07 +0200 Subject: Issue #18772: fix the gdb plugin after the set implementation changes --- Tools/gdb/libpython.py | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) (limited to 'Tools/gdb') diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py index ef69359d1e..684713fe22 100644 --- a/Tools/gdb/libpython.py +++ b/Tools/gdb/libpython.py @@ -922,21 +922,26 @@ class PyFrameObjectPtr(PyObjectPtr): class PySetObjectPtr(PyObjectPtr): _typename = 'PySetObject' + @classmethod + def _dummy_key(self): + return gdb.lookup_global_symbol('_PySet_Dummy').value() + + def __iter__(self): + dummy_ptr = self._dummy_key() + table = self.field('table') + for i in safe_range(self.field('mask') + 1): + setentry = table[i] + key = setentry['key'] + if key != 0 and key != dummy_ptr: + yield PyObjectPtr.from_pyobject_ptr(key) + def proxyval(self, visited): # Guard against infinite loops: if self.as_address() in visited: return ProxyAlreadyVisited('%s(...)' % self.safe_tp_name()) visited.add(self.as_address()) - members = [] - table = self.field('table') - for i in safe_range(self.field('mask')+1): - setentry = table[i] - key = setentry['key'] - if key != 0: - key_proxy = PyObjectPtr.from_pyobject_ptr(key).proxyval(visited) - if key_proxy != '': - members.append(key_proxy) + members = (key.proxyval(visited) for key in self) if self.safe_tp_name() == 'frozenset': return frozenset(members) else: @@ -965,18 +970,11 @@ class PySetObjectPtr(PyObjectPtr): out.write('{') first = True - table = self.field('table') - for i in safe_range(self.field('mask')+1): - setentry = table[i] - key = setentry['key'] - if key != 0: - pyop_key = PyObjectPtr.from_pyobject_ptr(key) - key_proxy = pyop_key.proxyval(visited) # FIXME! - if key_proxy != '': - if not first: - out.write(', ') - first = False - pyop_key.write_repr(out, visited) + for key in self: + if not first: + out.write(', ') + first = False + key.write_repr(out, visited) out.write('}') if tp_name != 'set': -- cgit v1.2.1