diff options
-rw-r--r-- | Lib/test/test_capi.py | 14 | ||||
-rw-r--r-- | Lib/test/test_getargs2.py | 14 | ||||
-rw-r--r-- | Objects/longobject.c | 23 | ||||
-rw-r--r-- | Python/getargs.c | 1 |
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; |