[Python-checkins] CVS: python/dist/src/Lib/xml/sax expatreader.py,1.22,1.22.4.1

Fred L. Drake fdrake@users.sourceforge.net
Thu, 04 Apr 2002 09:59:28 -0800


Update of /cvsroot/python/python/dist/src/Lib/xml/sax
In directory usw-pr-cvs1:/tmp/cvs-serv10503/Lib/xml/sax

Modified Files:
      Tag: release21-maint
	expatreader.py 
Log Message:
Avoid creating circular references between the ExpatParser and the
ContentHandler.  While GC will eventually clean up, it can take longer than
normal for applications that create a lot of strings (or other immutables)
rather without creating many containers.
This closes SF bug #535474.


Index: expatreader.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/xml/sax/expatreader.py,v
retrieving revision 1.22
retrieving revision 1.22.4.1
diff -C2 -d -r1.22 -r1.22.4.1
*** expatreader.py	27 Jan 2001 09:01:20 -0000	1.22
--- expatreader.py	4 Apr 2002 17:59:25 -0000	1.22.4.1
***************
*** 17,20 ****
--- 17,57 ----
  
  import string
+ import weakref
+ 
+ # --- ExpatLocator
+ 
+ class ExpatLocator(xmlreader.Locator):
+     """Locator for use with the ExpatParser class.
+ 
+     This uses a weak reference to the parser object to avoid creating
+     a circular reference between the parser and the content handler.
+     """
+     def __init__(self, parser):
+         self._ref = weakref.ref(parser)
+ 
+     def getColumnNumber(self):
+         parser = self._ref()
+         if parser is None or parser._parser is None:
+             return None
+         return parser._parser.ErrorColumnNumber
+ 
+     def getLineNumber(self):
+         parser = self._ref()
+         if parser is None or parser._parser is None:
+             return 1
+         return self._parser.ErrorLineNumber
+ 
+     def getPublicId(self):
+         parser = self._ref()
+         if parser is None:
+             return None
+         return parser._source.getPublicId()
+ 
+     def getSystemId(self):
+         parser = self._ref()
+         if parser is None:
+             return None
+         return parser._source.getSystemId()
+ 
  
  # --- ExpatParser
***************
*** 40,44 ****
          self._source = source
          self.reset()
!         self._cont_handler.setDocumentLocator(self)
          xmlreader.IncrementalParser.parse(self, source)
  
--- 77,81 ----
          self._source = source
          self.reset()
!         self._cont_handler.setDocumentLocator(ExpatLocator(self))
          xmlreader.IncrementalParser.parse(self, source)