summaryrefslogtreecommitdiffstats
path: root/Objects/longobject.c
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2005-03-03 12:26:35 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2005-03-03 12:26:35 (GMT)
commit6ce7ed23d0449daa70f396486fae3c1014d93191 (patch)
tree9a77d8ccb6e6025159945a3a45abf401c99034f7 /Objects/longobject.c
parent4bf108d74f2e36f16f4c0c00e7791e418e2d47ff (diff)
downloadcpython-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.c23
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;
}