mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
Issue #18772: fix the gdb plugin after the set implementation changes
This commit is contained in:
parent
f5e30d8b54
commit
9d95254bb7
5 changed files with 26 additions and 31 deletions
|
@ -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 != '<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 @@ 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 != '<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':
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue