mirror of
https://github.com/python/cpython.git
synced 2025-10-09 08:31:26 +00:00
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:
parent
9d7855076a
commit
38fff8c4e4
19 changed files with 269 additions and 150 deletions
|
@ -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 = {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue