[Python-checkins] cpython: change insertdict to not steal references (#13903)

benjamin.peterson python-checkins at python.org
Mon Apr 30 16:23:52 CEST 2012


http://hg.python.org/cpython/rev/c5fd332e5857
changeset: 76666:c5fd332e5857
user: Benjamin Peterson <benjamin at python.org>
date: Mon Apr 30 10:23:40 2012 -0400
summary:
 change insertdict to not steal references (#13903)
files:
 Objects/dictobject.c | 16 +++-------------
 1 files changed, 3 insertions(+), 13 deletions(-)
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -775,7 +775,6 @@
 /*
 Internal routine to insert a new item into the table.
 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.
 */
 static int
@@ -793,20 +792,19 @@
 
 ep = mp->ma_keys->dk_lookup(mp, key, hash, &value_addr);
 if (ep == NULL) {
- Py_DECREF(key);
- Py_DECREF(value);
 return -1;
 }
+ Py_INCREF(value);
 MAINTAIN_TRACKING(mp, key, value);
 old_value = *value_addr;
 if (old_value != NULL) {
 assert(ep->me_key != NULL && ep->me_key != dummy);
 *value_addr = value;
 Py_DECREF(old_value); /* which **CAN** re-enter */
- Py_DECREF(key);
 }
 else {
 if (ep->me_key == NULL) {
+ Py_INCREF(key);
 if (mp->ma_keys->dk_usable <= 0) {
 /* Need to resize. */
 if (insertion_resize(mp) < 0) {
@@ -823,11 +821,11 @@
 }
 else {
 if (ep->me_key == dummy) {
+ Py_INCREF(key);
 ep->me_key = key;
 ep->me_hash = hash;
 Py_DECREF(dummy);
 } else {
- Py_DECREF(key);
 assert(_PyDict_HasSplitTable(mp));
 }
 }
@@ -1184,8 +1182,6 @@
 if (hash == -1)
 return -1;
 }
- Py_INCREF(value);
- Py_INCREF(key);
 
 /* insertdict() handles any resizing that might be necessary */
 return insertdict(mp, key, hash, value);
@@ -1702,8 +1698,6 @@
 }
 
 while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
- Py_INCREF(key);
- Py_INCREF(value);
 if (insertdict(mp, key, hash, value)) {
 Py_DECREF(d);
 return NULL;
@@ -1724,8 +1718,6 @@
 }
 
 while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
- Py_INCREF(key);
- Py_INCREF(value);
 if (insertdict(mp, key, hash, value)) {
 Py_DECREF(d);
 return NULL;
@@ -1932,8 +1924,6 @@
 if (value != NULL &&
 (override ||
 PyDict_GetItem(a, entry->me_key) == NULL)) {
- Py_INCREF(entry->me_key);
- Py_INCREF(value);
 if (insertdict(mp, entry->me_key,
 entry->me_hash,
 value) != 0)
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /