Checking in the code for PEP 357.

This was mostly written by Travis Oliphant.
I've inspected it all; Neal Norwitz and MvL have also looked at it
(in an earlier incarnation).
This commit is contained in:
Guido van Rossum 2006-03-07 18:50:55 +00:00
parent 9d7855076a
commit 38fff8c4e4
19 changed files with 269 additions and 150 deletions

View file

@ -1733,6 +1733,43 @@ instance_nonzero(PyInstanceObject *self)
return outcome > 0;
}
static Py_ssize_t
instance_index(PyInstanceObject *self)
{
PyObject *func, *res;
Py_ssize_t outcome;
static PyObject *indexstr = NULL;
if (indexstr == NULL) {
indexstr = PyString_InternFromString("__index__");
if (indexstr == NULL)
return -1;
}
if ((func = instance_getattr(self, indexstr)) == NULL) {
if (!PyErr_ExceptionMatches(PyExc_AttributeError))
return -1;
PyErr_Clear();
PyErr_SetString(PyExc_TypeError,
"object cannot be interpreted as an index");
return -1;
}
res = PyEval_CallObject(func, (PyObject *)NULL);
Py_DECREF(func);
if (res == NULL)
return -1;
if (PyInt_Check(res) || PyLong_Check(res)) {
outcome = res->ob_type->tp_as_number->nb_index(res);
}
else {
PyErr_SetString(PyExc_TypeError,
"__index__ must return an int or a long");
outcome = -1;
}
Py_DECREF(res);
return outcome;
}
UNARY(instance_invert, "__invert__")
UNARY(instance_int, "__int__")
UNARY(instance_long, "__long__")
@ -2052,6 +2089,7 @@ static PyNumberMethods instance_as_number = {
(binaryfunc)instance_truediv, /* nb_true_divide */
(binaryfunc)instance_ifloordiv, /* nb_inplace_floor_divide */
(binaryfunc)instance_itruediv, /* nb_inplace_true_divide */
(lenfunc)instance_index, /* nb_index */
};
PyTypeObject PyInstance_Type = {