mirror of https://github.com/python/cpython
Merged revisions 72495 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r72495 | benjamin.peterson | 2009-05-08 21:07:04 -0500 (Fri, 08 May 2009) | 1 line lookup __reversed__ correctly as a special method ........
This commit is contained in:
parent
be720e0369
commit
053c61f67c
|
@ -1549,12 +1549,15 @@ order (MRO) for bases """
|
||||||
return self
|
return self
|
||||||
def hello(self):
|
def hello(self):
|
||||||
return b"hello"
|
return b"hello"
|
||||||
|
def empty_seq(self):
|
||||||
|
return []
|
||||||
|
|
||||||
# It would be nice to have every special method tested here, but I'm
|
# It would be nice to have every special method tested here, but I'm
|
||||||
# only listing the ones I can remember outside of typeobject.c, since it
|
# only listing the ones I can remember outside of typeobject.c, since it
|
||||||
# does it right.
|
# does it right.
|
||||||
specials = [
|
specials = [
|
||||||
("__bytes__", bytes, hello),
|
("__bytes__", bytes, hello),
|
||||||
|
("__reversed__", reversed, empty_seq),
|
||||||
# These two fail because the compiler generates LOAD_ATTR to look
|
# These two fail because the compiler generates LOAD_ATTR to look
|
||||||
# them up. We'd have to add a new opcode to fix this, and it's
|
# them up. We'd have to add a new opcode to fix this, and it's
|
||||||
# probably not worth it.
|
# probably not worth it.
|
||||||
|
|
|
@ -222,7 +222,8 @@ static PyObject *
|
||||||
reversed_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
reversed_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||||
{
|
{
|
||||||
Py_ssize_t n;
|
Py_ssize_t n;
|
||||||
PyObject *seq;
|
PyObject *seq, *reversed_meth;
|
||||||
|
static PyObject *reversed_cache = NULL;
|
||||||
reversedobject *ro;
|
reversedobject *ro;
|
||||||
|
|
||||||
if (type == &PyReversed_Type && !_PyArg_NoKeywords("reversed()", kwds))
|
if (type == &PyReversed_Type && !_PyArg_NoKeywords("reversed()", kwds))
|
||||||
|
@ -231,8 +232,12 @@ reversed_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||||
if (!PyArg_UnpackTuple(args, "reversed", 1, 1, &seq) )
|
if (!PyArg_UnpackTuple(args, "reversed", 1, 1, &seq) )
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (PyObject_HasAttrString(seq, "__reversed__"))
|
reversed_meth = _PyObject_LookupSpecial(seq, "__reversed__", &reversed_cache);
|
||||||
return PyObject_CallMethod(seq, "__reversed__", NULL);
|
if (reversed_meth != NULL) {
|
||||||
|
PyObject *res = PyObject_CallFunctionObjArgs(reversed_meth, NULL);
|
||||||
|
Py_DECREF(reversed_meth);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
if (!PySequence_Check(seq)) {
|
if (!PySequence_Check(seq)) {
|
||||||
PyErr_SetString(PyExc_TypeError,
|
PyErr_SetString(PyExc_TypeError,
|
||||||
|
|
Loading…
Reference in New Issue