mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 19:34:08 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			137 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
	
		
			3.4 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_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},
 | 
						|
    {NULL},
 | 
						|
};
 | 
						|
 | 
						|
int
 | 
						|
_PyTestCapi_Init_Long(PyObject *mod)
 | 
						|
{
 | 
						|
    if (PyModule_AddFunctions(mod, test_methods) < 0) {
 | 
						|
        return -1;
 | 
						|
    }
 | 
						|
    return 0;
 | 
						|
}
 |