summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/library/functions.rst2
-rw-r--r--Doc/whatsnew/2.7.rst10
-rwxr-xr-xParser/asdl_c.py22
-rw-r--r--Python/bltinmodule.c6
4 files changed, 30 insertions, 10 deletions
diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst
index 6e380dd..6b14dff 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 82012fb..768ea33 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 8ccb3ea..c1e07d2 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 297c795..5710c07 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);