[Jython-checkins] jython: Improved traverse method of derived classes.

stefan.richthofer jython-checkins at python.org
Tue Feb 24 05:27:51 CET 2015


https://hg.python.org/jython/rev/9f045cc6d5b0
changeset:   7598:9f045cc6d5b0
user:        Stefan Richthofer <stefan.richthofer at gmx.de>
date:        Tue Feb 24 05:27:15 2015 +0100
summary:
  Improved traverse method of derived classes.
Further added test for (time-consuming) non-PyObject finalizers
notifying gc and improved various gc-related docstrings.

files:
  Lib/test/test_gc_jy.py                                                   |  59 ++++++++-
  src/org/python/antlr/ast/AssertDerived.java                              |  11 +-
  src/org/python/antlr/ast/AssignDerived.java                              |  11 +-
  src/org/python/antlr/ast/AttributeDerived.java                           |  11 +-
  src/org/python/antlr/ast/AugAssignDerived.java                           |  11 +-
  src/org/python/antlr/ast/BinOpDerived.java                               |  11 +-
  src/org/python/antlr/ast/BoolOpDerived.java                              |  11 +-
  src/org/python/antlr/ast/BreakDerived.java                               |  11 +-
  src/org/python/antlr/ast/CallDerived.java                                |  11 +-
  src/org/python/antlr/ast/ClassDefDerived.java                            |  11 +-
  src/org/python/antlr/ast/CompareDerived.java                             |  11 +-
  src/org/python/antlr/ast/ContinueDerived.java                            |  11 +-
  src/org/python/antlr/ast/DeleteDerived.java                              |  11 +-
  src/org/python/antlr/ast/DictDerived.java                                |  11 +-
  src/org/python/antlr/ast/EllipsisDerived.java                            |  11 +-
  src/org/python/antlr/ast/ExceptHandlerDerived.java                       |  11 +-
  src/org/python/antlr/ast/ExecDerived.java                                |  11 +-
  src/org/python/antlr/ast/ExprDerived.java                                |  11 +-
  src/org/python/antlr/ast/ExpressionDerived.java                          |  11 +-
  src/org/python/antlr/ast/ExtSliceDerived.java                            |  11 +-
  src/org/python/antlr/ast/ForDerived.java                                 |  11 +-
  src/org/python/antlr/ast/FunctionDefDerived.java                         |  11 +-
  src/org/python/antlr/ast/GeneratorExpDerived.java                        |  11 +-
  src/org/python/antlr/ast/GlobalDerived.java                              |  11 +-
  src/org/python/antlr/ast/IfDerived.java                                  |  11 +-
  src/org/python/antlr/ast/IfExpDerived.java                               |  11 +-
  src/org/python/antlr/ast/ImportDerived.java                              |  11 +-
  src/org/python/antlr/ast/ImportFromDerived.java                          |  11 +-
  src/org/python/antlr/ast/IndexDerived.java                               |  11 +-
  src/org/python/antlr/ast/InteractiveDerived.java                         |  11 +-
  src/org/python/antlr/ast/LambdaDerived.java                              |  11 +-
  src/org/python/antlr/ast/ListCompDerived.java                            |  11 +-
  src/org/python/antlr/ast/ListDerived.java                                |  11 +-
  src/org/python/antlr/ast/ModuleDerived.java                              |  11 +-
  src/org/python/antlr/ast/NameDerived.java                                |  11 +-
  src/org/python/antlr/ast/NumDerived.java                                 |  11 +-
  src/org/python/antlr/ast/PassDerived.java                                |  11 +-
  src/org/python/antlr/ast/PrintDerived.java                               |  11 +-
  src/org/python/antlr/ast/RaiseDerived.java                               |  11 +-
  src/org/python/antlr/ast/ReprDerived.java                                |  11 +-
  src/org/python/antlr/ast/ReturnDerived.java                              |  11 +-
  src/org/python/antlr/ast/SliceDerived.java                               |  11 +-
  src/org/python/antlr/ast/StrDerived.java                                 |  11 +-
  src/org/python/antlr/ast/SubscriptDerived.java                           |  11 +-
  src/org/python/antlr/ast/SuiteDerived.java                               |  11 +-
  src/org/python/antlr/ast/TryExceptDerived.java                           |  11 +-
  src/org/python/antlr/ast/TryFinallyDerived.java                          |  11 +-
  src/org/python/antlr/ast/TupleDerived.java                               |  11 +-
  src/org/python/antlr/ast/UnaryOpDerived.java                             |  11 +-
  src/org/python/antlr/ast/WhileDerived.java                               |  11 +-
  src/org/python/antlr/ast/WithDerived.java                                |  11 +-
  src/org/python/antlr/ast/YieldDerived.java                               |  11 +-
  src/org/python/antlr/ast/aliasDerived.java                               |  11 +-
  src/org/python/antlr/ast/argumentsDerived.java                           |  11 +-
  src/org/python/antlr/ast/comprehensionDerived.java                       |  11 +-
  src/org/python/antlr/ast/keywordDerived.java                             |  11 +-
  src/org/python/antlr/op/AddDerived.java                                  |  11 +-
  src/org/python/antlr/op/AndDerived.java                                  |  11 +-
  src/org/python/antlr/op/AugLoadDerived.java                              |  11 +-
  src/org/python/antlr/op/AugStoreDerived.java                             |  11 +-
  src/org/python/antlr/op/BitAndDerived.java                               |  11 +-
  src/org/python/antlr/op/BitOrDerived.java                                |  11 +-
  src/org/python/antlr/op/BitXorDerived.java                               |  11 +-
  src/org/python/antlr/op/DelDerived.java                                  |  11 +-
  src/org/python/antlr/op/DivDerived.java                                  |  11 +-
  src/org/python/antlr/op/EqDerived.java                                   |  11 +-
  src/org/python/antlr/op/FloorDivDerived.java                             |  11 +-
  src/org/python/antlr/op/GtDerived.java                                   |  11 +-
  src/org/python/antlr/op/GtEDerived.java                                  |  11 +-
  src/org/python/antlr/op/InDerived.java                                   |  11 +-
  src/org/python/antlr/op/InvertDerived.java                               |  11 +-
  src/org/python/antlr/op/IsDerived.java                                   |  11 +-
  src/org/python/antlr/op/IsNotDerived.java                                |  11 +-
  src/org/python/antlr/op/LShiftDerived.java                               |  11 +-
  src/org/python/antlr/op/LoadDerived.java                                 |  11 +-
  src/org/python/antlr/op/LtDerived.java                                   |  11 +-
  src/org/python/antlr/op/LtEDerived.java                                  |  11 +-
  src/org/python/antlr/op/ModDerived.java                                  |  11 +-
  src/org/python/antlr/op/MultDerived.java                                 |  11 +-
  src/org/python/antlr/op/NotDerived.java                                  |  11 +-
  src/org/python/antlr/op/NotEqDerived.java                                |  11 +-
  src/org/python/antlr/op/NotInDerived.java                                |  11 +-
  src/org/python/antlr/op/OrDerived.java                                   |  11 +-
  src/org/python/antlr/op/ParamDerived.java                                |  11 +-
  src/org/python/antlr/op/PowDerived.java                                  |  11 +-
  src/org/python/antlr/op/RShiftDerived.java                               |  11 +-
  src/org/python/antlr/op/StoreDerived.java                                |  11 +-
  src/org/python/antlr/op/SubDerived.java                                  |  11 +-
  src/org/python/antlr/op/UAddDerived.java                                 |  11 +-
  src/org/python/antlr/op/USubDerived.java                                 |  11 +-
  src/org/python/core/ClasspathPyImporterDerived.java                      |  11 +-
  src/org/python/core/JyAttribute.java                                     |   4 +-
  src/org/python/core/PyArrayDerived.java                                  |  11 +-
  src/org/python/core/PyBaseExceptionDerived.java                          |  11 +-
  src/org/python/core/PyByteArrayDerived.java                              |  11 +-
  src/org/python/core/PyClassMethodDerived.java                            |  11 +-
  src/org/python/core/PyComplexDerived.java                                |  11 +-
  src/org/python/core/PyDictionaryDerived.java                             |  11 +-
  src/org/python/core/PyEnumerateDerived.java                              |  11 +-
  src/org/python/core/PyFileDerived.java                                   |  11 +-
  src/org/python/core/PyFloatDerived.java                                  |  11 +-
  src/org/python/core/PyFrozenSetDerived.java                              |  11 +-
  src/org/python/core/PyInstance.java                                      |   3 -
  src/org/python/core/PyIntegerDerived.java                                |  11 +-
  src/org/python/core/PyListDerived.java                                   |  11 +-
  src/org/python/core/PyLongDerived.java                                   |  11 +-
  src/org/python/core/PyModuleDerived.java                                 |  11 +-
  src/org/python/core/PyObjectDerived.java                                 |  11 +-
  src/org/python/core/PyPropertyDerived.java                               |  11 +-
  src/org/python/core/PySetDerived.java                                    |  11 +-
  src/org/python/core/PyStringDerived.java                                 |  11 +-
  src/org/python/core/PySuperDerived.java                                  |  11 +-
  src/org/python/core/PyTupleDerived.java                                  |  11 +-
  src/org/python/core/PyTypeDerived.java                                   |  11 +-
  src/org/python/core/PyUnicodeDerived.java                                |  11 +-
  src/org/python/core/Traverseproc.java                                    |  25 ++-
  src/org/python/core/finalization/FinalizableBuiltin.java                 |  17 +-
  src/org/python/core/finalization/FinalizablePyObject.java                |  53 ++++----
  src/org/python/modules/PyStructDerived.java                              |  11 +-
  src/org/python/modules/_collections/PyDefaultDictDerived.java            |  11 +-
  src/org/python/modules/_collections/PyDequeDerived.java                  |  11 +-
  src/org/python/modules/_csv/PyDialectDerived.java                        |  11 +-
  src/org/python/modules/_functools/PyPartialDerived.java                  |  11 +-
  src/org/python/modules/_io/PyFileIODerived.java                          |  11 +-
  src/org/python/modules/_io/PyIOBaseDerived.java                          |  11 +-
  src/org/python/modules/_io/PyRawIOBaseDerived.java                       |  11 +-
  src/org/python/modules/_weakref/ReferenceTypeDerived.java                |  11 +-
  src/org/python/modules/bz2/PyBZ2CompressorDerived.java                   |  11 +-
  src/org/python/modules/bz2/PyBZ2DecompressorDerived.java                 |  11 +-
  src/org/python/modules/bz2/PyBZ2FileDerived.java                         |  11 +-
  src/org/python/modules/gc.java                                           |  18 +-
  src/org/python/modules/itertools/PyTeeIteratorDerived.java               |  11 +-
  src/org/python/modules/itertools/chainDerived.java                       |  11 +-
  src/org/python/modules/itertools/combinationsDerived.java                |  11 +-
  src/org/python/modules/itertools/combinationsWithReplacementDerived.java |  11 +-
  src/org/python/modules/itertools/compressDerived.java                    |  11 +-
  src/org/python/modules/itertools/countDerived.java                       |  11 +-
  src/org/python/modules/itertools/cycleDerived.java                       |  11 +-
  src/org/python/modules/itertools/dropwhileDerived.java                   |  11 +-
  src/org/python/modules/itertools/groupbyDerived.java                     |  11 +-
  src/org/python/modules/itertools/ifilterDerived.java                     |  11 +-
  src/org/python/modules/itertools/ifilterfalseDerived.java                |  11 +-
  src/org/python/modules/itertools/isliceDerived.java                      |  11 +-
  src/org/python/modules/itertools/izipDerived.java                        |  11 +-
  src/org/python/modules/itertools/izipLongestDerived.java                 |  11 +-
  src/org/python/modules/itertools/permutationsDerived.java                |  11 +-
  src/org/python/modules/itertools/productDerived.java                     |  11 +-
  src/org/python/modules/itertools/repeatDerived.java                      |  11 +-
  src/org/python/modules/itertools/starmapDerived.java                     |  11 +-
  src/org/python/modules/itertools/takewhileDerived.java                   |  11 +-
  src/org/python/modules/random/PyRandomDerived.java                       |  11 +-
  src/org/python/modules/thread/PyLocalDerived.java                        |  11 +-
  src/org/python/modules/zipimport/zipimporterDerived.java                 |  11 +-
  src/templates/gderived-defs                                              |  11 +-
  tests/java/javatests/GCTestHelper.java                                   |  25 ++++-
  155 files changed, 1167 insertions(+), 654 deletions(-)


