From 97dd987ae2ed1b0e10697dd6b5ac31bab6d7bcba Mon Sep 17 00:00:00 2001
From: Benjamin Peterson <benjamin@python.org>
Date: Sun, 13 Dec 2009 01:23:39 +0000
Subject: [PATCH] Merged revisions 76534,76538,76628,76701,76774 via svnmerge
 from svn+ssh://pythondev@svn.python.org/python/trunk

........
  r76534 | martin.v.loewis | 2009-11-26 02:42:05 -0600 (Thu, 26 Nov 2009) | 2 lines

  Fix typo.
........
  r76538 | georg.brandl | 2009-11-26 14:48:25 -0600 (Thu, 26 Nov 2009) | 1 line

  #7400: typo.
........
  r76628 | andrew.kuchling | 2009-12-02 08:27:11 -0600 (Wed, 02 Dec 2009) | 1 line

  Markup fixes
........
  r76701 | andrew.kuchling | 2009-12-07 20:37:05 -0600 (Mon, 07 Dec 2009) | 1 line

  Typo fix; grammar fix
........
  r76774 | benjamin.peterson | 2009-12-12 18:54:15 -0600 (Sat, 12 Dec 2009) | 1 line

  account for PyObject_IsInstance's new ability to fail
........
---
 Doc/library/functions.rst |  2 +-
 Doc/whatsnew/2.7.rst      | 10 +++++-----
 Parser/asdl_c.py          | 22 +++++++++++++++++++---
 Python/bltinmodule.c      |  6 +++++-
 4 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst
index 6e380ddc920..6b14dffca26 100644
--- a/Doc/library/functions.rst
+++ b/Doc/library/functions.rst
@@ -973,7 +973,7 @@ are always available.  They are listed here in alphabetical order.
 .. function:: set([iterable])
    :noindex:
 
-   Return a new set, optionally with elements are taken from *iterable*.
+   Return a new set, optionally with elements taken from *iterable*.
    The set type is described in :ref:`types-set`.
 
 
diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst
index 82012fbdb38..768ea3308ca 100644
--- a/Doc/whatsnew/2.7.rst
+++ b/Doc/whatsnew/2.7.rst
@@ -70,7 +70,7 @@ A partial list of 3.1 features that were backported to 2.7:
 
 * A version of the :mod:`io` library, rewritten in C for performance.
 * The ordered-dictionary type described in :ref:`pep-0372`.
-* The new format specified described in :ref:`pep-0378`.
+* The new format specifier described in :ref:`pep-0378`.
 * The :class:`memoryview` object.
 * A small subset of the :mod:`importlib` module `described below <#importlib-section>`__.
 
@@ -515,7 +515,7 @@ changes, or look through the Subversion logs for all the details.
   more sensible for numeric types.  (Changed by Mark Dickinson; :issue:`6857`.)
 
 * Distutils is being more actively developed, thanks to Tarek Ziade
-  has taken over maintenance of the package.  A new
+  who has taken over maintenance of the package.  A new
   :file:`setup.py` subcommand, ``check``, will
   check that the arguments being passed to the :func:`setup` function
   are complete and correct (:issue:`5732`).
@@ -587,14 +587,14 @@ changes, or look through the Subversion logs for all the details.
   an invalid file descriptor.  (Implemented by Benjamin Peterson;
   :issue:`4991`.)
 
-* New function: ``itertools.compress(*data*, *selectors*)`` takes two
+* New function: ``itertools.compress(data, selectors)`` takes two
   iterators.  Elements of *data* are returned if the corresponding
   value in *selectors* is true::
 
     itertools.compress('ABCDEF', [1,0,1,0,1,1]) =>
       A, C, E, F
 
-  New function: ``itertools.combinations_with_replacement(*iter*, *r*)``
+  New function: ``itertools.combinations_with_replacement(iter, r)``
   returns all the possible *r*-length combinations of elements from the
   iterable *iter*.  Unlike :func:`combinations`, individual elements
   can be repeated in the generated combinations::
@@ -1080,5 +1080,5 @@ Acknowledgements
 
 The author would like to thank the following people for offering
 suggestions, corrections and assistance with various drafts of this
-article: no one yet.
+article: Ryan Lovett, Hugh Secker-Walker.
 
diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py
index 8ccb3ea0458..c1e07d2200d 100755
--- a/Parser/asdl_c.py
+++ b/Parser/asdl_c.py
@@ -366,6 +366,7 @@ class Obj2ModVisitor(PickleVisitor):
         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):
@@ -385,7 +386,13 @@ class Obj2ModVisitor(PickleVisitor):
     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)
@@ -407,7 +414,12 @@ class Obj2ModVisitor(PickleVisitor):
         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)
@@ -1077,11 +1089,15 @@ mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
     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;
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 297c795ca37..5710c0724c0 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -529,6 +529,7 @@ builtin_compile(PyObject *self, PyObject *args, PyObject *kwds)
 	int mode = -1;
 	int dont_inherit = 0;
 	int supplied_flags = 0;
+	int is_ast;
 	PyCompilerFlags cf;
 	PyObject *cmd;
 	static char *kwlist[] = {"source", "filename", "mode", "flags",
@@ -567,7 +568,10 @@ builtin_compile(PyObject *self, PyObject *args, PyObject *kwds)
 		return NULL;
 	}
 
-	if (PyAST_Check(cmd)) {
+	is_ast = PyAST_Check(cmd);
+	if (is_ast == -1)
+		return NULL;
+	if (is_ast) {
 		PyObject *result;
 		if (supplied_flags & PyCF_ONLY_AST) {
 			Py_INCREF(cmd);
-- 
2.30.9