modified the generator to allow keeping class references when creating new

* python/generator.py: modified the generator to allow keeping
  class references when creating new classes, needed to fix a bug
  pointed by Stéphane Bidoul where the input buffer of the
  xmlTextReader instance gets destroyed if the python wrapper for
  the input is not referenced anymore.
Daniel
diff --git a/python/generator.py b/python/generator.py
index b99978f..2d1de5a 100755
--- a/python/generator.py
+++ b/python/generator.py
@@ -634,6 +634,10 @@
     "xmlHasNsProp": 1,
 }
 
+reference_keepers = {
+    "xmlTextReader": [('inputBuffer', 'input')],
+}
+
 function_classes = {}
 
 function_classes["None"] = []
@@ -931,6 +935,10 @@
 		classes.write("class %s(%s):\n" % (classname,
 			      classes_ancestor[classname]))
 		classes.write("    def __init__(self, _obj=None):\n")
+		if reference_keepers.has_key(classname):
+		    rlist = reference_keepers[classname]
+		    for ref in rlist:
+		        classes.write("        self.%s = None\n" % ref[1])
 		classes.write("        self._o = None\n")
 		classes.write("        %s.__init__(self, _obj=_obj)\n\n" % (
 			      classes_ancestor[classname]))
@@ -944,6 +952,10 @@
 		txt.write("Class %s()\n" % (classname))
 		classes.write("class %s:\n" % (classname))
 		classes.write("    def __init__(self, _obj=None):\n")
+		if reference_keepers.has_key(classname):
+		    list = reference_keepers[classname]
+		    for ref in list:
+		        classes.write("        self.%s = None\n" % ref[1])
 		classes.write("        if _obj != None:self._o = _obj;return\n")
 		classes.write("        self._o = None\n\n");
 	    if classes_destructors.has_key(classname):
@@ -1029,9 +1041,30 @@
 			    classes.write(
 		    "        if ret is None:raise treeError('%s() failed')\n"
 					  % (name))
-			classes.write("        return ");
+
+			#
+			# generate the returned class wrapper for the object
+			#
+			classes.write("        __tmp = ");
 			classes.write(classes_type[ret[0]][1] % ("ret"));
 			classes.write("\n");
+
+                        #
+			# Sometime one need to keep references of the source
+			# class in the returned class object.
+			# See reference_keepers for the list
+			#
+			tclass = classes_type[ret[0]][2]
+			if reference_keepers.has_key(tclass):
+			    list = reference_keepers[tclass]
+			    for pref in list:
+				if pref[0] == ref[0]:
+				    classes.write("        __tmp.%s = self\n" %
+						  pref[1])
+			#
+			# return the class
+			#
+			classes.write("        return __tmp\n");
 		    elif converter_type.has_key(ret[0]):
 			#
 			# Raise an exception