[Python-checkins] cpython: Issue 18797: Remove unneeded refcount adjustments for dummy objects.

raymond.hettinger python-checkins at python.org
Thu Aug 22 17:20:44 CEST 2013


http://hg.python.org/cpython/rev/ac6dab1819c4
changeset:   85329:ac6dab1819c4
parent:      85327:5b5ef012cd4e
user:        Raymond Hettinger <python at rcn.com>
date:        Thu Aug 22 08:20:31 2013 -0700
summary:
  Issue 18797:  Remove unneeded refcount adjustments for dummy objects.

It suffices to keep just one reference when the object is created.

files:
  Objects/setobject.c |  22 ++++++----------------
  1 files changed, 6 insertions(+), 16 deletions(-)


diff --git a/Objects/setobject.c b/Objects/setobject.c
--- a/Objects/setobject.c
+++ b/Objects/setobject.c
@@ -274,7 +274,6 @@
         entry->key = key;
         entry->hash = hash;
         so->used++;
-        Py_DECREF(dummy);
     } else {
         /* ACTIVE */
         Py_DECREF(key);
@@ -381,23 +380,15 @@
     so->table = newtable;
     so->mask = newsize - 1;
     memset(newtable, 0, sizeof(setentry) * newsize);
+    i = so->used;
     so->used = 0;
-    i = so->fill;
     so->fill = 0;
 
     /* Copy the data over; this is refcount-neutral for active entries;
        dummy entries aren't copied over, of course */
     dummy_entry = dummy;
     for (entry = oldtable; i > 0; entry++) {
-        if (entry->key == NULL) {
-            /* UNUSED */
-            ;
-        } else if (entry->key == dummy_entry) {
-            /* DUMMY */
-            --i;
-            assert(entry->key == dummy);
-            Py_DECREF(entry->key);
-        } else {
+        if (entry->key != NULL && entry->key != dummy_entry) {
             /* ACTIVE */
             --i;
             set_insert_clean(so, entry->key, entry->hash);
@@ -468,7 +459,6 @@
     if (entry->key == NULL  ||  entry->key == dummy)
         return DISCARD_NOTFOUND;
     old_key = entry->key;
-    Py_INCREF(dummy);
     entry->key = dummy;
     so->used--;
     Py_DECREF(old_key);
@@ -496,7 +486,6 @@
     if (entry->key == NULL  ||  entry->key == dummy)
         return DISCARD_NOTFOUND;
     old_key = entry->key;
-    Py_INCREF(dummy);
     entry->key = dummy;
     so->used--;
     Py_DECREF(old_key);
@@ -554,7 +543,8 @@
 #endif
         if (entry->key) {
             --fill;
-            Py_DECREF(entry->key);
+            if (entry->key != dummy)
+                Py_DECREF(entry->key);
         }
 #ifdef Py_DEBUG
         else
@@ -615,7 +605,8 @@
     for (entry = so->table; fill > 0; entry++) {
         if (entry->key) {
             --fill;
-            Py_DECREF(entry->key);
+            if (entry->key != dummy)
+                Py_DECREF(entry->key);
         }
     }
     if (so->table != so->smalltable)
@@ -788,7 +779,6 @@
         }
     }
     key = entry->key;
-    Py_INCREF(dummy);
     entry->key = dummy;
     so->used--;
     so->table[0].hash = i + 1;  /* next place to start */

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list