Synchronize with PyXML 1.10
Break cycle involving expat parser in close().
Add lex handler support to SAX2 pyexpat
diff --git a/Lib/xml/sax/expatreader.py b/Lib/xml/sax/expatreader.py
index d84931e..96687f3 100644
--- a/Lib/xml/sax/expatreader.py
+++ b/Lib/xml/sax/expatreader.py
@@ -27,6 +27,7 @@
         self._source = xmlreader.InputSource()
         self._parser = None
         self._namespaces = namespaceHandling
+        self._lex_handler_prop = None
         self._parsing = 0
         self._entity_stack = []
 
@@ -60,10 +61,15 @@
                                             name)
 
     def getProperty(self, name):
+        if name == handler.property_lexical_handler:
+            return self._lex_handler_prop
         raise SAXNotRecognizedException("Property '%s' not recognized" % name)
 
     def setProperty(self, name, value):
-        raise SAXNotRecognizedException("Property '%s' not recognized" % name)
+        if name == handler.property_lexical_handler:
+            self._lex_handler_prop = value
+        else:
+            raise SAXNotRecognizedException("Property '%s' not recognized" % name)
 
     # IncrementalParser methods
 
@@ -82,6 +88,7 @@
         except expat.error:
             error_code = self._parser.ErrorCode
             exc = SAXParseException(expat.ErrorString(error_code), None, self)
+            # FIXME: when to invoke error()?
             self._err_handler.fatalError(exc)
 
     def close(self):
@@ -91,6 +98,8 @@
         self.feed("", isFinal = 1)
         self._cont_handler.endDocument()
         self._parsing = 0
+        # break cycle created by expat handlers pointing to our methods
+        self._parser = None
 
     def reset(self):
         if self._namespaces:
@@ -109,12 +118,15 @@
         self._parser.NotationDeclHandler = self.notation_decl
         self._parser.StartNamespaceDeclHandler = self.start_namespace_decl
         self._parser.EndNamespaceDeclHandler = self.end_namespace_decl
-#         self._parser.CommentHandler =
-#         self._parser.StartCdataSectionHandler =
-#         self._parser.EndCdataSectionHandler =
-#         self._parser.DefaultHandler =
-#         self._parser.DefaultHandlerExpand =
-#         self._parser.NotStandaloneHandler =
+        
+        self._decl_handler_prop = None
+        if self._lex_handler_prop:
+            self._parser.CommentHandler = self._lex_handler_prop.comment
+            self._parser.StartCdataSectionHandler = self._lex_handler_prop.startCDATA
+            self._parser.EndCdataSectionHandler = self._lex_handler_prop.endCDATA
+#         self._parser.DefaultHandler = 
+#         self._parser.DefaultHandlerExpand = 
+#         self._parser.NotStandaloneHandler = 
         self._parser.ExternalEntityRefHandler = self.external_entity_ref
 
         self._parsing = 0
@@ -123,9 +135,13 @@
     # Locator methods
 
     def getColumnNumber(self):
+        if self._parser is None:
+            return None
         return self._parser.ErrorColumnNumber
 
     def getLineNumber(self):
+        if self._parser is None:
+            return 1
         return self._parser.ErrorLineNumber
 
     def getPublicId(self):
@@ -165,6 +181,8 @@
         pair = string.split(name)
         if len(pair) == 1:
             pair = (None, name)
+        else:
+            pair = tuple(pair)
 
         self._cont_handler.endElementNS(pair, None)