Commit a6f195e4 authored by Benjamin Peterson's avatar Benjamin Peterson

change insertdict to not steal references (#13903)

parent 24524199
...@@ -775,7 +775,6 @@ insertion_resize(PyDictObject *mp) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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)
......
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