diff options
author | Sergey B Kirpichev <skirpichev@gmail.com> | 2023-11-05 07:42:42 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-05 07:42:42 (GMT) |
commit | 24b5cbd3dce3fe37cdc787ccedd1e73a4f8cfc3c (patch) | |
tree | dd3a5ba679ab74f119112ac8798490fefec3046b /Modules/_testcapi | |
parent | b452202a11c4cb60f69a098a0076a8a8aabade38 (diff) | |
download | cpython-24b5cbd3dce3fe37cdc787ccedd1e73a4f8cfc3c.zip cpython-24b5cbd3dce3fe37cdc787ccedd1e73a4f8cfc3c.tar.gz cpython-24b5cbd3dce3fe37cdc787ccedd1e73a4f8cfc3c.tar.bz2 |
gh-111495: Add tests for PyComplex C API (GH-111591)
Diffstat (limited to 'Modules/_testcapi')
-rw-r--r-- | Modules/_testcapi/complex.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/Modules/_testcapi/complex.c b/Modules/_testcapi/complex.c index 0402b8e..400f405 100644 --- a/Modules/_testcapi/complex.c +++ b/Modules/_testcapi/complex.c @@ -1,7 +1,99 @@ #include "parts.h" #include "util.h" + +static PyObject * +complex_check(PyObject *Py_UNUSED(module), PyObject *obj) +{ + NULLABLE(obj); + return PyLong_FromLong(PyComplex_Check(obj)); +} + +static PyObject * +complex_checkexact(PyObject *Py_UNUSED(module), PyObject *obj) +{ + NULLABLE(obj); + return PyLong_FromLong(PyComplex_CheckExact(obj)); +} + +static PyObject * +complex_fromccomplex(PyObject *Py_UNUSED(module), PyObject *obj) +{ + Py_complex complex; + + if (!PyArg_Parse(obj, "D", &complex)) { + return NULL; + } + + return PyComplex_FromCComplex(complex); +} + +static PyObject * +complex_fromdoubles(PyObject *Py_UNUSED(module), PyObject *args) +{ + double real, imag; + + if (!PyArg_ParseTuple(args, "dd", &real, &imag)) { + return NULL; + } + + return PyComplex_FromDoubles(real, imag); +} + +static PyObject * +complex_realasdouble(PyObject *Py_UNUSED(module), PyObject *obj) +{ + double real; + + NULLABLE(obj); + real = PyComplex_RealAsDouble(obj); + + if (real == -1. && PyErr_Occurred()) { + return NULL; + } + + return PyFloat_FromDouble(real); +} + +static PyObject * +complex_imagasdouble(PyObject *Py_UNUSED(module), PyObject *obj) +{ + double imag; + + NULLABLE(obj); + imag = PyComplex_ImagAsDouble(obj); + + if (imag == -1. && PyErr_Occurred()) { + return NULL; + } + + return PyFloat_FromDouble(imag); +} + +static PyObject * +complex_asccomplex(PyObject *Py_UNUSED(module), PyObject *obj) +{ + Py_complex complex; + + NULLABLE(obj); + complex = PyComplex_AsCComplex(obj); + + if (complex.real == -1. && PyErr_Occurred()) { + return NULL; + } + + return PyComplex_FromCComplex(complex); +} + + static PyMethodDef test_methods[] = { + {"complex_check", complex_check, METH_O}, + {"complex_checkexact", complex_checkexact, METH_O}, + {"complex_fromccomplex", complex_fromccomplex, METH_O}, + {"complex_fromdoubles", complex_fromdoubles, METH_VARARGS}, + {"complex_realasdouble", complex_realasdouble, METH_O}, + {"complex_imagasdouble", complex_imagasdouble, METH_O}, + {"complex_asccomplex", complex_asccomplex, METH_O}, {NULL}, }; |