From: Martin v. Löwis Date: Thu, 3 Mar 2005 12:26:20 +0000 (+0000) Subject: Revert previous checkin on getargs 'L' code. Try to convert all X-Git-Tag: v2.4.1c1~28 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=77c8402c97092b5520ac13ad4ffa4417a08a8db9;p=thirdparty%2FPython%2Fcpython.git Revert previous checkin on getargs 'L' code. Try to convert all numbers in PyLong_AsLongLong, and update test suite accordingly. --- diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 7196b7be0cfe..1dd24616a25f 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 587fe1f219ca..47db73f73f42 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 0ee9a694a99e..11a7024e4543 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 0684e38e3b65..48f9dc481d0a 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", arg, msgbuf, bufsize); } else { *p = ival;