diff --git a/Lib/test/test_gc_jy.py b/Lib/test/test_gc_jy.py
--- a/Lib/test/test_gc_jy.py
+++ b/Lib/test/test_gc_jy.py
@@ -18,6 +18,7 @@
     #i.e. not Jython is running
     pass
 
+
 class GCTests_Jy_CyclicGarbage(unittest.TestCase):
 
     @classmethod
@@ -38,7 +39,6 @@
         except Exception:
             pass
 
-
     # In contrast to the tests in test_gc, these finalizer tests shall work
     # even if gc-monitoring is disabled.
     def test_finalizer(self):
@@ -66,7 +66,6 @@
             self.fail("didn't find obj in garbage (finalizer)")
         gc.garbage.remove(obj)
 
-
     def test_finalizer_newclass(self):
         # A() is uncollectable if it is part of a cycle, make sure it shows up
         # in gc.garbage.
@@ -115,17 +114,13 @@
 class GCTests_Jy_preprocess_and_postprocess(unittest.TestCase):
 
     def test_finalization_preprocess_and_postprocess(self):
-        #print "test_finalization_preprocess_and_postprocess"
         #Note that this test is done here again (already was in another class
         #in this module), to see that everything works as it should also with
         #a different flag-context.
-        #print "test_finalization_preprocess_and_postprocess"
-        #gc.removeJythonGCFlags(gc.DONT_FINALIZE_RESURRECTED_OBJECTS)
         comments = []
         self0 = self
         class A:
             def __del__(self):
-                #print "del A"
                 self0.assertIn("run PreProcess", comments)
                 comments.append("A del")
                 #let's simulate a time-consuming finalizer
@@ -171,6 +166,55 @@
         gc.unregisterPreFinalizationProcess(prePr)
         gc.unregisterPostFinalizationProcess(postPr)
 
+    def test_with_extern_NonPyObjectFinalizer_that_notifies_gc(self):
+        #Note that this test is done here again (already was in another class
+        #in this module), to see that everything works as it should also with
+        #a different flag-context.
+        comments = []
+        class A:
+            def __init__(self, index):
+                self.index = index
+
+            def __del__(self):
+                comments.append("A_del_"+str(self.index))
+
+        class PreProcess(Runnable):
+            preCount = 0
+            def run(self):
+                PreProcess.preCount += 1
+
+        class PostProcess(Runnable):
+            postCount = 0
+            def run(self):
+                PostProcess.postCount += 1
+
+        prePr = PreProcess()
+        postPr = PostProcess()
+        time.sleep(1) #   <- to avoid that the newly registered processes
+                      #      become subject to previous run (remember: We
+                      #      are not in monitor-mode, i.e. gc runs async.
+        gc.registerPreFinalizationProcess(prePr)
+        gc.registerPostFinalizationProcess(postPr)
+        for i in range(4):
+            f = A(i)
+            del f
+        #NastyFinalizer would cause this test occasionally to fail
+        externFinalizer = GCTestHelper.NotSoNastyFinalizer()
+        del externFinalizer
+        for i in range(4, 8):
+            f = A(i)
+            del f
+        System.gc()
+        #we wait a bit longer here, since PostProcess runs asynchronous
+        #and must wait for the finalizer of A
+        time.sleep(4)
+        self.assertEqual(len(comments), 8)
+        self.assertEqual(PreProcess.preCount, 1)
+        self.assertEqual(PostProcess.postCount, 1)
+        comments = []
+        gc.unregisterPreFinalizationProcess(prePr)
+        gc.unregisterPostFinalizationProcess(postPr)
+
 
 @unittest.skipUnless(test_support.is_jython,
         'This class tests detailed Jython-specific behavior.')
@@ -367,7 +411,6 @@
         del a
         del c
         #gc.set_debug(gc.DEBUG_SAVEALL)
-        #gc.collect()
         self.assertEqual(gc.collect(), 0) #c is not cyclic and a, b are resurrected,
                                           #so nothing to count here
         #self.asserEqual(len(gc.garbage), 0)
@@ -381,7 +424,6 @@
 
     def test_notifyRerun_for_delayed_finalization(self):
         gc.collect()
-        resurrect = []
         comments = []
 
         class Test_Finalizable(object):
