| #ifndef Py_BUILD_CORE_BUILTIN |
| # define Py_BUILD_CORE_MODULE 1 |
| #endif |
| |
| #include "parts.h" |
| #include "util.h" |
| #include "clinic/long.c.h" |
| |
| /*[clinic input] |
| module _testcapi |
| [clinic start generated code]*/ |
| /*[clinic end generated code: output=da39a3ee5e6b4b0d input=6361033e795369fc]*/ |
| |
| |
| /*[clinic input] |
| _testcapi.call_long_compact_api |
| arg: object |
| / |
| [clinic start generated code]*/ |
| |
| static PyObject * |
| _testcapi_call_long_compact_api(PyObject *module, PyObject *arg) |
| /*[clinic end generated code: output=7e3894f611b1b2b7 input=87b87396967af14c]*/ |
| |
| { |
| assert(PyLong_Check(arg)); |
| int is_compact = PyUnstable_Long_IsCompact((PyLongObject*)arg); |
| Py_ssize_t value = -1; |
| if (is_compact) { |
| value = PyUnstable_Long_CompactValue((PyLongObject*)arg); |
| } |
| return Py_BuildValue("in", is_compact, value); |
| } |
| |
| |
| 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_asnativebytes(PyObject *module, PyObject *args) |
| { |
| PyObject *v; |
| Py_buffer buffer; |
| Py_ssize_t n, flags; |
| if (!PyArg_ParseTuple(args, "Ow*nn", &v, &buffer, &n, &flags)) { |
| return NULL; |
| } |
| if (buffer.readonly) { |
| PyErr_SetString(PyExc_TypeError, "buffer must be writable"); |
| PyBuffer_Release(&buffer); |
| return NULL; |
| } |
| if (buffer.len < n) { |
| PyErr_SetString(PyExc_ValueError, "buffer must be at least 'n' bytes"); |
| PyBuffer_Release(&buffer); |
| return NULL; |
| } |
| Py_ssize_t res = PyLong_AsNativeBytes(v, buffer.buf, n, (int)flags); |
| PyBuffer_Release(&buffer); |
| return res >= 0 ? PyLong_FromSsize_t(res) : NULL; |
| } |
| |
| |
| static PyObject * |
| pylong_fromnativebytes(PyObject *module, PyObject *args) |
| { |
| Py_buffer buffer; |
| Py_ssize_t n, flags, signed_; |
| if (!PyArg_ParseTuple(args, "y*nnn", &buffer, &n, &flags, &signed_)) { |
| return NULL; |
| } |
| if (buffer.len < n) { |
| PyErr_SetString(PyExc_ValueError, "buffer must be at least 'n' bytes"); |
| PyBuffer_Release(&buffer); |
| return NULL; |
| } |
| PyObject *res = signed_ |
| ? PyLong_FromNativeBytes(buffer.buf, n, (int)flags) |
| : PyLong_FromUnsignedNativeBytes(buffer.buf, n, (int)flags); |
| PyBuffer_Release(&buffer); |
| return res; |
| } |
| |
| static PyObject * |
| pylong_aspid(PyObject *module, PyObject *arg) |
| { |
| NULLABLE(arg); |
| pid_t value = PyLong_AsPid(arg); |
| if (value == -1 && PyErr_Occurred()) { |
| return NULL; |
| } |
| return PyLong_FromPid(value); |
| } |
| |
| |
| static PyMethodDef test_methods[] = { |
| _TESTCAPI_CALL_LONG_COMPACT_API_METHODDEF |
| {"pylong_fromunicodeobject", pylong_fromunicodeobject, METH_VARARGS}, |
| {"pylong_asnativebytes", pylong_asnativebytes, METH_VARARGS}, |
| {"pylong_fromnativebytes", pylong_fromnativebytes, METH_VARARGS}, |
| {"pylong_aspid", pylong_aspid, METH_O}, |
| {NULL}, |
| }; |
| |
| int |
| _PyTestCapi_Init_Long(PyObject *mod) |
| { |
| if (PyModule_AddFunctions(mod, test_methods) < 0) { |
| return -1; |
| } |
| return 0; |
| } |