]> granicus.if.org Git - python/commitdiff
visit_decref(): Two optimizations.
authorTim Peters <tim.peters@gmail.com>
Sun, 30 Jun 2002 21:31:03 +0000 (21:31 +0000)
committerTim Peters <tim.peters@gmail.com>
Sun, 30 Jun 2002 21:31:03 +0000 (21:31 +0000)
1. You're not supposed to call this with a NULL argument, although the
   docs could be clearer about that.  The other visit_XYZ() functions
   don't bother to check.  This doesn't either now, although it does
   assert non-NULL-ness now.

2. It doesn't matter whether the object is currently tracked, so don't
   bother checking that either (if it isn't currently tracked, it may
   have some nonsense value in gc_refs, but it doesn't hurt to
   decrement gibberish, and it's cheaper to do so than to make everyone
   test for trackedness).

It would be nice to get rid of the other tests on IS_TRACKED.  Perhaps
trackedness should not be a matter of not being in any gc list, but
should be a matter of being in a new "untracked" gc list.  This list
simply wouldn't be involved in the collection mechanism.  A newly
created object would be put in the untracked list.  Tracking would
simply unlink it and move it into the gen0 list.  Untracking would do
the reverse.  No test+branch needed then.  visit_move() may be vulnerable
then, though, and I don't know how this would work with the trashcan.

Modules/gcmodule.c

index b3a688c7f552d5db71b8845072c94103e57e12f5..29d62bf9e4d168dfc950d726eb356ba25a3084dd 100644 (file)
@@ -196,11 +196,9 @@ visit_decref(PyObject *op, void *data)
          * getting collected.  That would be a waste of time, but wouldn't
          * cause an error.
          */
-       if (op && PyObject_IS_GC(op)) {
-               if (IS_TRACKED(op)) {
-                       AS_GC(op)->gc.gc_refs--;
-               }
-       }
+        assert(op != NULL);
+       if (PyObject_IS_GC(op))
+               AS_GC(op)->gc.gc_refs--;
        return 0;
 }