@@ -618,7 +660,6 @@
         except Exception:
             pass
 
-
     def test_weakref_after_resurrection_threadsafe(self):
         gc.collect()
 
diff --git a/src/org/python/antlr/ast/AssertDerived.java b/src/org/python/antlr/ast/AssertDerived.java
--- a/src/org/python/antlr/ast/AssertDerived.java
+++ b/src/org/python/antlr/ast/AssertDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/AssignDerived.java b/src/org/python/antlr/ast/AssignDerived.java
--- a/src/org/python/antlr/ast/AssignDerived.java
+++ b/src/org/python/antlr/ast/AssignDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/AttributeDerived.java b/src/org/python/antlr/ast/AttributeDerived.java
--- a/src/org/python/antlr/ast/AttributeDerived.java
+++ b/src/org/python/antlr/ast/AttributeDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/AugAssignDerived.java b/src/org/python/antlr/ast/AugAssignDerived.java
--- a/src/org/python/antlr/ast/AugAssignDerived.java
+++ b/src/org/python/antlr/ast/AugAssignDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/BinOpDerived.java b/src/org/python/antlr/ast/BinOpDerived.java
--- a/src/org/python/antlr/ast/BinOpDerived.java
+++ b/src/org/python/antlr/ast/BinOpDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/BoolOpDerived.java b/src/org/python/antlr/ast/BoolOpDerived.java
--- a/src/org/python/antlr/ast/BoolOpDerived.java
+++ b/src/org/python/antlr/ast/BoolOpDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/BreakDerived.java b/src/org/python/antlr/ast/BreakDerived.java
--- a/src/org/python/antlr/ast/BreakDerived.java
+++ b/src/org/python/antlr/ast/BreakDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/CallDerived.java b/src/org/python/antlr/ast/CallDerived.java
--- a/src/org/python/antlr/ast/CallDerived.java
+++ b/src/org/python/antlr/ast/CallDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/ClassDefDerived.java b/src/org/python/antlr/ast/ClassDefDerived.java
--- a/src/org/python/antlr/ast/ClassDefDerived.java
+++ b/src/org/python/antlr/ast/ClassDefDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/CompareDerived.java b/src/org/python/antlr/ast/CompareDerived.java
--- a/src/org/python/antlr/ast/CompareDerived.java
+++ b/src/org/python/antlr/ast/CompareDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/ContinueDerived.java b/src/org/python/antlr/ast/ContinueDerived.java
--- a/src/org/python/antlr/ast/ContinueDerived.java
+++ b/src/org/python/antlr/ast/ContinueDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/DeleteDerived.java b/src/org/python/antlr/ast/DeleteDerived.java
--- a/src/org/python/antlr/ast/DeleteDerived.java
+++ b/src/org/python/antlr/ast/DeleteDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/DictDerived.java b/src/org/python/antlr/ast/DictDerived.java
--- a/src/org/python/antlr/ast/DictDerived.java
+++ b/src/org/python/antlr/ast/DictDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/EllipsisDerived.java b/src/org/python/antlr/ast/EllipsisDerived.java
--- a/src/org/python/antlr/ast/EllipsisDerived.java
+++ b/src/org/python/antlr/ast/EllipsisDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/ExceptHandlerDerived.java b/src/org/python/antlr/ast/ExceptHandlerDerived.java
--- a/src/org/python/antlr/ast/ExceptHandlerDerived.java
+++ b/src/org/python/antlr/ast/ExceptHandlerDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/ExecDerived.java b/src/org/python/antlr/ast/ExecDerived.java
--- a/src/org/python/antlr/ast/ExecDerived.java
+++ b/src/org/python/antlr/ast/ExecDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/ExprDerived.java b/src/org/python/antlr/ast/ExprDerived.java
--- a/src/org/python/antlr/ast/ExprDerived.java
+++ b/src/org/python/antlr/ast/ExprDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/ExpressionDerived.java b/src/org/python/antlr/ast/ExpressionDerived.java
--- a/src/org/python/antlr/ast/ExpressionDerived.java
+++ b/src/org/python/antlr/ast/ExpressionDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/ExtSliceDerived.java b/src/org/python/antlr/ast/ExtSliceDerived.java
--- a/src/org/python/antlr/ast/ExtSliceDerived.java
+++ b/src/org/python/antlr/ast/ExtSliceDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/ForDerived.java b/src/org/python/antlr/ast/ForDerived.java
--- a/src/org/python/antlr/ast/ForDerived.java
+++ b/src/org/python/antlr/ast/ForDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/FunctionDefDerived.java b/src/org/python/antlr/ast/FunctionDefDerived.java
--- a/src/org/python/antlr/ast/FunctionDefDerived.java
+++ b/src/org/python/antlr/ast/FunctionDefDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/GeneratorExpDerived.java b/src/org/python/antlr/ast/GeneratorExpDerived.java
--- a/src/org/python/antlr/ast/GeneratorExpDerived.java
+++ b/src/org/python/antlr/ast/GeneratorExpDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/GlobalDerived.java b/src/org/python/antlr/ast/GlobalDerived.java
--- a/src/org/python/antlr/ast/GlobalDerived.java
+++ b/src/org/python/antlr/ast/GlobalDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/IfDerived.java b/src/org/python/antlr/ast/IfDerived.java
--- a/src/org/python/antlr/ast/IfDerived.java
+++ b/src/org/python/antlr/ast/IfDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/IfExpDerived.java b/src/org/python/antlr/ast/IfExpDerived.java
--- a/src/org/python/antlr/ast/IfExpDerived.java
+++ b/src/org/python/antlr/ast/IfExpDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/ImportDerived.java b/src/org/python/antlr/ast/ImportDerived.java
--- a/src/org/python/antlr/ast/ImportDerived.java
+++ b/src/org/python/antlr/ast/ImportDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/ImportFromDerived.java b/src/org/python/antlr/ast/ImportFromDerived.java
--- a/src/org/python/antlr/ast/ImportFromDerived.java
+++ b/src/org/python/antlr/ast/ImportFromDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/IndexDerived.java b/src/org/python/antlr/ast/IndexDerived.java
--- a/src/org/python/antlr/ast/IndexDerived.java
+++ b/src/org/python/antlr/ast/IndexDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/InteractiveDerived.java b/src/org/python/antlr/ast/InteractiveDerived.java
--- a/src/org/python/antlr/ast/InteractiveDerived.java
+++ b/src/org/python/antlr/ast/InteractiveDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/LambdaDerived.java b/src/org/python/antlr/ast/LambdaDerived.java
--- a/src/org/python/antlr/ast/LambdaDerived.java
+++ b/src/org/python/antlr/ast/LambdaDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/ListCompDerived.java b/src/org/python/antlr/ast/ListCompDerived.java
--- a/src/org/python/antlr/ast/ListCompDerived.java
+++ b/src/org/python/antlr/ast/ListCompDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/ListDerived.java b/src/org/python/antlr/ast/ListDerived.java
--- a/src/org/python/antlr/ast/ListDerived.java
+++ b/src/org/python/antlr/ast/ListDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/ModuleDerived.java b/src/org/python/antlr/ast/ModuleDerived.java
--- a/src/org/python/antlr/ast/ModuleDerived.java
+++ b/src/org/python/antlr/ast/ModuleDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/NameDerived.java b/src/org/python/antlr/ast/NameDerived.java
--- a/src/org/python/antlr/ast/NameDerived.java
+++ b/src/org/python/antlr/ast/NameDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/NumDerived.java b/src/org/python/antlr/ast/NumDerived.java
--- a/src/org/python/antlr/ast/NumDerived.java
+++ b/src/org/python/antlr/ast/NumDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/PassDerived.java b/src/org/python/antlr/ast/PassDerived.java
--- a/src/org/python/antlr/ast/PassDerived.java
+++ b/src/org/python/antlr/ast/PassDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/PrintDerived.java b/src/org/python/antlr/ast/PrintDerived.java
--- a/src/org/python/antlr/ast/PrintDerived.java
+++ b/src/org/python/antlr/ast/PrintDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/RaiseDerived.java b/src/org/python/antlr/ast/RaiseDerived.java
--- a/src/org/python/antlr/ast/RaiseDerived.java
+++ b/src/org/python/antlr/ast/RaiseDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/ReprDerived.java b/src/org/python/antlr/ast/ReprDerived.java
--- a/src/org/python/antlr/ast/ReprDerived.java
+++ b/src/org/python/antlr/ast/ReprDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/ReturnDerived.java b/src/org/python/antlr/ast/ReturnDerived.java
--- a/src/org/python/antlr/ast/ReturnDerived.java
+++ b/src/org/python/antlr/ast/ReturnDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/SliceDerived.java b/src/org/python/antlr/ast/SliceDerived.java
--- a/src/org/python/antlr/ast/SliceDerived.java
+++ b/src/org/python/antlr/ast/SliceDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/StrDerived.java b/src/org/python/antlr/ast/StrDerived.java
--- a/src/org/python/antlr/ast/StrDerived.java
+++ b/src/org/python/antlr/ast/StrDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/SubscriptDerived.java b/src/org/python/antlr/ast/SubscriptDerived.java
--- a/src/org/python/antlr/ast/SubscriptDerived.java
+++ b/src/org/python/antlr/ast/SubscriptDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/SuiteDerived.java b/src/org/python/antlr/ast/SuiteDerived.java
--- a/src/org/python/antlr/ast/SuiteDerived.java
+++ b/src/org/python/antlr/ast/SuiteDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/TryExceptDerived.java b/src/org/python/antlr/ast/TryExceptDerived.java
--- a/src/org/python/antlr/ast/TryExceptDerived.java
+++ b/src/org/python/antlr/ast/TryExceptDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/TryFinallyDerived.java b/src/org/python/antlr/ast/TryFinallyDerived.java
--- a/src/org/python/antlr/ast/TryFinallyDerived.java
+++ b/src/org/python/antlr/ast/TryFinallyDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/TupleDerived.java b/src/org/python/antlr/ast/TupleDerived.java
--- a/src/org/python/antlr/ast/TupleDerived.java
+++ b/src/org/python/antlr/ast/TupleDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/UnaryOpDerived.java b/src/org/python/antlr/ast/UnaryOpDerived.java
--- a/src/org/python/antlr/ast/UnaryOpDerived.java
+++ b/src/org/python/antlr/ast/UnaryOpDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/WhileDerived.java b/src/org/python/antlr/ast/WhileDerived.java
--- a/src/org/python/antlr/ast/WhileDerived.java
+++ b/src/org/python/antlr/ast/WhileDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/WithDerived.java b/src/org/python/antlr/ast/WithDerived.java
--- a/src/org/python/antlr/ast/WithDerived.java
+++ b/src/org/python/antlr/ast/WithDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/YieldDerived.java b/src/org/python/antlr/ast/YieldDerived.java
--- a/src/org/python/antlr/ast/YieldDerived.java
+++ b/src/org/python/antlr/ast/YieldDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/aliasDerived.java b/src/org/python/antlr/ast/aliasDerived.java
--- a/src/org/python/antlr/ast/aliasDerived.java
+++ b/src/org/python/antlr/ast/aliasDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/argumentsDerived.java b/src/org/python/antlr/ast/argumentsDerived.java
--- a/src/org/python/antlr/ast/argumentsDerived.java
+++ b/src/org/python/antlr/ast/argumentsDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/comprehensionDerived.java b/src/org/python/antlr/ast/comprehensionDerived.java
--- a/src/org/python/antlr/ast/comprehensionDerived.java
+++ b/src/org/python/antlr/ast/comprehensionDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/ast/keywordDerived.java b/src/org/python/antlr/ast/keywordDerived.java
--- a/src/org/python/antlr/ast/keywordDerived.java
+++ b/src/org/python/antlr/ast/keywordDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/AddDerived.java b/src/org/python/antlr/op/AddDerived.java
--- a/src/org/python/antlr/op/AddDerived.java
+++ b/src/org/python/antlr/op/AddDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/AndDerived.java b/src/org/python/antlr/op/AndDerived.java
--- a/src/org/python/antlr/op/AndDerived.java
+++ b/src/org/python/antlr/op/AndDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/AugLoadDerived.java b/src/org/python/antlr/op/AugLoadDerived.java
--- a/src/org/python/antlr/op/AugLoadDerived.java
+++ b/src/org/python/antlr/op/AugLoadDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/AugStoreDerived.java b/src/org/python/antlr/op/AugStoreDerived.java
--- a/src/org/python/antlr/op/AugStoreDerived.java
+++ b/src/org/python/antlr/op/AugStoreDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/BitAndDerived.java b/src/org/python/antlr/op/BitAndDerived.java
--- a/src/org/python/antlr/op/BitAndDerived.java
+++ b/src/org/python/antlr/op/BitAndDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/BitOrDerived.java b/src/org/python/antlr/op/BitOrDerived.java
--- a/src/org/python/antlr/op/BitOrDerived.java
+++ b/src/org/python/antlr/op/BitOrDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/BitXorDerived.java b/src/org/python/antlr/op/BitXorDerived.java
--- a/src/org/python/antlr/op/BitXorDerived.java
+++ b/src/org/python/antlr/op/BitXorDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/DelDerived.java b/src/org/python/antlr/op/DelDerived.java
--- a/src/org/python/antlr/op/DelDerived.java
+++ b/src/org/python/antlr/op/DelDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/DivDerived.java b/src/org/python/antlr/op/DivDerived.java
--- a/src/org/python/antlr/op/DivDerived.java
+++ b/src/org/python/antlr/op/DivDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/EqDerived.java b/src/org/python/antlr/op/EqDerived.java
--- a/src/org/python/antlr/op/EqDerived.java
+++ b/src/org/python/antlr/op/EqDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/FloorDivDerived.java b/src/org/python/antlr/op/FloorDivDerived.java
--- a/src/org/python/antlr/op/FloorDivDerived.java
+++ b/src/org/python/antlr/op/FloorDivDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/GtDerived.java b/src/org/python/antlr/op/GtDerived.java
--- a/src/org/python/antlr/op/GtDerived.java
+++ b/src/org/python/antlr/op/GtDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/GtEDerived.java b/src/org/python/antlr/op/GtEDerived.java
--- a/src/org/python/antlr/op/GtEDerived.java
+++ b/src/org/python/antlr/op/GtEDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/InDerived.java b/src/org/python/antlr/op/InDerived.java
--- a/src/org/python/antlr/op/InDerived.java
+++ b/src/org/python/antlr/op/InDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/InvertDerived.java b/src/org/python/antlr/op/InvertDerived.java
--- a/src/org/python/antlr/op/InvertDerived.java
+++ b/src/org/python/antlr/op/InvertDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/IsDerived.java b/src/org/python/antlr/op/IsDerived.java
--- a/src/org/python/antlr/op/IsDerived.java
+++ b/src/org/python/antlr/op/IsDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/IsNotDerived.java b/src/org/python/antlr/op/IsNotDerived.java
--- a/src/org/python/antlr/op/IsNotDerived.java
+++ b/src/org/python/antlr/op/IsNotDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/LShiftDerived.java b/src/org/python/antlr/op/LShiftDerived.java
--- a/src/org/python/antlr/op/LShiftDerived.java
+++ b/src/org/python/antlr/op/LShiftDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/LoadDerived.java b/src/org/python/antlr/op/LoadDerived.java
--- a/src/org/python/antlr/op/LoadDerived.java
+++ b/src/org/python/antlr/op/LoadDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/LtDerived.java b/src/org/python/antlr/op/LtDerived.java
--- a/src/org/python/antlr/op/LtDerived.java
+++ b/src/org/python/antlr/op/LtDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/LtEDerived.java b/src/org/python/antlr/op/LtEDerived.java
--- a/src/org/python/antlr/op/LtEDerived.java
+++ b/src/org/python/antlr/op/LtEDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/ModDerived.java b/src/org/python/antlr/op/ModDerived.java
--- a/src/org/python/antlr/op/ModDerived.java
+++ b/src/org/python/antlr/op/ModDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/MultDerived.java b/src/org/python/antlr/op/MultDerived.java
--- a/src/org/python/antlr/op/MultDerived.java
+++ b/src/org/python/antlr/op/MultDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/NotDerived.java b/src/org/python/antlr/op/NotDerived.java
--- a/src/org/python/antlr/op/NotDerived.java
+++ b/src/org/python/antlr/op/NotDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/NotEqDerived.java b/src/org/python/antlr/op/NotEqDerived.java
--- a/src/org/python/antlr/op/NotEqDerived.java
+++ b/src/org/python/antlr/op/NotEqDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/NotInDerived.java b/src/org/python/antlr/op/NotInDerived.java
--- a/src/org/python/antlr/op/NotInDerived.java
+++ b/src/org/python/antlr/op/NotInDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/OrDerived.java b/src/org/python/antlr/op/OrDerived.java
--- a/src/org/python/antlr/op/OrDerived.java
+++ b/src/org/python/antlr/op/OrDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/ParamDerived.java b/src/org/python/antlr/op/ParamDerived.java
--- a/src/org/python/antlr/op/ParamDerived.java
+++ b/src/org/python/antlr/op/ParamDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/PowDerived.java b/src/org/python/antlr/op/PowDerived.java
--- a/src/org/python/antlr/op/PowDerived.java
+++ b/src/org/python/antlr/op/PowDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/RShiftDerived.java b/src/org/python/antlr/op/RShiftDerived.java
--- a/src/org/python/antlr/op/RShiftDerived.java
+++ b/src/org/python/antlr/op/RShiftDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/StoreDerived.java b/src/org/python/antlr/op/StoreDerived.java
--- a/src/org/python/antlr/op/StoreDerived.java
+++ b/src/org/python/antlr/op/StoreDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/SubDerived.java b/src/org/python/antlr/op/SubDerived.java
--- a/src/org/python/antlr/op/SubDerived.java
+++ b/src/org/python/antlr/op/SubDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/UAddDerived.java b/src/org/python/antlr/op/UAddDerived.java
--- a/src/org/python/antlr/op/UAddDerived.java
+++ b/src/org/python/antlr/op/UAddDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/antlr/op/USubDerived.java b/src/org/python/antlr/op/USubDerived.java
--- a/src/org/python/antlr/op/USubDerived.java
+++ b/src/org/python/antlr/op/USubDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/ClasspathPyImporterDerived.java b/src/org/python/core/ClasspathPyImporterDerived.java
--- a/src/org/python/core/ClasspathPyImporterDerived.java
+++ b/src/org/python/core/ClasspathPyImporterDerived.java
@@ -33,12 +33,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/JyAttribute.java b/src/org/python/core/JyAttribute.java
--- a/src/org/python/core/JyAttribute.java
+++ b/src/org/python/core/JyAttribute.java
@@ -40,7 +40,7 @@
      * Stores list of weak references linking to this {@code PyObject}.
      * This list is weakref-based, so it does not keep the
      * weakrefs alive. This is the only way to find out which
