@@ -922,21 +922,26 @@ def print_traceback(self):
922922class PySetObjectPtr (PyObjectPtr ):
923923 _typename = 'PySetObject'
924924
925+ @classmethod
926+ def _dummy_key (self ):
927+ return gdb .lookup_global_symbol ('_PySet_Dummy' ).value ()
928+
929+ def __iter__ (self ):
930+ dummy_ptr = self ._dummy_key ()
931+ table = self .field ('table' )
932+ for i in safe_range (self .field ('mask' ) + 1 ):
933+ setentry = table [i ]
934+ key = setentry ['key' ]
935+ if key != 0 and key != dummy_ptr :
936+ yield PyObjectPtr .from_pyobject_ptr (key )
937+
925938 def proxyval (self , visited ):
926939 # Guard against infinite loops:
927940 if self .as_address () in visited :
928941 return ProxyAlreadyVisited ('%s(...)' % self .safe_tp_name ())
929942 visited .add (self .as_address ())
930943
931- members = []
932- table = self .field ('table' )
933- for i in safe_range (self .field ('mask' )+ 1 ):
934- setentry = table [i ]
935- key = setentry ['key' ]
936- if key != 0 :
937- key_proxy = PyObjectPtr .from_pyobject_ptr (key ).proxyval (visited )
938- if key_proxy != '<dummy key>' :
939- members .append (key_proxy )
944+ members = (key .proxyval (visited ) for key in self )
940945 if self .safe_tp_name () == 'frozenset' :
941946 return frozenset (members )
942947 else :
@@ -965,18 +970,11 @@ def write_repr(self, out, visited):
965970
966971 out .write ('{' )
967972 first = True
968- table = self .field ('table' )
969- for i in safe_range (self .field ('mask' )+ 1 ):
970- setentry = table [i ]
971- key = setentry ['key' ]
972- if key != 0 :
973- pyop_key = PyObjectPtr .from_pyobject_ptr (key )
974- key_proxy = pyop_key .proxyval (visited ) # FIXME!
975- if key_proxy != '<dummy key>' :
976- if not first :
977- out .write (', ' )
978- first = False
979- pyop_key .write_repr (out , visited )
973+ for key in self :
974+ if not first :
975+ out .write (', ' )
976+ first = False
977+ key .write_repr (out , visited )
980978 out .write ('}' )
981979
982980 if tp_name != 'set' :
0 commit comments