Mercurial > cpython-lru_cache-weakref
diff Tools/gdb/libpython.py @ 85366:2f1bac39565a
Issue #18772: fix the gdb plugin after the set implementation changes
| author | Antoine Pitrou <solipsis@pitrou.net> |
|---|---|
| date | Sat, 24 Aug 2013 21:07:07 +0200 |
| parents | 6d971b172389 |
| children | 6b28bfff9204 |
line wrap: on
line diff
--- a/Tools/gdb/libpython.py Sat Aug 24 20:52:45 2013 +0200 +++ b/Tools/gdb/libpython.py Sat Aug 24 21:07:07 2013 +0200 @@ -922,21 +922,26 @@ 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 != '<dummy key>': - 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 @@ 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 != '<dummy key>': - 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':