-     * weakrefs (i.e. org.python.modules._weakref.AbstractReference)
+     * weakrefs (i.e. {@link org.python.modules._weakref.AbstractReference})
      * linked to the object after a resurrection. A weak
      * hash-map-based approach for this purpose would break on
      * resurrection.
@@ -48,7 +48,7 @@
     public static final byte WEAK_REF_ATTR = 0; //first transient
 
     /**
-     * Reserved for use by <a href="http://www.jyni.org">JyNI</a>.
+     * Reserved for use by <a href="http://www.jyni.org" target="_blank">JyNI</a>.
      */
     public static final byte JYNI_HANDLE_ATTR = 1;
 
diff --git a/src/org/python/core/PyArrayDerived.java b/src/org/python/core/PyArrayDerived.java
--- a/src/org/python/core/PyArrayDerived.java
+++ b/src/org/python/core/PyArrayDerived.java
@@ -33,12 +33,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/PyBaseExceptionDerived.java b/src/org/python/core/PyBaseExceptionDerived.java
--- a/src/org/python/core/PyBaseExceptionDerived.java
+++ b/src/org/python/core/PyBaseExceptionDerived.java
@@ -33,12 +33,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/PyByteArrayDerived.java b/src/org/python/core/PyByteArrayDerived.java
--- a/src/org/python/core/PyByteArrayDerived.java
+++ b/src/org/python/core/PyByteArrayDerived.java
@@ -33,12 +33,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/PyClassMethodDerived.java b/src/org/python/core/PyClassMethodDerived.java
--- a/src/org/python/core/PyClassMethodDerived.java
+++ b/src/org/python/core/PyClassMethodDerived.java
@@ -33,12 +33,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/PyComplexDerived.java b/src/org/python/core/PyComplexDerived.java
--- a/src/org/python/core/PyComplexDerived.java
+++ b/src/org/python/core/PyComplexDerived.java
@@ -33,12 +33,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/PyDictionaryDerived.java b/src/org/python/core/PyDictionaryDerived.java
--- a/src/org/python/core/PyDictionaryDerived.java
+++ b/src/org/python/core/PyDictionaryDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/PyEnumerateDerived.java b/src/org/python/core/PyEnumerateDerived.java
--- a/src/org/python/core/PyEnumerateDerived.java
+++ b/src/org/python/core/PyEnumerateDerived.java
@@ -33,12 +33,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/PyFileDerived.java b/src/org/python/core/PyFileDerived.java
--- a/src/org/python/core/PyFileDerived.java
+++ b/src/org/python/core/PyFileDerived.java
@@ -33,12 +33,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/PyFloatDerived.java b/src/org/python/core/PyFloatDerived.java
--- a/src/org/python/core/PyFloatDerived.java
+++ b/src/org/python/core/PyFloatDerived.java
@@ -33,12 +33,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/PyFrozenSetDerived.java b/src/org/python/core/PyFrozenSetDerived.java
--- a/src/org/python/core/PyFrozenSetDerived.java
+++ b/src/org/python/core/PyFrozenSetDerived.java
@@ -33,12 +33,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/PyInstance.java b/src/org/python/core/PyInstance.java
--- a/src/org/python/core/PyInstance.java
+++ b/src/org/python/core/PyInstance.java
@@ -1963,9 +1963,6 @@
     /* Traverseproc implementation */
     @Override
     public int traverse(Visitproc visit, Object arg) {
-//        Potential PyObject refs in PyInstance:
-//        public transient PyClass instclass;
-//        public PyObject __dict__;
         if (instclass != null) {
             int retVal = visit.visit(instclass, arg);
             if (retVal != 0) {
diff --git a/src/org/python/core/PyIntegerDerived.java b/src/org/python/core/PyIntegerDerived.java
--- a/src/org/python/core/PyIntegerDerived.java
+++ b/src/org/python/core/PyIntegerDerived.java
@@ -33,12 +33,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/PyListDerived.java b/src/org/python/core/PyListDerived.java
--- a/src/org/python/core/PyListDerived.java
+++ b/src/org/python/core/PyListDerived.java
@@ -33,12 +33,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/PyLongDerived.java b/src/org/python/core/PyLongDerived.java
--- a/src/org/python/core/PyLongDerived.java
+++ b/src/org/python/core/PyLongDerived.java
@@ -33,12 +33,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/PyModuleDerived.java b/src/org/python/core/PyModuleDerived.java
--- a/src/org/python/core/PyModuleDerived.java
+++ b/src/org/python/core/PyModuleDerived.java
@@ -33,12 +33,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/PyObjectDerived.java b/src/org/python/core/PyObjectDerived.java
--- a/src/org/python/core/PyObjectDerived.java
+++ b/src/org/python/core/PyObjectDerived.java
@@ -33,12 +33,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/PyPropertyDerived.java b/src/org/python/core/PyPropertyDerived.java
--- a/src/org/python/core/PyPropertyDerived.java
+++ b/src/org/python/core/PyPropertyDerived.java
@@ -33,12 +33,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/PySetDerived.java b/src/org/python/core/PySetDerived.java
--- a/src/org/python/core/PySetDerived.java
+++ b/src/org/python/core/PySetDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/PyStringDerived.java b/src/org/python/core/PyStringDerived.java
--- a/src/org/python/core/PyStringDerived.java
+++ b/src/org/python/core/PyStringDerived.java
@@ -33,12 +33,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/PySuperDerived.java b/src/org/python/core/PySuperDerived.java
--- a/src/org/python/core/PySuperDerived.java
+++ b/src/org/python/core/PySuperDerived.java
@@ -33,12 +33,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/PyTupleDerived.java b/src/org/python/core/PyTupleDerived.java
--- a/src/org/python/core/PyTupleDerived.java
+++ b/src/org/python/core/PyTupleDerived.java
@@ -33,12 +33,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/PyTypeDerived.java b/src/org/python/core/PyTypeDerived.java
--- a/src/org/python/core/PyTypeDerived.java
+++ b/src/org/python/core/PyTypeDerived.java
@@ -33,12 +33,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/PyUnicodeDerived.java b/src/org/python/core/PyUnicodeDerived.java
--- a/src/org/python/core/PyUnicodeDerived.java
+++ b/src/org/python/core/PyUnicodeDerived.java
@@ -33,12 +33,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/core/Traverseproc.java b/src/org/python/core/Traverseproc.java
--- a/src/org/python/core/Traverseproc.java
+++ b/src/org/python/core/Traverseproc.java
@@ -2,10 +2,12 @@
 
 /**
  * <p>
- * This interface defines a CPython equivalent traverse mechanism allowing
- * to detect reference cycles. While this is crucial for cyclic gc support
- * in CPython, it only serves debugging purposes in Jython. As a side effect
- * it allows a more complete implementation of the gc module.
+ * This interface defines a
+ * <a href="https://docs.python.org/2.7/c-api/gcsupport.html" target="_blank">
+ * CPython equivalent traverse mechanism
+ * </a> allowing to detect reference cycles. While this is crucial for cyclic
+ * gc support in CPython, it only serves debugging purposes in Jython. As a side
+ * effect it allows a more complete implementation of the gc module.
  * </p>
  * <p>
  * Note that implementing this interface is only OPTIONAL.<b> Gc will work fine
@@ -32,7 +34,8 @@
  * gc behaviors.
  * </p>
  * <p>
- * Further this mechanism is crucial for some aspects of gc-support of the JyNI
+ * Further this mechanism is crucial for some aspects of gc-support of the
+ * <a href="http://www.jyni.org" target="_blank">JyNI</a>
  * project. JyNI does not strictly depend on it to emulate CPython's gc
  * for extensions, but would have to perform inefficient reflection-based
  * traversal in some edge-cases (which might also conflict security managers).
@@ -447,19 +450,23 @@
 public interface Traverseproc {
 
     /**
-     * Traverses all reachable {@code PyObject}s.
+     * Traverses all directly contained {@code PyObject}s.
      * Like in CPython, {@code arg} must be passed
      * unmodified to {@code visit} as its second parameter.
-     * If {@code visit.visit} returns nonzero, this return value
+     * If {@link Visitproc#visit(PyObject, Object)} returns
+     * nonzero, this return value
      * must be returned immediately by traverse.
+     * 
+     * {@link Visitproc#visit(PyObject, Object)} must not be
+     * called with a {@code null} PyObject-argument.
      */
     public int traverse(Visitproc visit, Object arg);
 
     /**
      * Optional operation.
      * Should only be implemented if it is more efficient
-     * than calling {@code traverse} with a visitproc
-     * that just watches out for {@code ob}.
+     * than calling {@link #traverse(Visitproc, Object)} with
+     * a visitproc that just watches out for {@code ob}.
      * Must return {@code false} if {@code ob} is {@code null}.
      */
     public boolean refersDirectlyTo(PyObject ob) throws UnsupportedOperationException;
diff --git a/src/org/python/core/finalization/FinalizableBuiltin.java b/src/org/python/core/finalization/FinalizableBuiltin.java
--- a/src/org/python/core/finalization/FinalizableBuiltin.java
+++ b/src/org/python/core/finalization/FinalizableBuiltin.java
@@ -6,13 +6,16 @@
 
 public interface FinalizableBuiltin {
     /**
-     * {@code __del_builtin__} is the built-in's own finalizer, while
-     * {@code __del_derived__} refers to an instance's in-dict {@code __del__}.
-     * A FinalizeTrigger calls {@code __del_derived__} first and
-     * - if existent - {@code __del_builtin__} after that. A plain {@code __del__}
-     * would behave as overwritten by {@code __del__Derived}, i.e. won't be called
-     * if the type implements {@code FinalizablePyObjectDerived} while
-     * {@code __del_builtin__} is called in any case.
+     * {@link #__del_builtin__()} is the built-in's own finalizer, while
+     * {@link FinalizablePyObjectDerived#__del_derived__()} refers to an
+     * instance's in-dict {@code __del__}.
+     * A FinalizeTrigger calls {@link FinalizablePyObjectDerived#__del_derived__()}
+     * first and - if existent - {@link #__del_builtin__()} after that. A plain
+     * {@link FinalizablePyObject#__del__()}
+     * would behave as overwritten by
+     * {@link FinalizablePyObjectDerived#__del_derived__()}, i.e. won't be called
+     * if the type implements {@link FinalizablePyObjectDerived}, while
+     * {@link #__del_builtin__()} is called in any case.
      */
     public void __del_builtin__();
 }
diff --git a/src/org/python/core/finalization/FinalizablePyObject.java b/src/org/python/core/finalization/FinalizablePyObject.java
--- a/src/org/python/core/finalization/FinalizablePyObject.java
+++ b/src/org/python/core/finalization/FinalizablePyObject.java
@@ -9,20 +9,22 @@
  * {@link org.python.core.finalization.FinalizableBuiltin}.
  * </p>
  * <p>
- * The difference is that {@code __del__} can be overwritten by a
+ * The difference is that {@link #__del__()} can be overwritten by a
  * new-style subclass's {@code __del__}-method on Python-side, while
- * {@code __del_builtin__} is always called. If a Python-side
- * finalizer exists, {@code __del_builtin__} will be called after the
+ * {@link FinalizableBuiltin#__del_builtin__()} is always called.
+ * If a Python-side finalizer exists,
+ * {@link FinalizableBuiltin#__del_builtin__()} will be called after the
  * Python-side finalizer has been processed.
  * </p>
  * <p>
  * One can even implement both interfaces.
- * If both interfaces are implemented, the {@code FinalizeTrigger} will
- * call {@code __del__} first and then {@code __del_builtin__}. If a
+ * If both interfaces are implemented, the {@link FinalizeTrigger} will
+ * call {@link #__del__()} first and then
+ * {@link FinalizableBuiltin#__del_builtin__()}. If a
  * new-style subclass has an own, Python-side {@code __del__}-method, this
- * overwrites the Java-implemented {@code __del__}, but not
- * {@code __del_builtin__}, which will be called after the Python-side
- * finalizer.
+ * overwrites the Java-implemented {@link #__del__()}, but not
+ * {@link FinalizableBuiltin#__del_builtin__()}, which will be called after
+ * the Python-side finalizer.
  * </p>
  * <p>
  * If you are writing a custom built-in that shall directly
@@ -32,38 +34,38 @@
  * <p>
  * <ol>
  * <li>
- *     Let your subclass implement {@code FinalizablePyObject}
- *     (or {@link org.python.core.finalization.FinalizableBuiltin}).
+ *     Let your subclass implement {@link FinalizablePyObject}
+ *     (or {@link FinalizableBuiltin}).
  * </li>
  * <li>
  *    In every constructor call<br>
  *    {@code FinalizeTrigger.ensureFinalizer(this);}<br>
  * </li>
  * <li>
- *    Write your {@code __del__}-method however you intend it.
- *    (or {@code __del__Builtin} if
- *    {@link org.python.core.finalization.FinalizableBuiltin} was used)
+ *    Write your {@link #__del__()}-method however you intend it.
+ *    (or {@link FinalizableBuiltin#__del_builtin__()} if
+ *    {@link FinalizableBuiltin} was used)
  * </li>
  * <li>
  *    (optional)<br>
  *    If your finalizer resurrects the object (Python allows this) and you wish the
  *    finalizer to run again on next collection of the object:<br>
- *    In the block where the resurrection occurs, let your {@code __del__}- or
- *    {@code __del_builtin__}-method call<br>
+ *    In the block where the resurrection occurs, let your {@link #__del__()}- or
+ *    {@link FinalizableBuiltin#__del_builtin__()}-method call<br>
  *    {@code FinalizeTrigger.ensureFinalizer(this);}.
  *    If you implement {@code __del__} in Python and need this functionality, you can
  *    simply call {@code someObject.__ensure_finalizer__()}<br>
- *    Note that this is Jython specific and should be surrounded by a {@code try/except}
- *    block to ensure compatibility with other Python implementations.
+ *    Note that this is Jython-specific and should be surrounded by a
+ *    {@code try/except}-block to ensure compatibility with other Python implementations.
  * </li>
  * </ol>
  * </p>
  * <p>
  * Note: Regarding to object resurrection, Jython currently behaves like CPython >= 3.4.
- * That means the finalizer {@code __del__} or {@code __del_builtin__} is called only the
- * first time an object gets gc'ed. If pre-3.4.-behavior is required for some reason (i.e.
- * have the finalizer called repeatedly on every collection after a resurrection), one can
- * achieve this manually via step 5).
+ * That means the finalizer {@link #__del__()} or {@link FinalizableBuiltin#__del_builtin__()}
+ * is called only the first time an object gets gc'ed. If pre-3.4.-behavior is required for
+ * some reason (i.e. have the finalizer called repeatedly on every collection after a
+ * resurrection), one can achieve this manually via step 5).
  * </p>
  * <p>
  * The built-in function {@code __ensure_finalizer__} is also useful if a class acquires a
@@ -72,7 +74,7 @@
  * CPython).
  * However, one can manually tell earlier created instances to become finalizable by
  * calling {@code __ensure_finalizer__()} on them. As mentioned above, it is recommended to
- * surround this with a {@code try/except} block to ensure compatibility with other Python
+ * surround this with a {@code try/except}-block to ensure compatibility with other Python
  * implementations.
  * </p>
  * <p>
@@ -82,8 +84,8 @@
  * </p>
  * <p>
  * It is possible to switch finalization on and off at any desired time for a certain object.
- * This can be helpful if it is only necessary to have {@code __del__} or
- * {@code __del_builtin__} called for certain configurations of an object.
+ * This can be helpful if it is only necessary to have {@link #__del__()} or
+ * {@link FinalizableBuiltin#__del_builtin__()} called for certain configurations of an object.
  * </p>
  * <p>
  * To turn off the finalizer, call</br>
@@ -91,6 +93,9 @@
  * To turn it on again, call</br>
  * {@code ((FinalizeTrigger) JyAttribute.getAttr(this, JyAttribute.FINALIZE_TRIGGER_ATTR)).trigger(this);}
  * </p>
+ * 
+ * @see org.python.core.JyAttribute#FINALIZE_TRIGGER_ATTR
+ * @see FinalizableBuiltin#__del_builtin__()
  */
 
 public interface FinalizablePyObject {
diff --git a/src/org/python/modules/PyStructDerived.java b/src/org/python/modules/PyStructDerived.java
--- a/src/org/python/modules/PyStructDerived.java
+++ b/src/org/python/modules/PyStructDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/_collections/PyDefaultDictDerived.java b/src/org/python/modules/_collections/PyDefaultDictDerived.java
--- a/src/org/python/modules/_collections/PyDefaultDictDerived.java
+++ b/src/org/python/modules/_collections/PyDefaultDictDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/_collections/PyDequeDerived.java b/src/org/python/modules/_collections/PyDequeDerived.java
--- a/src/org/python/modules/_collections/PyDequeDerived.java
+++ b/src/org/python/modules/_collections/PyDequeDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/_csv/PyDialectDerived.java b/src/org/python/modules/_csv/PyDialectDerived.java
--- a/src/org/python/modules/_csv/PyDialectDerived.java
+++ b/src/org/python/modules/_csv/PyDialectDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/_functools/PyPartialDerived.java b/src/org/python/modules/_functools/PyPartialDerived.java
--- a/src/org/python/modules/_functools/PyPartialDerived.java
+++ b/src/org/python/modules/_functools/PyPartialDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/_io/PyFileIODerived.java b/src/org/python/modules/_io/PyFileIODerived.java
--- a/src/org/python/modules/_io/PyFileIODerived.java
+++ b/src/org/python/modules/_io/PyFileIODerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/_io/PyIOBaseDerived.java b/src/org/python/modules/_io/PyIOBaseDerived.java
--- a/src/org/python/modules/_io/PyIOBaseDerived.java
+++ b/src/org/python/modules/_io/PyIOBaseDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/_io/PyRawIOBaseDerived.java b/src/org/python/modules/_io/PyRawIOBaseDerived.java
--- a/src/org/python/modules/_io/PyRawIOBaseDerived.java
+++ b/src/org/python/modules/_io/PyRawIOBaseDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/_weakref/ReferenceTypeDerived.java b/src/org/python/modules/_weakref/ReferenceTypeDerived.java
--- a/src/org/python/modules/_weakref/ReferenceTypeDerived.java
+++ b/src/org/python/modules/_weakref/ReferenceTypeDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/bz2/PyBZ2CompressorDerived.java b/src/org/python/modules/bz2/PyBZ2CompressorDerived.java
--- a/src/org/python/modules/bz2/PyBZ2CompressorDerived.java
+++ b/src/org/python/modules/bz2/PyBZ2CompressorDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/bz2/PyBZ2DecompressorDerived.java b/src/org/python/modules/bz2/PyBZ2DecompressorDerived.java
--- a/src/org/python/modules/bz2/PyBZ2DecompressorDerived.java
+++ b/src/org/python/modules/bz2/PyBZ2DecompressorDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/bz2/PyBZ2FileDerived.java b/src/org/python/modules/bz2/PyBZ2FileDerived.java
--- a/src/org/python/modules/bz2/PyBZ2FileDerived.java
+++ b/src/org/python/modules/bz2/PyBZ2FileDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/gc.java b/src/org/python/modules/gc.java
--- a/src/org/python/modules/gc.java
+++ b/src/org/python/modules/gc.java
@@ -939,8 +939,7 @@
      * to care for other finalizers these must call
      * {@code gc.notifyPreFinalization()} before anything else is done and
      * {@code gc.notifyPostFinalization()} afterwards; between these calls the finalizer
-     * must not terminate by throwing an exception). (Note: Using this for extern
-     * finalizers is currently experimental and needs more testing.)
+     * must not terminate by throwing an exception).
      * This works independently from monitoring, which is mainly needed to allow
      * counting of cyclic garbage in {@link #collect()}.
      * </p>
@@ -960,7 +959,6 @@
      * {@code gc.notifyPreFinalization()} before anything else is done and
      * {@code gc.notifyPostFinalization()} right before the finalization method returns.
      * Between these calls the finalizer must not terminate by throwing an exception.
-     * (Note: Using this for extern finalizers is currently experimental and needs more testing.)
      * </p>
      * <p>
      * We recommend to use this feature in a way such that false-positive runs are
@@ -1039,8 +1037,7 @@
      * to care for other finalizers these must call
      * {@code gc.notifyPreFinalization()} before anything else is done and
      * {@code gc.notifyPostFinalization()} afterwards; between these calls the finalizer
-     * must not terminate by throwing an exception). (Note: Using this for extern
-     * finalizers is currently experimental and needs more testing.)
+     * must not terminate by throwing an exception).
      * This works independently from monitoring (which is mainly needed to allow
      * garbage counting in {@link #collect()}).
      * </p>
@@ -1061,7 +1058,6 @@
      * {@code gc.notifyPreFinalization()} before anything else is done and
      * {@code gc.notifyPostFinalization()} right before the finalization method returns.
      * Between these calls the finalizer must not terminate by throwing an exception.
-     * (Note: Using this for extern finalizers is currently experimental and needs more testing.)
      * </p>
      * <p>
      * If it runs too early, we can at least guarantee that it will run again after
@@ -1532,7 +1528,7 @@
      * Not supported by Jython.
      * Throws {@link org.python.core.Py#NotImplementedError}.
      *
-     * @throws org.python.core.Py#NotImplementedError
+     * @throws org.python.core.Py.NotImplementedError
      */
     public static void disable() {
         throw Py.NotImplementedError("can't disable Java GC");
@@ -2000,7 +1996,7 @@
      * Not supported by Jython.
      * Throws {@link org.python.core.Py#NotImplementedError}.
      *
-     * @throws org.python.core.Py#NotImplementedError
+     * @throws org.python.core.Py.NotImplementedError
      */
     public static PyObject get_count() {
         throw Py.NotImplementedError("not applicable to Java GC");
@@ -2047,7 +2043,7 @@
      * Not supported by Jython.
      * Throws {@link org.python.core.Py#NotImplementedError}.
      *
-     * @throws org.python.core.Py#NotImplementedError
+     * @throws org.python.core.Py.NotImplementedError
      */
     public static void set_threshold(PyObject[] args, String[] kwargs) {
         throw Py.NotImplementedError("not applicable to Java GC");
@@ -2057,7 +2053,7 @@
      * Not supported by Jython.
      * Throws {@link org.python.core.Py#NotImplementedError}.
      *
-     * @throws org.python.core.Py#NotImplementedError
+     * @throws org.python.core.Py.NotImplementedError
      */
     public static PyObject get_threshold() {
         throw Py.NotImplementedError("not applicable to Java GC");
@@ -2067,7 +2063,7 @@
      * Not supported by Jython.
      * Throws {@link org.python.core.Py#NotImplementedError}.
      *
-     * @throws org.python.core.Py#NotImplementedError
+     * @throws org.python.core.Py.NotImplementedError
      */
     public static PyObject get_objects() {
         throw Py.NotImplementedError("not applicable to Java GC");
diff --git a/src/org/python/modules/itertools/PyTeeIteratorDerived.java b/src/org/python/modules/itertools/PyTeeIteratorDerived.java
--- a/src/org/python/modules/itertools/PyTeeIteratorDerived.java
+++ b/src/org/python/modules/itertools/PyTeeIteratorDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/itertools/chainDerived.java b/src/org/python/modules/itertools/chainDerived.java
--- a/src/org/python/modules/itertools/chainDerived.java
+++ b/src/org/python/modules/itertools/chainDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/itertools/combinationsDerived.java b/src/org/python/modules/itertools/combinationsDerived.java
--- a/src/org/python/modules/itertools/combinationsDerived.java
+++ b/src/org/python/modules/itertools/combinationsDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/itertools/combinationsWithReplacementDerived.java b/src/org/python/modules/itertools/combinationsWithReplacementDerived.java
--- a/src/org/python/modules/itertools/combinationsWithReplacementDerived.java
+++ b/src/org/python/modules/itertools/combinationsWithReplacementDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/itertools/compressDerived.java b/src/org/python/modules/itertools/compressDerived.java
--- a/src/org/python/modules/itertools/compressDerived.java
+++ b/src/org/python/modules/itertools/compressDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/itertools/countDerived.java b/src/org/python/modules/itertools/countDerived.java
--- a/src/org/python/modules/itertools/countDerived.java
+++ b/src/org/python/modules/itertools/countDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/itertools/cycleDerived.java b/src/org/python/modules/itertools/cycleDerived.java
--- a/src/org/python/modules/itertools/cycleDerived.java
+++ b/src/org/python/modules/itertools/cycleDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/itertools/dropwhileDerived.java b/src/org/python/modules/itertools/dropwhileDerived.java
--- a/src/org/python/modules/itertools/dropwhileDerived.java
+++ b/src/org/python/modules/itertools/dropwhileDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/itertools/groupbyDerived.java b/src/org/python/modules/itertools/groupbyDerived.java
--- a/src/org/python/modules/itertools/groupbyDerived.java
+++ b/src/org/python/modules/itertools/groupbyDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/itertools/ifilterDerived.java b/src/org/python/modules/itertools/ifilterDerived.java
--- a/src/org/python/modules/itertools/ifilterDerived.java
+++ b/src/org/python/modules/itertools/ifilterDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/itertools/ifilterfalseDerived.java b/src/org/python/modules/itertools/ifilterfalseDerived.java
--- a/src/org/python/modules/itertools/ifilterfalseDerived.java
+++ b/src/org/python/modules/itertools/ifilterfalseDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/itertools/isliceDerived.java b/src/org/python/modules/itertools/isliceDerived.java
--- a/src/org/python/modules/itertools/isliceDerived.java
+++ b/src/org/python/modules/itertools/isliceDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/itertools/izipDerived.java b/src/org/python/modules/itertools/izipDerived.java
--- a/src/org/python/modules/itertools/izipDerived.java
+++ b/src/org/python/modules/itertools/izipDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/itertools/izipLongestDerived.java b/src/org/python/modules/itertools/izipLongestDerived.java
--- a/src/org/python/modules/itertools/izipLongestDerived.java
+++ b/src/org/python/modules/itertools/izipLongestDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/itertools/permutationsDerived.java b/src/org/python/modules/itertools/permutationsDerived.java
--- a/src/org/python/modules/itertools/permutationsDerived.java
+++ b/src/org/python/modules/itertools/permutationsDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/itertools/productDerived.java b/src/org/python/modules/itertools/productDerived.java
--- a/src/org/python/modules/itertools/productDerived.java
+++ b/src/org/python/modules/itertools/productDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/itertools/repeatDerived.java b/src/org/python/modules/itertools/repeatDerived.java
--- a/src/org/python/modules/itertools/repeatDerived.java
+++ b/src/org/python/modules/itertools/repeatDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/itertools/starmapDerived.java b/src/org/python/modules/itertools/starmapDerived.java
--- a/src/org/python/modules/itertools/starmapDerived.java
+++ b/src/org/python/modules/itertools/starmapDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/itertools/takewhileDerived.java b/src/org/python/modules/itertools/takewhileDerived.java
--- a/src/org/python/modules/itertools/takewhileDerived.java
+++ b/src/org/python/modules/itertools/takewhileDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/random/PyRandomDerived.java b/src/org/python/modules/random/PyRandomDerived.java
--- a/src/org/python/modules/random/PyRandomDerived.java
+++ b/src/org/python/modules/random/PyRandomDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/thread/PyLocalDerived.java b/src/org/python/modules/thread/PyLocalDerived.java
--- a/src/org/python/modules/thread/PyLocalDerived.java
+++ b/src/org/python/modules/thread/PyLocalDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/org/python/modules/zipimport/zipimporterDerived.java b/src/org/python/modules/zipimport/zipimporterDerived.java
--- a/src/org/python/modules/zipimport/zipimporterDerived.java
+++ b/src/org/python/modules/zipimport/zipimporterDerived.java
@@ -34,12 +34,15 @@
     public int traverseDerived(Visitproc visit,Object arg) {
         int retVal;
         for(int i=0;i<slots.length;++i) {
-            retVal=visit.visit(slots[i],arg);
-            if (retVal!=0) {
-                return retVal;
+            if (slots[i]!=null) {
+                retVal=visit.visit(slots[i],arg);
+                if (retVal!=0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit,arg);
+        retVal=visit.visit(objtype,arg);
+        return retVal!=0?retVal:traverseDictIfAny(visit,arg);
     }
 
     /* end of TraverseprocDerived implementation */
diff --git a/src/templates/gderived-defs b/src/templates/gderived-defs
--- a/src/templates/gderived-defs
+++ b/src/templates/gderived-defs
@@ -35,12 +35,15 @@
     public int traverseDerived(Visitproc visit, Object arg) {
         int retVal;
         for (int i = 0; i < slots.length; ++i) {
-            retVal = visit.visit(slots[i], arg);
-            if (retVal != 0) {
-                return retVal;
+            if (slots[i] != null) {
+                retVal = visit.visit(slots[i], arg);
+                if (retVal != 0) {
+                    return retVal;
+                }
             }
         }
-        return traverseDictIfAny(visit, arg);
+        retVal = visit.visit(objtype, arg);
+        return retVal != 0 ? retVal : traverseDictIfAny(visit, arg);
     }
     /* end of TraverseprocDerived implementation */
 
diff --git a/tests/java/javatests/GCTestHelper.java b/tests/java/javatests/GCTestHelper.java
--- a/tests/java/javatests/GCTestHelper.java
+++ b/tests/java/javatests/GCTestHelper.java
@@ -4,7 +4,12 @@
 import java.util.*;
 
 public class GCTestHelper {
-    
+
+	/**
+     * NastyFinalizer is a non-PyObject class with a time-consuming
+     * finalizer that does not notify Jython-gc. This would cause
+     * some tests in test_gc_jy.py to fail.
+     */
     public static class NastyFinalizer {
 
         public void finalize() {
@@ -16,6 +21,24 @@
     }
 
     /**
+     * In contrast to Nasty finalizer, this class - still equally
+     * time-consuming - calls {@code gc.notifyPreFinalization()}
+     * and {@code gc.notifyPostFinalization()} and thus lets all
+     * tests work as expected.
+     */
+    public static class NotSoNastyFinalizer {
+
+        public void finalize() {
+            org.python.modules.gc.notifyPreFinalization();
+            try {
+                Thread.sleep(2000);
+            } catch (InterruptedException ie) {
+            }
+            org.python.modules.gc.notifyPostFinalization();
+        }
+    }
+
+    /**
      * PyReflectionTraversed is a test-PyObject that intentionally
      * violates the Traverseproc-mechanism, i.e. holds a non-static
      * reference to another PyObject, but neither implements Traverseproc

-- 
Repository URL: https://hg.python.org/jython


More information about the Jython-checkins mailing list