Commit fcf3b500 authored by Raymond Hettinger's avatar Raymond Hettinger

Issue 18797: Remove unneeded refcount adjustments for dummy objects.

It suffices to keep just one reference when the object is created.
parent e39e54d0
...@@ -274,7 +274,6 @@ set_insert_key(PySetObject *so, PyObject *key, Py_hash_t hash) ...@@ -274,7 +274,6 @@ set_insert_key(PySetObject *so, PyObject *key, Py_hash_t hash)
entry->key = key; entry->key = key;
entry->hash = hash; entry->hash = hash;
so->used++; so->used++;
Py_DECREF(dummy);
} else { } else {
/* ACTIVE */ /* ACTIVE */
Py_DECREF(key); Py_DECREF(key);
...@@ -381,23 +380,15 @@ set_table_resize(PySetObject *so, Py_ssize_t minused) ...@@ -381,23 +380,15 @@ set_table_resize(PySetObject *so, Py_ssize_t minused)
so->table = newtable; so->table = newtable;
so->mask = newsize - 1; so->mask = newsize - 1;
memset(newtable, 0, sizeof(setentry) * newsize); memset(newtable, 0, sizeof(setentry) * newsize);
i = so->used;
so->used = 0; so->used = 0;
i = so->fill;
so->fill = 0; so->fill = 0;
/* Copy the data over; this is refcount-neutral for active entries; /* Copy the data over; this is refcount-neutral for active entries;
dummy entries aren't copied over, of course */ dummy entries aren't copied over, of course */
dummy_entry = dummy; dummy_entry = dummy;
for (entry = oldtable; i > 0; entry++) { for (entry = oldtable; i > 0; entry++) {
if (entry->key == NULL) { if (entry->key != NULL && entry->key != dummy_entry) {
/* UNUSED */
;
} else if (entry->key == dummy_entry) {
/* DUMMY */
--i;
assert(entry->key == dummy);
Py_DECREF(entry->key);
} else {
/* ACTIVE */ /* ACTIVE */
--i; --i;
set_insert_clean(so, entry->key, entry->hash); set_insert_clean(so, entry->key, entry->hash);
...@@ -468,7 +459,6 @@ set_discard_entry(PySetObject *so, setentry *oldentry) ...@@ -468,7 +459,6 @@ set_discard_entry(PySetObject *so, setentry *oldentry)
if (entry->key == NULL || entry->key == dummy) if (entry->key == NULL || entry->key == dummy)
return DISCARD_NOTFOUND; return DISCARD_NOTFOUND;
old_key = entry->key; old_key = entry->key;
Py_INCREF(dummy);
entry->key = dummy; entry->key = dummy;
so->used--; so->used--;
Py_DECREF(old_key); Py_DECREF(old_key);
...@@ -496,7 +486,6 @@ set_discard_key(PySetObject *so, PyObject *key) ...@@ -496,7 +486,6 @@ set_discard_key(PySetObject *so, PyObject *key)
if (entry->key == NULL || entry->key == dummy) if (entry->key == NULL || entry->key == dummy)
return DISCARD_NOTFOUND; return DISCARD_NOTFOUND;
old_key = entry->key; old_key = entry->key;
Py_INCREF(dummy);
entry->key = dummy; entry->key = dummy;
so->used--; so->used--;
Py_DECREF(old_key); Py_DECREF(old_key);
...@@ -554,7 +543,8 @@ set_clear_internal(PySetObject *so) ...@@ -554,7 +543,8 @@ set_clear_internal(PySetObject *so)
#endif #endif
if (entry->key) { if (entry->key) {
--fill; --fill;
Py_DECREF(entry->key); if (entry->key != dummy)
Py_DECREF(entry->key);
} }
#ifdef Py_DEBUG #ifdef Py_DEBUG
else else
...@@ -615,7 +605,8 @@ set_dealloc(PySetObject *so) ...@@ -615,7 +605,8 @@ set_dealloc(PySetObject *so)
for (entry = so->table; fill > 0; entry++) { for (entry = so->table; fill > 0; entry++) {
if (entry->key) { if (entry->key) {
--fill; --fill;
Py_DECREF(entry->key); if (entry->key != dummy)
Py_DECREF(entry->key);
} }
} }
if (so->table != so->smalltable) if (so->table != so->smalltable)
...@@ -788,7 +779,6 @@ set_pop(PySetObject *so) ...@@ -788,7 +779,6 @@ set_pop(PySetObject *so)
} }
} }
key = entry->key; key = entry->key;
Py_INCREF(dummy);
entry->key = dummy; entry->key = dummy;
so->used--; so->used--;
so->table[0].hash = i + 1; /* next place to start */ so->table[0].hash = i + 1; /* next place to start */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment