| #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}, | |
| }; | |
| int | |
| _PyTestCapi_Init_Numbers(PyObject *mod) | |
| { | |
| if (PyModule_AddFunctions(mod, test_methods) < 0) { | |
| return -1; | |
| } | |
| return 0; | |
| } |