]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #24125: Saved error's line and column numbers when an error is occured
authorSerhiy Storchaka <storchaka@gmail.com>
Wed, 6 May 2015 06:35:52 +0000 (09:35 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Wed, 6 May 2015 06:35:52 +0000 (09:35 +0300)
during closing expatreader.  Fixed a regression introduced in issue #23865.

Lib/test/test_sax.py
Lib/xml/sax/expatreader.py

index 5019722ed10fab9c7075ddaad5262417d7070de5..a4228dc654ddca92a8b6aa274f2b3517808d1124 100644 (file)
@@ -933,6 +933,8 @@ class ErrorReportingTest(unittest.TestCase):
         parser = create_parser()
         parser.setContentHandler(ContentHandler()) # do nothing
         self.assertRaises(SAXParseException, parser.parse, StringIO("<foo>"))
+        self.assertEqual(parser.getColumnNumber(), 5)
+        self.assertEqual(parser.getLineNumber(), 1)
 
     def test_sax_parse_exception_str(self):
         # pass various values from a locator to the SAXParseException to
index cd243e62051e76713fed54421606c728367ecf94..21c9db91e9d46579c2733c59de413d912c7bb358 100644 (file)
@@ -43,6 +43,9 @@ else:
     _mkproxy = weakref.proxy
     del weakref, _weakref
 
+class _ClosedParser:
+    pass
+
 # --- ExpatLocator
 
 class ExpatLocator(xmlreader.Locator):
@@ -214,16 +217,24 @@ class ExpatParser(xmlreader.IncrementalParser, xmlreader.Locator):
             self._err_handler.fatalError(exc)
 
     def close(self):
-        if self._entity_stack or self._parser is None:
+        if (self._entity_stack or self._parser is None or
+            isinstance(self._parser, _ClosedParser)):
             # If we are completing an external entity, do nothing here
             return
         try:
             self.feed("", isFinal = 1)
             self._cont_handler.endDocument()
-        finally:
             self._parsing = 0
             # break cycle created by expat handlers pointing to our methods
             self._parser = None
+        finally:
+            self._parsing = 0
+            if self._parser is not None:
+                # Keep ErrorColumnNumber and ErrorLineNumber after closing.
+                parser = _ClosedParser()
+                parser.ErrorColumnNumber = self._parser.ErrorColumnNumber
+                parser.ErrorLineNumber = self._parser.ErrorLineNumber
+                self._parser = parser
 
     def _reset_cont_handler(self):
         self._parser.ProcessingInstructionHandler = \