mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
[3.13] gh-111495: Add tests for PyNumber C API (GH-111996) (#123375)
gh-111495: Add tests for PyNumber C API (GH-111996)
(cherry picked from commit 2f20f5a9bc
)
Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com>
This commit is contained in:
parent
b1372e2f1a
commit
cbcb9e1c0f
3 changed files with 496 additions and 7 deletions
|
@ -1,7 +1,168 @@
|
|||
#include "parts.h"
|
||||
#include "util.h"
|
||||
|
||||
|
||||
static PyObject *
|
||||
number_check(PyObject *Py_UNUSED(module), PyObject *obj)
|
||||
{
|
||||
NULLABLE(obj);
|
||||
return PyLong_FromLong(PyNumber_Check(obj));
|
||||
}
|
||||
|
||||
#define BINARYFUNC(funcsuffix, methsuffix) \
|
||||
static PyObject * \
|
||||
number_##methsuffix(PyObject *Py_UNUSED(module), PyObject *args) \
|
||||
{ \
|
||||
PyObject *o1, *o2; \
|
||||
\
|
||||
if (!PyArg_ParseTuple(args, "OO", &o1, &o2)) { \
|
||||
return NULL; \
|
||||
} \
|
||||
\
|
||||
NULLABLE(o1); \
|
||||
NULLABLE(o2); \
|
||||
return PyNumber_##funcsuffix(o1, o2); \
|
||||
};
|
||||
|
||||
BINARYFUNC(Add, add)
|
||||
BINARYFUNC(Subtract, subtract)
|
||||
BINARYFUNC(Multiply, multiply)
|
||||
BINARYFUNC(MatrixMultiply, matrixmultiply)
|
||||
BINARYFUNC(FloorDivide, floordivide)
|
||||
BINARYFUNC(TrueDivide, truedivide)
|
||||
BINARYFUNC(Remainder, remainder)
|
||||
BINARYFUNC(Divmod, divmod)
|
||||
|
||||
#define TERNARYFUNC(funcsuffix, methsuffix) \
|
||||
static PyObject * \
|
||||
number_##methsuffix(PyObject *Py_UNUSED(module), PyObject *args) \
|
||||
{ \
|
||||
PyObject *o1, *o2, *o3 = Py_None; \
|
||||
\
|
||||
if (!PyArg_ParseTuple(args, "OO|O", &o1, &o2, &o3)) { \
|
||||
return NULL; \
|
||||
} \
|
||||
\
|
||||
NULLABLE(o1); \
|
||||
NULLABLE(o2); \
|
||||
return PyNumber_##funcsuffix(o1, o2, o3); \
|
||||
};
|
||||
|
||||
TERNARYFUNC(Power, power)
|
||||
|
||||
#define UNARYFUNC(funcsuffix, methsuffix) \
|
||||
static PyObject * \
|
||||
number_##methsuffix(PyObject *Py_UNUSED(module), PyObject *obj) \
|
||||
{ \
|
||||
NULLABLE(obj); \
|
||||
return PyNumber_##funcsuffix(obj); \
|
||||
};
|
||||
|
||||
UNARYFUNC(Negative, negative)
|
||||
UNARYFUNC(Positive, positive)
|
||||
UNARYFUNC(Absolute, absolute)
|
||||
UNARYFUNC(Invert, invert)
|
||||
|
||||
BINARYFUNC(Lshift, lshift)
|
||||
BINARYFUNC(Rshift, rshift)
|
||||
BINARYFUNC(And, and)
|
||||
BINARYFUNC(Xor, xor)
|
||||
BINARYFUNC(Or, or)
|
||||
|
||||
BINARYFUNC(InPlaceAdd, inplaceadd)
|
||||
BINARYFUNC(InPlaceSubtract, inplacesubtract)
|
||||
BINARYFUNC(InPlaceMultiply, inplacemultiply)
|
||||
BINARYFUNC(InPlaceMatrixMultiply, inplacematrixmultiply)
|
||||
BINARYFUNC(InPlaceFloorDivide, inplacefloordivide)
|
||||
BINARYFUNC(InPlaceTrueDivide, inplacetruedivide)
|
||||
BINARYFUNC(InPlaceRemainder, inplaceremainder)
|
||||
|
||||
TERNARYFUNC(InPlacePower, inplacepower)
|
||||
|
||||
BINARYFUNC(InPlaceLshift, inplacelshift)
|
||||
BINARYFUNC(InPlaceRshift, inplacershift)
|
||||
BINARYFUNC(InPlaceAnd, inplaceand)
|
||||
BINARYFUNC(InPlaceXor, inplacexor)
|
||||
BINARYFUNC(InPlaceOr, inplaceor)
|
||||
|
||||
UNARYFUNC(Long, long)
|
||||
UNARYFUNC(Float, float)
|
||||
UNARYFUNC(Index, index)
|
||||
|
||||
static PyObject *
|
||||
number_tobase(PyObject *Py_UNUSED(module), PyObject *args)
|
||||
{
|
||||
PyObject *n;
|
||||
int base;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "Oi", &n, &base)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
NULLABLE(n);
|
||||
return PyNumber_ToBase(n, base);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
number_asssizet(PyObject *Py_UNUSED(module), PyObject *args)
|
||||
{
|
||||
PyObject *o, *exc;
|
||||
Py_ssize_t ret;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "OO", &o, &exc)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
NULLABLE(o);
|
||||
NULLABLE(exc);
|
||||
ret = PyNumber_AsSsize_t(o, exc);
|
||||
|
||||
if (ret == (Py_ssize_t)(-1) && PyErr_Occurred()) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return PyLong_FromSsize_t(ret);
|
||||
}
|
||||
|
||||
|
||||
static PyMethodDef test_methods[] = {
|
||||
{"number_check", number_check, METH_O},
|
||||
{"number_add", number_add, METH_VARARGS},
|
||||
{"number_subtract", number_subtract, METH_VARARGS},
|
||||
{"number_multiply", number_multiply, METH_VARARGS},
|
||||
{"number_matrixmultiply", number_matrixmultiply, METH_VARARGS},
|
||||
{"number_floordivide", number_floordivide, METH_VARARGS},
|
||||
{"number_truedivide", number_truedivide, METH_VARARGS},
|
||||
{"number_remainder", number_remainder, METH_VARARGS},
|
||||
{"number_divmod", number_divmod, METH_VARARGS},
|
||||
{"number_power", number_power, METH_VARARGS},
|
||||
{"number_negative", number_negative, METH_O},
|
||||
{"number_positive", number_positive, METH_O},
|
||||
{"number_absolute", number_absolute, METH_O},
|
||||
{"number_invert", number_invert, METH_O},
|
||||
{"number_lshift", number_lshift, METH_VARARGS},
|
||||
{"number_rshift", number_rshift, METH_VARARGS},
|
||||
{"number_and", number_and, METH_VARARGS},
|
||||
{"number_xor", number_xor, METH_VARARGS},
|
||||
{"number_or", number_or, METH_VARARGS},
|
||||
{"number_inplaceadd", number_inplaceadd, METH_VARARGS},
|
||||
{"number_inplacesubtract", number_inplacesubtract, METH_VARARGS},
|
||||
{"number_inplacemultiply", number_inplacemultiply, METH_VARARGS},
|
||||
{"number_inplacematrixmultiply", number_inplacematrixmultiply, METH_VARARGS},
|
||||
{"number_inplacefloordivide", number_inplacefloordivide, METH_VARARGS},
|
||||
{"number_inplacetruedivide", number_inplacetruedivide, METH_VARARGS},
|
||||
{"number_inplaceremainder", number_inplaceremainder, METH_VARARGS},
|
||||
{"number_inplacepower", number_inplacepower, METH_VARARGS},
|
||||
{"number_inplacelshift", number_inplacelshift, METH_VARARGS},
|
||||
{"number_inplacershift", number_inplacershift, METH_VARARGS},
|
||||
{"number_inplaceand", number_inplaceand, METH_VARARGS},
|
||||
{"number_inplacexor", number_inplacexor, METH_VARARGS},
|
||||
{"number_inplaceor", number_inplaceor, METH_VARARGS},
|
||||
{"number_long", number_long, METH_O},
|
||||
{"number_float", number_float, METH_O},
|
||||
{"number_index", number_index, METH_O},
|
||||
{"number_tobase", number_tobase, METH_VARARGS},
|
||||
{"number_asssizet", number_asssizet, METH_VARARGS},
|
||||
{NULL},
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue