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
........
This commit is contained in:
Benjamin Peterson 2009-12-13 01:23:39 +00:00
parent ddf4b81ee7
commit 97dd987ae2
4 changed files with 30 additions and 10 deletions

View File

@ -973,7 +973,7 @@ are always available. They are listed here in alphabetical order.
.. function:: set([iterable]) .. function:: set([iterable])
:noindex: :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`. The set type is described in :ref:`types-set`.

View File

@ -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. * A version of the :mod:`io` library, rewritten in C for performance.
* The ordered-dictionary type described in :ref:`pep-0372`. * 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. * The :class:`memoryview` object.
* A small subset of the :mod:`importlib` module `described below <#importlib-section>`__. * 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`.) more sensible for numeric types. (Changed by Mark Dickinson; :issue:`6857`.)
* Distutils is being more actively developed, thanks to Tarek Ziade * 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 :file:`setup.py` subcommand, ``check``, will
check that the arguments being passed to the :func:`setup` function check that the arguments being passed to the :func:`setup` function
are complete and correct (:issue:`5732`). 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; an invalid file descriptor. (Implemented by Benjamin Peterson;
:issue:`4991`.) :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 iterators. Elements of *data* are returned if the corresponding
value in *selectors* is true:: value in *selectors* is true::
itertools.compress('ABCDEF', [1,0,1,0,1,1]) => itertools.compress('ABCDEF', [1,0,1,0,1,1]) =>
A, C, E, F 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 returns all the possible *r*-length combinations of elements from the
iterable *iter*. Unlike :func:`combinations`, individual elements iterable *iter*. Unlike :func:`combinations`, individual elements
can be repeated in the generated combinations:: can be repeated in the generated combinations::
@ -1080,5 +1080,5 @@ Acknowledgements
The author would like to thank the following people for offering The author would like to thank the following people for offering
suggestions, corrections and assistance with various drafts of this suggestions, corrections and assistance with various drafts of this
article: no one yet. article: Ryan Lovett, Hugh Secker-Walker.

View File

@ -366,6 +366,7 @@ class Obj2ModVisitor(PickleVisitor):
self.emit("obj2ast_%s(PyObject* obj, %s* out, PyArena* arena)" % (name, ctype), 0) self.emit("obj2ast_%s(PyObject* obj, %s* out, PyArena* arena)" % (name, ctype), 0)
self.emit("{", 0) self.emit("{", 0)
self.emit("PyObject* tmp = NULL;", 1) self.emit("PyObject* tmp = NULL;", 1)
self.emit("int isinstance;", 1)
self.emit("", 0) self.emit("", 0)
def sumTrailer(self, name): def sumTrailer(self, name):
@ -385,7 +386,13 @@ class Obj2ModVisitor(PickleVisitor):
def simpleSum(self, sum, name): def simpleSum(self, sum, name):
self.funcHeader(name) self.funcHeader(name)
for t in sum.types: 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("*out = %s;" % t.name, 2)
self.emit("return 0;", 2) self.emit("return 0;", 2)
self.emit("}", 1) self.emit("}", 1)
@ -407,7 +414,12 @@ class Obj2ModVisitor(PickleVisitor):
for a in sum.attributes: for a in sum.attributes:
self.visitField(a, name, sum=sum, depth=1) self.visitField(a, name, sum=sum, depth=1)
for t in sum.types: 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: for f in t.fields:
self.visitFieldDeclaration(f, t.name, sum=sum, depth=2) self.visitFieldDeclaration(f, t.name, sum=sum, depth=2)
self.emit("", 0) 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 *req_type[] = {(PyObject*)Module_type, (PyObject*)Expression_type,
(PyObject*)Interactive_type}; (PyObject*)Interactive_type};
char *req_name[] = {"Module", "Expression", "Interactive"}; char *req_name[] = {"Module", "Expression", "Interactive"};
int isinstance;
assert(0 <= mode && mode <= 2); assert(0 <= mode && mode <= 2);
init_types(); 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", PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
req_name[mode], Py_TYPE(ast)->tp_name); req_name[mode], Py_TYPE(ast)->tp_name);
return NULL; return NULL;

View File

@ -529,6 +529,7 @@ builtin_compile(PyObject *self, PyObject *args, PyObject *kwds)
int mode = -1; int mode = -1;
int dont_inherit = 0; int dont_inherit = 0;
int supplied_flags = 0; int supplied_flags = 0;
int is_ast;
PyCompilerFlags cf; PyCompilerFlags cf;
PyObject *cmd; PyObject *cmd;
static char *kwlist[] = {"source", "filename", "mode", "flags", static char *kwlist[] = {"source", "filename", "mode", "flags",
@ -567,7 +568,10 @@ builtin_compile(PyObject *self, PyObject *args, PyObject *kwds)
return NULL; return NULL;
} }
if (PyAST_Check(cmd)) { is_ast = PyAST_Check(cmd);
if (is_ast == -1)
return NULL;
if (is_ast) {
PyObject *result; PyObject *result;
if (supplied_flags & PyCF_ONLY_AST) { if (supplied_flags & PyCF_ONLY_AST) {
Py_INCREF(cmd); Py_INCREF(cmd);