change insertdict to not steal references (#13903)
This commit is contained in:
parent
2452419921
commit
a6f195e48e
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue