Commits

Martin von Löwis  committed 46300b1

Revert previous checkin on getargs 'L' code. Try to convert all
numbers in PyLong_AsLongLong, and update test suite accordingly.

  • Participants
  • Parent commits 7556453
  • Branches 2.4

Comments (0)

Files changed (4)

File Lib/test/test_capi.py

 # 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
 
         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
     import threading
     t=threading.Thread(target=TestThreadState)
     t.start()
-
-def test_main():
-    test_support.run_unittest(OtherTests)
-
-if __name__=='__main__':
-    test_main()

File Lib/test/test_getargs2.py

     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))

File Objects/longobject.c

 		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;
 	}
 

File Python/getargs.c

 		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;