changeset: 90004:ee0034434e65 parent: 90000:35302cc4fc93 parent: 90003:9e3fc66ee0b8 user: Ned Deily date: Thu Mar 27 16:44:06 2014 -0700 files: Lib/inspect.py Lib/test/test_inspect.py Misc/NEWS description: Issue #6676: merge from 3.4 diff -r 35302cc4fc93 -r ee0034434e65 Doc/library/pyexpat.rst --- a/Doc/library/pyexpat.rst Thu Mar 27 18:42:52 2014 -0400 +++ b/Doc/library/pyexpat.rst Thu Mar 27 16:44:06 2014 -0700 @@ -100,6 +100,11 @@ http://www.python.org/ns/ elem1 elem2 + Due to limitations in the ``Expat`` library used by :mod:`pyexpat`, + the :class:`xmlparser` instance returned can only be used to parse a single + XML document. Call ``ParserCreate`` for each document to provide unique + parser instances. + .. seealso:: @@ -119,7 +124,9 @@ Parses the contents of the string *data*, calling the appropriate handler functions to process the parsed data. *isfinal* must be true on the final call - to this method. *data* can be the empty string at any time. + to this method; it allows the parsing of a single file in fragments, + not the submission of multiple files. + *data* can be the empty string at any time. .. method:: xmlparser.ParseFile(file) diff -r 35302cc4fc93 -r ee0034434e65 Lib/test/test_pyexpat.py --- a/Lib/test/test_pyexpat.py Thu Mar 27 18:42:52 2014 -0400 +++ b/Lib/test/test_pyexpat.py Thu Mar 27 16:44:06 2014 -0700 @@ -236,6 +236,18 @@ operations = out.out self._verify_parse_output(operations) + def test_parse_again(self): + parser = expat.ParserCreate() + file = BytesIO(data) + parser.ParseFile(file) + # Issue 6676: ensure a meaningful exception is raised when attempting + # to parse more than one XML document per xmlparser instance, + # a limitation of the Expat library. + with self.assertRaises(expat.error) as cm: + parser.ParseFile(file) + self.assertEqual(expat.ErrorString(cm.exception.code), + expat.errors.XML_ERROR_FINISHED) + class NamespaceSeparatorTest(unittest.TestCase): def test_legal(self): # Tests that make sure we get errors when the namespace_separator value diff -r 35302cc4fc93 -r ee0034434e65 Misc/NEWS --- a/Misc/NEWS Thu Mar 27 18:42:52 2014 -0400 +++ b/Misc/NEWS Thu Mar 27 16:44:06 2014 -0700 @@ -119,6 +119,11 @@ - Issue #20817: Fix inspect.getcallargs() to fail correctly if more than 3 arguments are missing. Patch by Jeremiah Lowin. +- Issue #6676: Ensure a meaningful exception is raised when attempting + to parse more than one XML document per pyexpat xmlparser instance. + (Original patches by Hirokazu Yamamoto and Amaury Forgeot d'Arc, with + suggested wording by David Gutteridge) + Documentation ------------- diff -r 35302cc4fc93 -r ee0034434e65 Modules/pyexpat.c --- a/Modules/pyexpat.c Thu Mar 27 18:42:52 2014 -0400 +++ b/Modules/pyexpat.c Thu Mar 27 16:44:06 2014 -0700 @@ -908,7 +908,7 @@ void *buf = XML_GetBuffer(self->itself, BUF_SIZE); if (buf == NULL) { Py_XDECREF(readmethod); - return PyErr_NoMemory(); + return get_parse_result(self, 0); } bytes_read = readinst(buf, BUF_SIZE, readmethod);