Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9d95254

Browse files
committed
Issue #18772: fix the gdb plugin after the set implementation changes
1 parent f5e30d8 commit 9d95254

5 files changed

Lines changed: 26 additions & 31 deletions

File tree

Include/object.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -706,7 +706,6 @@ PyAPI_DATA(Py_ssize_t) _Py_RefTotal;
706706
PyAPI_FUNC(void) _Py_NegativeRefcount(const char *fname,
707707
int lineno, PyObject *op);
708708
PyAPI_FUNC(PyObject *) _PyDict_Dummy(void);
709-
PyAPI_FUNC(PyObject *) _PySet_Dummy(void);
710709
PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void);
711710
#define _Py_INC_REFTOTAL _Py_RefTotal++
712711
#define _Py_DEC_REFTOTAL _Py_RefTotal--

Include/setobject.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ struct _setobject {
6161
PyAPI_DATA(PyTypeObject) PySet_Type;
6262
PyAPI_DATA(PyTypeObject) PyFrozenSet_Type;
6363
PyAPI_DATA(PyTypeObject) PySetIter_Type;
64+
#ifndef Py_LIMITED_API
65+
PyAPI_DATA(PyObject *) _PySet_Dummy;
66+
#endif
67+
6468

6569
/* Invariants for frozensets:
6670
* data is immutable.

Objects/object.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ _Py_GetRefTotal(void)
2222
o = _PyDict_Dummy();
2323
if (o != NULL)
2424
total -= o->ob_refcnt;
25-
o = _PySet_Dummy();
25+
o = _PySet_Dummy;
2626
if (o != NULL)
2727
total -= o->ob_refcnt;
2828
return total;

Objects/setobject.c

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,12 @@ set_key_error(PyObject *arg)
2929
#define PERTURB_SHIFT 5
3030

3131
/* Object used as dummy key to fill deleted entries */
32-
3332
static PyObject _dummy_struct;
3433

3534
#define dummy (&_dummy_struct)
3635

37-
#ifdef Py_REF_DEBUG
38-
PyObject *
39-
_PySet_Dummy(void)
40-
{
41-
return dummy;
42-
}
43-
#endif
36+
/* Exported for the gdb plugin's benefit. */
37+
PyObject *_PySet_Dummy = dummy;
4438

4539
#define INIT_NONZERO_SET_SLOTS(so) do { \
4640
(so)->table = (so)->smalltable; \

Tools/gdb/libpython.py

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -922,21 +922,26 @@ def print_traceback(self):
922922
class 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

Comments
 (0)