Revert previous checkin on getargs 'L' code. Try to convert all
numbers in PyLong_AsLongLong, and update test suite accordingly.
Backported to 2.4.
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 @@
         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 @@
     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 @@
     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 @@
 		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 @@
 		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;