remove memory indirections in dict_traverse (closes #27956)

This commit is contained in:
Benjamin Peterson 2016-09-05 12:12:59 -07:00
parent 2250c4cb81
commit 55f445282d

View file

@ -2519,24 +2519,26 @@ dict_popitem(PyDictObject *mp)
static int static int
dict_traverse(PyObject *op, visitproc visit, void *arg) dict_traverse(PyObject *op, visitproc visit, void *arg)
{ {
Py_ssize_t i, n;
PyDictObject *mp = (PyDictObject *)op; PyDictObject *mp = (PyDictObject *)op;
if (mp->ma_keys->dk_lookup == lookdict) { PyDictKeysObject *keys = mp->ma_keys;
for (i = 0; i < DK_SIZE(mp->ma_keys); i++) { PyDictKeyEntry *entries = &keys->dk_entries[0];
if (mp->ma_keys->dk_entries[i].me_value != NULL) { Py_ssize_t i, n = DK_SIZE(mp->ma_keys);
Py_VISIT(mp->ma_keys->dk_entries[i].me_value); if (keys->dk_lookup == lookdict) {
Py_VISIT(mp->ma_keys->dk_entries[i].me_key); for (i = 0; i < n; i++) {
if (entries[i].me_value != NULL) {
Py_VISIT(entries[i].me_value);
Py_VISIT(entries[i].me_key);
} }
} }
} else { } else {
if (mp->ma_values != NULL) { if (mp->ma_values != NULL) {
for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) { for (i = 0; i < n; i++) {
Py_VISIT(mp->ma_values[i]); Py_VISIT(mp->ma_values[i]);
} }
} }
else { else {
for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) { for (i = 0; i < n; i++) {
Py_VISIT(mp->ma_keys->dk_entries[i].me_value); Py_VISIT(entries[i].me_value);
} }
} }
} }