change insertdict to not steal references (#13903)

This commit is contained in:
Benjamin Peterson 2012-04-30 10:23:40 -04:00
parent 2452419921
commit a6f195e48e
1 changed files with 3 additions and 13 deletions

View File

@ -775,7 +775,6 @@ insertion_resize(PyDictObject *mp)
/* /*
Internal routine to insert a new item into the table. Internal routine to insert a new item into the table.
Used both by the internal resize routine and by the public insert routine. Used both by the internal resize routine and by the public insert routine.
Eats a reference to key and one to value.
Returns -1 if an error occurred, or 0 on success. Returns -1 if an error occurred, or 0 on success.
*/ */
static int static int
@ -793,20 +792,19 @@ insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
ep = mp->ma_keys->dk_lookup(mp, key, hash, &value_addr); ep = mp->ma_keys->dk_lookup(mp, key, hash, &value_addr);
if (ep == NULL) { if (ep == NULL) {
Py_DECREF(key);
Py_DECREF(value);
return -1; return -1;
} }
Py_INCREF(value);
MAINTAIN_TRACKING(mp, key, value); MAINTAIN_TRACKING(mp, key, value);
old_value = *value_addr; old_value = *value_addr;
if (old_value != NULL) { if (old_value != NULL) {
assert(ep->me_key != NULL && ep->me_key != dummy); assert(ep->me_key != NULL && ep->me_key != dummy);
*value_addr = value; *value_addr = value;
Py_DECREF(old_value); /* which **CAN** re-enter */ Py_DECREF(old_value); /* which **CAN** re-enter */
Py_DECREF(key);
} }
else { else {
if (ep->me_key == NULL) { if (ep->me_key == NULL) {
Py_INCREF(key);
if (mp->ma_keys->dk_usable <= 0) { if (mp->ma_keys->dk_usable <= 0) {
/* Need to resize. */ /* Need to resize. */
if (insertion_resize(mp) < 0) { if (insertion_resize(mp) < 0) {
@ -823,11 +821,11 @@ insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
} }
else { else {
if (ep->me_key == dummy) { if (ep->me_key == dummy) {
Py_INCREF(key);
ep->me_key = key; ep->me_key = key;
ep->me_hash = hash; ep->me_hash = hash;
Py_DECREF(dummy); Py_DECREF(dummy);
} else { } else {
Py_DECREF(key);
assert(_PyDict_HasSplitTable(mp)); assert(_PyDict_HasSplitTable(mp));
} }
} }
@ -1184,8 +1182,6 @@ PyDict_SetItem(PyObject *op, PyObject *key, PyObject *value)
if (hash == -1) if (hash == -1)
return -1; return -1;
} }
Py_INCREF(value);
Py_INCREF(key);
/* insertdict() handles any resizing that might be necessary */ /* insertdict() handles any resizing that might be necessary */
return insertdict(mp, key, hash, value); return insertdict(mp, key, hash, value);
@ -1702,8 +1698,6 @@ dict_fromkeys(PyObject *cls, PyObject *args)
} }
while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) { while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
Py_INCREF(key);
Py_INCREF(value);
if (insertdict(mp, key, hash, value)) { if (insertdict(mp, key, hash, value)) {
Py_DECREF(d); Py_DECREF(d);
return NULL; return NULL;
@ -1724,8 +1718,6 @@ dict_fromkeys(PyObject *cls, PyObject *args)
} }
while (_PySet_NextEntry(seq, &pos, &key, &hash)) { while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
Py_INCREF(key);
Py_INCREF(value);
if (insertdict(mp, key, hash, value)) { if (insertdict(mp, key, hash, value)) {
Py_DECREF(d); Py_DECREF(d);
return NULL; return NULL;
@ -1932,8 +1924,6 @@ PyDict_Merge(PyObject *a, PyObject *b, int override)
if (value != NULL && if (value != NULL &&
(override || (override ||
PyDict_GetItem(a, entry->me_key) == NULL)) { PyDict_GetItem(a, entry->me_key) == NULL)) {
Py_INCREF(entry->me_key);
Py_INCREF(value);
if (insertdict(mp, entry->me_key, if (insertdict(mp, entry->me_key,
entry->me_hash, entry->me_hash,
value) != 0) value) != 0)