summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2023-10-14 05:53:57 (GMT)
committerGitHub <noreply@github.com>2023-10-14 05:53:57 (GMT)
commit9d40ebf1902812fad6aa85ede7b6f1fdff3c1291 (patch)
tree81646dac4eb3b0675ba3e037dea8f3c1ecd2b644 /Modules
parent84e2096fbdea880799f2fdb3f0992a8961106bed (diff)
downloadcpython-9d40ebf1902812fad6aa85ede7b6f1fdff3c1291.zip
cpython-9d40ebf1902812fad6aa85ede7b6f1fdff3c1291.tar.gz
cpython-9d40ebf1902812fad6aa85ede7b6f1fdff3c1291.tar.bz2
gh-110628: Add tests for PyLong C API (GH-110629)
Diffstat (limited to 'Modules')
-rw-r--r--Modules/_testcapi/long.c222
-rw-r--r--Modules/_testcapimodule.c2
2 files changed, 224 insertions, 0 deletions
diff --git a/Modules/_testcapi/long.c b/Modules/_testcapi/long.c
index 4362f43..32ad8d3 100644
--- a/Modules/_testcapi/long.c
+++ b/Modules/_testcapi/long.c
@@ -3,6 +3,7 @@
#endif
#include "parts.h"
+#include "util.h"
#include "clinic/long.c.h"
/*[clinic input]
@@ -554,6 +555,69 @@ _testcapi_call_long_compact_api(PyObject *module, PyObject *arg)
return Py_BuildValue("in", is_compact, value);
}
+static PyObject *
+pylong_check(PyObject *module, PyObject *obj)
+{
+ NULLABLE(obj);
+ return PyLong_FromLong(PyLong_Check(obj));
+}
+
+static PyObject *
+pylong_checkexact(PyObject *module, PyObject *obj)
+{
+ NULLABLE(obj);
+ return PyLong_FromLong(PyLong_CheckExact(obj));
+}
+
+static PyObject *
+pylong_fromdouble(PyObject *module, PyObject *arg)
+{
+ double value;
+ if (!PyArg_Parse(arg, "d", &value)) {
+ return NULL;
+ }
+ return PyLong_FromDouble(value);
+}
+
+static PyObject *
+pylong_fromstring(PyObject *module, PyObject *args)
+{
+ const char *str;
+ Py_ssize_t len;
+ int base;
+ char *end = UNINITIALIZED_PTR;
+ if (!PyArg_ParseTuple(args, "z#i", &str, &len, &base)) {
+ return NULL;
+ }
+
+ PyObject *result = PyLong_FromString(str, &end, base);
+ if (result == NULL) {
+ // XXX 'end' is not always set.
+ return NULL;
+ }
+ return Py_BuildValue("Nn", result, (Py_ssize_t)(end - str));
+}
+
+static PyObject *
+pylong_fromunicodeobject(PyObject *module, PyObject *args)
+{
+ PyObject *unicode;
+ int base;
+ if (!PyArg_ParseTuple(args, "Oi", &unicode, &base)) {
+ return NULL;
+ }
+
+ NULLABLE(unicode);
+ return PyLong_FromUnicodeObject(unicode, base);
+}
+
+static PyObject *
+pylong_fromvoidptr(PyObject *module, PyObject *arg)
+{
+ NULLABLE(arg);
+ return PyLong_FromVoidPtr((void *)arg);
+}
+
/*[clinic input]
_testcapi.PyLong_AsInt
arg: object
@@ -564,6 +628,7 @@ static PyObject *
_testcapi_PyLong_AsInt(PyObject *module, PyObject *arg)
/*[clinic end generated code: output=0df9f19de5fa575b input=9561b97105493a67]*/
{
+ NULLABLE(arg);
assert(!PyErr_Occurred());
int value = PyLong_AsInt(arg);
if (value == -1 && PyErr_Occurred()) {
@@ -572,6 +637,145 @@ _testcapi_PyLong_AsInt(PyObject *module, PyObject *arg)
return PyLong_FromLong(value);
}
+static PyObject *
+pylong_aslong(PyObject *module, PyObject *arg)
+{
+ NULLABLE(arg);
+ long value = PyLong_AsLong(arg);
+ if (value == -1 && PyErr_Occurred()) {
+ return NULL;
+ }
+ return PyLong_FromLong(value);
+}
+
+static PyObject *
+pylong_aslongandoverflow(PyObject *module, PyObject *arg)
+{
+ NULLABLE(arg);
+ int overflow = UNINITIALIZED_INT;
+ long value = PyLong_AsLongAndOverflow(arg, &overflow);
+ if (value == -1 && PyErr_Occurred()) {
+ assert(overflow == -1);
+ return NULL;
+ }
+ return Py_BuildValue("li", value, overflow);
+}
+
+static PyObject *
+pylong_asunsignedlong(PyObject *module, PyObject *arg)
+{
+ NULLABLE(arg);
+ unsigned long value = PyLong_AsUnsignedLong(arg);
+ if (value == (unsigned long)-1 && PyErr_Occurred()) {
+ return NULL;
+ }
+ return PyLong_FromUnsignedLong(value);
+}
+
+static PyObject *
+pylong_asunsignedlongmask(PyObject *module, PyObject *arg)
+{
+ NULLABLE(arg);
+ unsigned long value = PyLong_AsUnsignedLongMask(arg);
+ if (value == (unsigned long)-1 && PyErr_Occurred()) {
+ return NULL;
+ }
+ return PyLong_FromUnsignedLong(value);
+}
+
+static PyObject *
+pylong_aslonglong(PyObject *module, PyObject *arg)
+{
+ NULLABLE(arg);
+ long long value = PyLong_AsLongLong(arg);
+ if (value == -1 && PyErr_Occurred()) {
+ return NULL;
+ }
+ return PyLong_FromLongLong(value);
+}
+
+static PyObject *
+pylong_aslonglongandoverflow(PyObject *module, PyObject *arg)
+{
+ NULLABLE(arg);
+ int overflow = UNINITIALIZED_INT;
+ long long value = PyLong_AsLongLongAndOverflow(arg, &overflow);
+ if (value == -1 && PyErr_Occurred()) {
+ assert(overflow == -1);
+ return NULL;
+ }
+ return Py_BuildValue("Li", value, overflow);
+}
+
+static PyObject *
+pylong_asunsignedlonglong(PyObject *module, PyObject *arg)
+{
+ NULLABLE(arg);
+ unsigned long long value = PyLong_AsUnsignedLongLong(arg);
+ if (value == (unsigned long long)-1 && PyErr_Occurred()) {
+ return NULL;
+ }
+ return PyLong_FromUnsignedLongLong(value);
+}
+
+static PyObject *
+pylong_asunsignedlonglongmask(PyObject *module, PyObject *arg)
+{
+ NULLABLE(arg);
+ unsigned long long value = PyLong_AsUnsignedLongLongMask(arg);
+ if (value == (unsigned long long)-1 && PyErr_Occurred()) {
+ return NULL;
+ }
+ return PyLong_FromUnsignedLongLong(value);
+}
+
+static PyObject *
+pylong_as_ssize_t(PyObject *module, PyObject *arg)
+{
+ NULLABLE(arg);
+ Py_ssize_t value = PyLong_AsSsize_t(arg);
+ if (value == -1 && PyErr_Occurred()) {
+ return NULL;
+ }
+ return PyLong_FromSsize_t(value);
+}
+
+static PyObject *
+pylong_as_size_t(PyObject *module, PyObject *arg)
+{
+ NULLABLE(arg);
+ size_t value = PyLong_AsSize_t(arg);
+ if (value == (size_t)-1 && PyErr_Occurred()) {
+ return NULL;
+ }
+ return PyLong_FromSize_t(value);
+}
+
+static PyObject *
+pylong_asdouble(PyObject *module, PyObject *arg)
+{
+ NULLABLE(arg);
+ double value = PyLong_AsDouble(arg);
+ if (value == -1.0 && PyErr_Occurred()) {
+ return NULL;
+ }
+ return PyFloat_FromDouble(value);
+}
+
+static PyObject *
+pylong_asvoidptr(PyObject *module, PyObject *arg)
+{
+ NULLABLE(arg);
+ void *value = PyLong_AsVoidPtr(arg);
+ if (value == NULL) {
+ if (PyErr_Occurred()) {
+ return NULL;
+ }
+ Py_RETURN_NONE;
+ }
+ return Py_NewRef((PyObject *)value);
+}
+
static PyMethodDef test_methods[] = {
_TESTCAPI_TEST_LONG_AND_OVERFLOW_METHODDEF
_TESTCAPI_TEST_LONG_API_METHODDEF
@@ -581,7 +785,25 @@ static PyMethodDef test_methods[] = {
_TESTCAPI_TEST_LONG_LONG_AND_OVERFLOW_METHODDEF
_TESTCAPI_TEST_LONGLONG_API_METHODDEF
_TESTCAPI_CALL_LONG_COMPACT_API_METHODDEF
+ {"pylong_check", pylong_check, METH_O},
+ {"pylong_checkexact", pylong_checkexact, METH_O},
+ {"pylong_fromdouble", pylong_fromdouble, METH_O},
+ {"pylong_fromstring", pylong_fromstring, METH_VARARGS},
+ {"pylong_fromunicodeobject", pylong_fromunicodeobject, METH_VARARGS},
+ {"pylong_fromvoidptr", pylong_fromvoidptr, METH_O},
_TESTCAPI_PYLONG_ASINT_METHODDEF
+ {"pylong_aslong", pylong_aslong, METH_O},
+ {"pylong_aslongandoverflow", pylong_aslongandoverflow, METH_O},
+ {"pylong_asunsignedlong", pylong_asunsignedlong, METH_O},
+ {"pylong_asunsignedlongmask", pylong_asunsignedlongmask, METH_O},
+ {"pylong_aslonglong", pylong_aslonglong, METH_O},
+ {"pylong_aslonglongandoverflow", pylong_aslonglongandoverflow, METH_O},
+ {"pylong_asunsignedlonglong", pylong_asunsignedlonglong, METH_O},
+ {"pylong_asunsignedlonglongmask", pylong_asunsignedlonglongmask, METH_O},
+ {"pylong_as_ssize_t", pylong_as_ssize_t, METH_O},
+ {"pylong_as_size_t", pylong_as_size_t, METH_O},
+ {"pylong_asdouble", pylong_asdouble, METH_O},
+ {"pylong_asvoidptr", pylong_asvoidptr, METH_O},
{NULL},
};
diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
index 2b9b232..c6a8dda 100644
--- a/Modules/_testcapimodule.c
+++ b/Modules/_testcapimodule.c
@@ -3960,7 +3960,9 @@ PyInit__testcapi(void)
PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(ULLONG_MAX));
PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
+ PyModule_AddObject(m, "SIZE_MAX", PyLong_FromSize_t(SIZE_MAX));
PyModule_AddObject(m, "SIZEOF_WCHAR_T", PyLong_FromSsize_t(sizeof(wchar_t)));
+ PyModule_AddObject(m, "SIZEOF_VOID_P", PyLong_FromSsize_t(sizeof(void*)));
PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
PyModule_AddObject(m, "Py_Version", PyLong_FromUnsignedLong(Py_Version));
Py_INCREF(&PyInstanceMethod_Type);