diff options
author | Martin v. Löwis <martin@v.loewis.de> | 2005-03-03 12:26:35 (GMT) |
---|---|---|
committer | Martin v. Löwis <martin@v.loewis.de> | 2005-03-03 12:26:35 (GMT) |
commit | 6ce7ed23d0449daa70f396486fae3c1014d93191 (patch) | |
tree | 9a77d8ccb6e6025159945a3a45abf401c99034f7 /Objects/longobject.c | |
parent | 4bf108d74f2e36f16f4c0c00e7791e418e2d47ff (diff) | |
download | cpython-6ce7ed23d0449daa70f396486fae3c1014d93191.zip cpython-6ce7ed23d0449daa70f396486fae3c1014d93191.tar.gz cpython-6ce7ed23d0449daa70f396486fae3c1014d93191.tar.bz2 |
Revert previous checkin on getargs 'L' code. Try to convert all
numbers in PyLong_AsLongLong, and update test suite accordingly.
Backported to 2.4.
Diffstat (limited to 'Objects/longobject.c')
-rw-r--r-- | Objects/longobject.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/Objects/longobject.c b/Objects/longobject.c index 0ee9a69..11a7024 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -783,9 +783,30 @@ PyLong_AsLongLong(PyObject *vv) return -1; } if (!PyLong_Check(vv)) { + PyNumberMethods *nb; + PyObject *io; if (PyInt_Check(vv)) return (PY_LONG_LONG)PyInt_AsLong(vv); - PyErr_BadInternalCall(); + if ((nb = vv->ob_type->tp_as_number) == NULL || + nb->nb_int == NULL) { + PyErr_SetString(PyExc_TypeError, "an integer is required"); + return -1; + } + io = (*nb->nb_int) (vv); + if (io == NULL) + return -1; + if (PyInt_Check(io)) { + bytes = PyInt_AsLong(io); + Py_DECREF(io); + return bytes; + } + if (PyLong_Check(io)) { + bytes = PyLong_AsLongLong(io); + Py_DECREF(io); + return bytes; + } + Py_DECREF(io); + PyErr_SetString(PyExc_TypeError, "integer conversion failed"); return -1; } |