diff options
-rw-r--r-- | Doc/library/functions.rst | 2 | ||||
-rw-r--r-- | Doc/whatsnew/2.7.rst | 10 | ||||
-rwxr-xr-x | Parser/asdl_c.py | 22 | ||||
-rw-r--r-- | Python/bltinmodule.c | 6 |
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); |