account for PyObject_IsInstance's new ability to fail
diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py
index 40b8499..1508e83 100755
--- a/Parser/asdl_c.py
+++ b/Parser/asdl_c.py
@@ -367,6 +367,7 @@
         self.emit("obj2ast_%s(PyObject* obj, %s* out, PyArena* arena)" % (name, ctype), 0)
         self.emit("{", 0)
         self.emit("PyObject* tmp = NULL;", 1)
+        self.emit("int isinstance;", 1)
         self.emit("", 0)
 
     def sumTrailer(self, name):
@@ -386,7 +387,13 @@
     def simpleSum(self, sum, name):
         self.funcHeader(name)
         for t in sum.types:
-            self.emit("if (PyObject_IsInstance(obj, (PyObject*)%s_type)) {" % t.name, 1)
+            line = ("isinstance = PyObject_IsInstance(obj, "
+                    "(PyObject *)%s_type);")
+            self.emit(line % (t.name,), 1)
+            self.emit("if (isinstance == -1) {", 1)
+            self.emit("return 1;", 2)
+            self.emit("}", 1)
+            self.emit("if (isinstance) {", 1)
             self.emit("*out = %s;" % t.name, 2)
             self.emit("return 0;", 2)
             self.emit("}", 1)
@@ -408,7 +415,12 @@
         for a in sum.attributes:
             self.visitField(a, name, sum=sum, depth=1)
         for t in sum.types:
-            self.emit("if (PyObject_IsInstance(obj, (PyObject*)%s_type)) {" % t.name, 1)
+            line = "isinstance = PyObject_IsInstance(obj, (PyObject*)%s_type);"
+            self.emit(line % (t.name,), 1)
+            self.emit("if (isinstance == -1) {", 1)
+            self.emit("return 1;", 2)
+            self.emit("}", 1)
+            self.emit("if (isinstance) {", 1)
             for f in t.fields:
                 self.visitFieldDeclaration(f, t.name, sum=sum, depth=2)
             self.emit("", 0)
@@ -1093,11 +1105,15 @@
     PyObject *req_type[] = {(PyObject*)Module_type, (PyObject*)Expression_type,
                             (PyObject*)Interactive_type};
     char *req_name[] = {"Module", "Expression", "Interactive"};
+    int isinstance;
     assert(0 <= mode && mode <= 2);
 
     init_types();
 
-    if (!PyObject_IsInstance(ast, req_type[mode])) {
+    isinstance = PyObject_IsInstance(ast, req_type[mode]);
+    if (isinstance == -1)
+        return NULL;
+    if (!isinstance) {
         PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
                      req_name[mode], Py_TYPE(ast)->tp_name);
         return NULL;