• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef Py_BUILD_CORE_BUILTIN
2 #  define Py_BUILD_CORE_MODULE 1
3 #endif
4 
5 #include "parts.h"
6 #include "util.h"
7 #include "clinic/long.c.h"
8 
9 /*[clinic input]
10 module _testcapi
11 [clinic start generated code]*/
12 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=6361033e795369fc]*/
13 
14 
15 /*[clinic input]
16 _testcapi.call_long_compact_api
17     arg: object
18     /
19 [clinic start generated code]*/
20 
21 static PyObject *
_testcapi_call_long_compact_api(PyObject * module,PyObject * arg)22 _testcapi_call_long_compact_api(PyObject *module, PyObject *arg)
23 /*[clinic end generated code: output=7e3894f611b1b2b7 input=87b87396967af14c]*/
24 
25 {
26     assert(PyLong_Check(arg));
27     int is_compact = PyUnstable_Long_IsCompact((PyLongObject*)arg);
28     Py_ssize_t value = -1;
29     if (is_compact) {
30         value = PyUnstable_Long_CompactValue((PyLongObject*)arg);
31     }
32     return Py_BuildValue("in", is_compact, value);
33 }
34 
35 
36 static PyObject *
pylong_fromunicodeobject(PyObject * module,PyObject * args)37 pylong_fromunicodeobject(PyObject *module, PyObject *args)
38 {
39     PyObject *unicode;
40     int base;
41     if (!PyArg_ParseTuple(args, "Oi", &unicode, &base)) {
42         return NULL;
43     }
44 
45     NULLABLE(unicode);
46     return PyLong_FromUnicodeObject(unicode, base);
47 }
48 
49 
50 static PyObject *
pylong_asnativebytes(PyObject * module,PyObject * args)51 pylong_asnativebytes(PyObject *module, PyObject *args)
52 {
53     PyObject *v;
54     Py_buffer buffer;
55     Py_ssize_t n, flags;
56     if (!PyArg_ParseTuple(args, "Ow*nn", &v, &buffer, &n, &flags)) {
57         return NULL;
58     }
59     if (buffer.readonly) {
60         PyErr_SetString(PyExc_TypeError, "buffer must be writable");
61         PyBuffer_Release(&buffer);
62         return NULL;
63     }
64     if (buffer.len < n) {
65         PyErr_SetString(PyExc_ValueError, "buffer must be at least 'n' bytes");
66         PyBuffer_Release(&buffer);
67         return NULL;
68     }
69     Py_ssize_t res = PyLong_AsNativeBytes(v, buffer.buf, n, (int)flags);
70     PyBuffer_Release(&buffer);
71     return res >= 0 ? PyLong_FromSsize_t(res) : NULL;
72 }
73 
74 
75 static PyObject *
pylong_fromnativebytes(PyObject * module,PyObject * args)76 pylong_fromnativebytes(PyObject *module, PyObject *args)
77 {
78     Py_buffer buffer;
79     Py_ssize_t n, flags, signed_;
80     if (!PyArg_ParseTuple(args, "y*nnn", &buffer, &n, &flags, &signed_)) {
81         return NULL;
82     }
83     if (buffer.len < n) {
84         PyErr_SetString(PyExc_ValueError, "buffer must be at least 'n' bytes");
85         PyBuffer_Release(&buffer);
86         return NULL;
87     }
88     PyObject *res = signed_
89         ? PyLong_FromNativeBytes(buffer.buf, n, (int)flags)
90         : PyLong_FromUnsignedNativeBytes(buffer.buf, n, (int)flags);
91     PyBuffer_Release(&buffer);
92     return res;
93 }
94 
95 static PyObject *
pylong_aspid(PyObject * module,PyObject * arg)96 pylong_aspid(PyObject *module, PyObject *arg)
97 {
98     NULLABLE(arg);
99     pid_t value = PyLong_AsPid(arg);
100     if (value == -1 && PyErr_Occurred()) {
101         return NULL;
102     }
103     return PyLong_FromPid(value);
104 }
105 
106 
107 static PyMethodDef test_methods[] = {
108     _TESTCAPI_CALL_LONG_COMPACT_API_METHODDEF
109     {"pylong_fromunicodeobject",    pylong_fromunicodeobject,   METH_VARARGS},
110     {"pylong_asnativebytes",        pylong_asnativebytes,       METH_VARARGS},
111     {"pylong_fromnativebytes",      pylong_fromnativebytes,     METH_VARARGS},
112     {"pylong_aspid",                pylong_aspid,               METH_O},
113     {NULL},
114 };
115 
116 int
_PyTestCapi_Init_Long(PyObject * mod)117 _PyTestCapi_Init_Long(PyObject *mod)
118 {
119     if (PyModule_AddFunctions(mod, test_methods) < 0) {
120         return -1;
121     }
122     return 0;
123 }
124