Add a test for Py_ssize_t. Correct typo in getargs.c.
diff --git a/Lib/test/test_getargs2.py b/Lib/test/test_getargs2.py
index 47db73f..670c945 100644
--- a/Lib/test/test_getargs2.py
+++ b/Lib/test/test_getargs2.py
@@ -48,7 +48,7 @@
VERY_LARGE = 0xFF0000121212121212121242L
from _testcapi import UCHAR_MAX, USHRT_MAX, UINT_MAX, ULONG_MAX, INT_MAX, \
- INT_MIN, LONG_MIN, LONG_MAX
+ INT_MIN, LONG_MIN, LONG_MAX, PY_SSIZE_T_MIN, PY_SSIZE_T_MAX
# fake, they are not defined in Python's header files
LLONG_MAX = 2**63-1
@@ -182,6 +182,23 @@
self.failUnlessEqual(42, getargs_l(42L))
self.assertRaises(OverflowError, getargs_l, VERY_LARGE)
+ def test_n(self):
+ from _testcapi import getargs_n
+ # n returns 'Py_ssize_t', and does range checking
+ # (PY_SSIZE_T_MIN ... PY_SSIZE_T_MAX)
+ self.failUnlessEqual(3, getargs_n(3.14))
+ self.failUnlessEqual(99, getargs_n(Long()))
+ self.failUnlessEqual(99, getargs_n(Int()))
+
+ self.assertRaises(OverflowError, getargs_n, PY_SSIZE_T_MIN-1)
+ self.failUnlessEqual(PY_SSIZE_T_MIN, getargs_n(PY_SSIZE_T_MIN))
+ self.failUnlessEqual(PY_SSIZE_T_MAX, getargs_n(PY_SSIZE_T_MAX))
+ self.assertRaises(OverflowError, getargs_n, PY_SSIZE_T_MAX+1)
+
+ self.failUnlessEqual(42, getargs_n(42))
+ self.failUnlessEqual(42, getargs_n(42L))
+ self.assertRaises(OverflowError, getargs_n, VERY_LARGE)
+
class LongLong_TestCase(unittest.TestCase):
def test_L(self):
diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
index dcf0db2..1138258 100644
--- a/Modules/_testcapimodule.c
+++ b/Modules/_testcapimodule.c
@@ -360,6 +360,15 @@
return PyLong_FromLong(value);
}
+static PyObject *
+getargs_n(PyObject *self, PyObject *args)
+{
+ Py_ssize_t value;
+ if (!PyArg_ParseTuple(args, "n", &value))
+ return NULL;
+ return PyInt_FromSsize_t(value);
+}
+
#ifdef HAVE_LONG_LONG
static PyObject *
getargs_L(PyObject *self, PyObject *args)
@@ -661,17 +670,18 @@
{"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
{"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
- {"getargs_b", (PyCFunction)getargs_b, METH_VARARGS},
- {"getargs_B", (PyCFunction)getargs_B, METH_VARARGS},
- {"getargs_H", (PyCFunction)getargs_H, METH_VARARGS},
- {"getargs_I", (PyCFunction)getargs_I, METH_VARARGS},
- {"getargs_k", (PyCFunction)getargs_k, METH_VARARGS},
- {"getargs_i", (PyCFunction)getargs_i, METH_VARARGS},
- {"getargs_l", (PyCFunction)getargs_l, METH_VARARGS},
+ {"getargs_b", getargs_b, METH_VARARGS},
+ {"getargs_B", getargs_B, METH_VARARGS},
+ {"getargs_H", getargs_H, METH_VARARGS},
+ {"getargs_I", getargs_I, METH_VARARGS},
+ {"getargs_k", getargs_k, METH_VARARGS},
+ {"getargs_i", getargs_i, METH_VARARGS},
+ {"getargs_l", getargs_l, METH_VARARGS},
+ {"getargs_n", getargs_n, METH_VARARGS},
#ifdef HAVE_LONG_LONG
- {"getargs_L", (PyCFunction)getargs_L, METH_VARARGS},
- {"getargs_K", (PyCFunction)getargs_K, METH_VARARGS},
- {"test_longlong_api", (PyCFunction)test_longlong_api, METH_NOARGS},
+ {"getargs_L", getargs_L, METH_VARARGS},
+ {"getargs_K", getargs_K, METH_VARARGS},
+ {"test_longlong_api", test_longlong_api, METH_NOARGS},
{"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
{"codec_incrementalencoder",
(PyCFunction)codec_incrementalencoder, METH_VARARGS},
@@ -682,7 +692,7 @@
{"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
#endif
#ifdef WITH_THREAD
- {"_test_thread_state", (PyCFunction)test_thread_state, METH_VARARGS},
+ {"_test_thread_state", test_thread_state, METH_VARARGS},
#endif
{NULL, NULL} /* sentinel */
};
diff --git a/Python/getargs.c b/Python/getargs.c
index 8143d33..e6f607a 100644
--- a/Python/getargs.c
+++ b/Python/getargs.c
@@ -647,10 +647,10 @@
Py_ssize_t *p = va_arg(*p_va, Py_ssize_t *);
Py_ssize_t ival;
if (float_argument_error(arg))
- return converterr("integer<i>", arg, msgbuf, bufsize);
+ return converterr("integer<n>", arg, msgbuf, bufsize);
ival = PyInt_AsSsize_t(arg);
if (ival == -1 && PyErr_Occurred())
- return converterr("integer<i>", arg, msgbuf, bufsize);
+ return converterr("integer<n>", arg, msgbuf, bufsize);
*p = ival;
break;
}