]> granicus.if.org Git - python/commitdiff
Revert previous checkin on getargs 'L' code. Try to convert all
authorMartin v. Löwis <martin@v.loewis.de>
Thu, 3 Mar 2005 12:26:35 +0000 (12:26 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Thu, 3 Mar 2005 12:26:35 +0000 (12:26 +0000)
numbers in PyLong_AsLongLong, and update test suite accordingly.
Backported to 2.4.

Lib/test/test_capi.py
Lib/test/test_getargs2.py
Objects/longobject.c
Python/getargs.c

index 7196b7be0cfe0a42668284078efa5e88c2edfa7d..1dd24616a25ff0e0df896cef589c8282335af77f 100644 (file)
@@ -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()
index 587fe1f219ca60e3faf81ebb4fe490bccdc572ef..47db73f73f42bd807080cc0e963e866ac6f497fe 100644 (file)
@@ -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))
index 0ee9a694a99e4903956af3877b2c6164d60f2b92..11a7024e4543eda49e84b8f7bfe7bc7062d530b4 100644 (file)
@@ -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;
        }
 
index 0684e38e3b65d8390dcd4f65411e18fce57ce7dc..48f9dc481d0a9a5018d1fbe61ab821882edf26b5 100644 (file)
@@ -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;