mirror of https://github.com/python/cpython
165 lines
4.0 KiB
C
165 lines
4.0 KiB
C
#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_getsign(PyObject *module, PyObject *arg)
|
|
{
|
|
int sign;
|
|
NULLABLE(arg);
|
|
if (PyLong_GetSign(arg, &sign) == -1) {
|
|
return NULL;
|
|
}
|
|
return PyLong_FromLong(sign);
|
|
}
|
|
|
|
|
|
static PyObject *
|
|
pylong_ispositive(PyObject *module, PyObject *arg)
|
|
{
|
|
NULLABLE(arg);
|
|
RETURN_INT(PyLong_IsPositive(arg));
|
|
}
|
|
|
|
|
|
static PyObject *
|
|
pylong_isnegative(PyObject *module, PyObject *arg)
|
|
{
|
|
NULLABLE(arg);
|
|
RETURN_INT(PyLong_IsNegative(arg));
|
|
}
|
|
|
|
|
|
static PyObject *
|
|
pylong_iszero(PyObject *module, PyObject *arg)
|
|
{
|
|
NULLABLE(arg);
|
|
RETURN_INT(PyLong_IsZero(arg));
|
|
}
|
|
|
|
|
|
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_getsign", pylong_getsign, METH_O},
|
|
{"pylong_aspid", pylong_aspid, METH_O},
|
|
{"pylong_ispositive", pylong_ispositive, METH_O},
|
|
{"pylong_isnegative", pylong_isnegative, METH_O},
|
|
{"pylong_iszero", pylong_iszero, METH_O},
|
|
{NULL},
|
|
};
|
|
|
|
int
|
|
_PyTestCapi_Init_Long(PyObject *mod)
|
|
{
|
|
if (PyModule_AddFunctions(mod, test_methods) < 0) {
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|