Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit ab91478

Browse files
Issue #24125: Saved error's line and column numbers when an error is occured
during closing expatreader. Fixed a regression introduced in issue #23865.
1 parent e8042e5 commit ab91478

2 files changed

Lines changed: 15 additions & 2 deletions

File tree

Lib/test/test_sax.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1126,6 +1126,8 @@ def test_expat_incomplete(self):
11261126
parser = create_parser()
11271127
parser.setContentHandler(ContentHandler()) # do nothing
11281128
self.assertRaises(SAXParseException, parser.parse, StringIO("<foo>"))
1129+
self.assertEqual(parser.getColumnNumber(), 5)
1130+
self.assertEqual(parser.getLineNumber(), 1)
11291131

11301132
def test_sax_parse_exception_str(self):
11311133
# pass various values from a locator to the SAXParseException to

Lib/xml/sax/expatreader.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ def _mkproxy(o):
4343
_mkproxy = weakref.proxy
4444
del weakref, _weakref
4545

46+
class _ClosedParser:
47+
pass
48+
4649
# --- ExpatLocator
4750

4851
class ExpatLocator(xmlreader.Locator):
@@ -211,16 +214,24 @@ def feed(self, data, isFinal = 0):
211214
self._err_handler.fatalError(exc)
212215

213216
def close(self):
214-
if self._entity_stack or self._parser is None:
217+
if (self._entity_stack or self._parser is None or
218+
isinstance(self._parser, _ClosedParser)):
215219
# If we are completing an external entity, do nothing here
216220
return
217221
try:
218222
self.feed("", isFinal = 1)
219223
self._cont_handler.endDocument()
220-
finally:
221224
self._parsing = 0
222225
# break cycle created by expat handlers pointing to our methods
223226
self._parser = None
227+
finally:
228+
self._parsing = 0
229+
if self._parser is not None:
230+
# Keep ErrorColumnNumber and ErrorLineNumber after closing.
231+
parser = _ClosedParser()
232+
parser.ErrorColumnNumber = self._parser.ErrorColumnNumber
233+
parser.ErrorLineNumber = self._parser.ErrorLineNumber
234+
self._parser = parser
224235
bs = self._source.getByteStream()
225236
if bs is not None:
226237
bs.close()

0 commit comments

Comments
 (0)