numbers in PyLong_AsLongLong, and update test suite accordingly.
Backported to 2.4.
# 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()
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))
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;
}
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;