diff Modules/_elementtree.c @ 73291:23ffaf975267 3.2

Closes #2892: preserve iterparse events in case of SyntaxError.
author Florent Xicluna <florent.xicluna@gmail.com>
date Tue, 01 Nov 2011 23:31:09 +0100
parents 50d170bb71c7
children d896fd0a8ba7 ca1e2cf2947b
line wrap: on
line diff
--- a/Modules/_elementtree.c	Tue Nov 01 18:57:15 2011 +0200
+++ b/Modules/_elementtree.c	Tue Nov 01 23:31:09 2011 +0100
@@ -3000,6 +3000,7 @@
         "  self._file = file\n"
         "  self._events = []\n"
         "  self._index = 0\n"
+        "  self._error = None\n"
         "  self.root = self._root = None\n"
         "  b = cElementTree.TreeBuilder()\n"
         "  self._parser = cElementTree.XMLParser(b)\n"
@@ -3008,24 +3009,31 @@
         "  while 1:\n"
         "    try:\n"
         "      item = self._events[self._index]\n"
+        "      self._index += 1\n"
+        "      return item\n"
         "    except IndexError:\n"
-        "      if self._parser is None:\n"
-        "        self.root = self._root\n"
-        "        if self._close_file:\n"
-        "          self._file.close()\n"
-        "        raise StopIteration\n"
-        "      # load event buffer\n"
-        "      del self._events[:]\n"
-        "      self._index = 0\n"
-        "      data = self._file.read(16384)\n"
-        "      if data:\n"
+        "      pass\n"
+        "    if self._error:\n"
+        "      e = self._error\n"
+        "      self._error = None\n"
+        "      raise e\n"
+        "    if self._parser is None:\n"
+        "      self.root = self._root\n"
+        "      if self._close_file:\n"
+        "        self._file.close()\n"
+        "      raise StopIteration\n"
+        "    # load event buffer\n"
+        "    del self._events[:]\n"
+        "    self._index = 0\n"
+        "    data = self._file.read(16384)\n"
+        "    if data:\n"
+        "      try:\n"
         "        self._parser.feed(data)\n"
-        "      else:\n"
-        "        self._root = self._parser.close()\n"
-        "        self._parser = None\n"
+        "      except SyntaxError as exc:\n"
+        "        self._error = exc\n"
         "    else:\n"
-        "      self._index = self._index + 1\n"
-        "      return item\n"
+        "      self._root = self._parser.close()\n"
+        "      self._parser = None\n"
         " def __iter__(self):\n"
         "  return self\n"
         "cElementTree.iterparse = iterparse\n"