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:
parent
ddf4b81ee7
commit
97dd987ae2
|
@ -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`.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue