summaryrefslogtreecommitdiffstats
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
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.
-rw-r--r--Lib/test/test_capi.py14
-rw-r--r--Lib/test/test_getargs2.py14
-rw-r--r--Objects/longobject.c23
-rw-r--r--Python/getargs.c1
4 files changed, 27 insertions, 25 deletions
diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
index 7196b7b..1dd2461 100644
--- a/Lib/test/test_capi.py
+++ b/Lib/test/test_capi.py
@@ -1,7 +1,7 @@
# Run the _testcapi module tests (tests for the Python/C API): by defn,
# these are all functions _testcapi exports whose name begins with 'test_'.
-import sys, unittest
+import sys
from test import test_support
import _testcapi
@@ -35,12 +35,6 @@ def TestThreadState():
raise test_support.TestFailed, \
"Couldn't find main thread correctly in the list"
-# Tests which use _testcapi helpers
-class OtherTests(unittest.TestCase):
- def test_exc_L(self):
- # This used to raise a SystemError(bad internal call)
- self.assertRaises(TypeError, _testcapi.getargs_L, "String")
-
try:
_testcapi._test_thread_state
have_thread_state = True
@@ -52,9 +46,3 @@ if have_thread_state:
import threading
t=threading.Thread(target=TestThreadState)
t.start()
-
-def test_main():
- test_support.run_unittest(OtherTests)
-
-if __name__=='__main__':
- test_main()
diff --git a/Lib/test/test_getargs2.py b/Lib/test/test_getargs2.py
index 587fe1f..47db73f 100644
--- a/Lib/test/test_getargs2.py
+++ b/Lib/test/test_getargs2.py
@@ -187,16 +187,10 @@ class LongLong_TestCase(unittest.TestCase):
def test_L(self):
from _testcapi import getargs_L
# L returns 'long long', and does range checking (LLONG_MIN ... LLONG_MAX)
-
- # XXX There's a bug in getargs.c, format code "L":
- # If you pass something else than a Python long, you
- # get "Bad argument to internal function".
-
- # So these three tests are commented out:
-
-## self.failUnlessEqual(3, getargs_L(3.14))
-## self.failUnlessEqual(99, getargs_L(Long()))
-## self.failUnlessEqual(99, getargs_L(Int()))
+ self.failUnlessRaises(TypeError, getargs_L, "Hello")
+ self.failUnlessEqual(3, getargs_L(3.14))
+ self.failUnlessEqual(99, getargs_L(Long()))
+ self.failUnlessEqual(99, getargs_L(Int()))
self.assertRaises(OverflowError, getargs_L, LLONG_MIN-1)
self.failUnlessEqual(LLONG_MIN, getargs_L(LLONG_MIN))
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;
}
diff --git a/Python/getargs.c b/Python/getargs.c
index 0684e38..48f9dc4 100644
--- a/Python/getargs.c
+++ b/Python/getargs.c
@@ -610,7 +610,6 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf,
PY_LONG_LONG *p = va_arg( *p_va, PY_LONG_LONG * );
PY_LONG_LONG ival = PyLong_AsLongLong( arg );
if( ival == (PY_LONG_LONG)-1 && PyErr_Occurred() ) {
- PyErr_Clear();
return converterr("long<L>", arg, msgbuf, bufsize);
} else {
*p = ival;