[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)