• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // clinic/float.c.h uses internal pycore_modsupport.h API
2 #define PYTESTCAPI_NEED_INTERNAL_API
3 
4 #include "parts.h"
5 #include "util.h"
6 #include "clinic/float.c.h"
7 
8 
9 /*[clinic input]
10 module _testcapi
11 [clinic start generated code]*/
12 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=6361033e795369fc]*/
13 
14 /*[clinic input]
15 _testcapi.float_pack
16 
17     size: int
18     d: double
19     le: int
20     /
21 
22 Test PyFloat_Pack2(), PyFloat_Pack4() and PyFloat_Pack8()
23 [clinic start generated code]*/
24 
25 static PyObject *
_testcapi_float_pack_impl(PyObject * module,int size,double d,int le)26 _testcapi_float_pack_impl(PyObject *module, int size, double d, int le)
27 /*[clinic end generated code: output=7899bd98f8b6cb04 input=52c9115121999c98]*/
28 {
29     switch (size)
30     {
31     case 2:
32     {
33         char data[2];
34         if (PyFloat_Pack2(d, data, le) < 0) {
35             return NULL;
36         }
37         return PyBytes_FromStringAndSize(data, Py_ARRAY_LENGTH(data));
38     }
39     case 4:
40     {
41         char data[4];
42         if (PyFloat_Pack4(d, data, le) < 0) {
43             return NULL;
44         }
45         return PyBytes_FromStringAndSize(data, Py_ARRAY_LENGTH(data));
46     }
47     case 8:
48     {
49         char data[8];
50         if (PyFloat_Pack8(d, data, le) < 0) {
51             return NULL;
52         }
53         return PyBytes_FromStringAndSize(data, Py_ARRAY_LENGTH(data));
54     }
55     default: break;
56     }
57 
58     PyErr_SetString(PyExc_ValueError, "size must 2, 4 or 8");
59     return NULL;
60 }
61 
62 
63 /*[clinic input]
64 _testcapi.float_unpack
65 
66     data: str(accept={robuffer}, zeroes=True)
67     le: int
68     /
69 
70 Test PyFloat_Unpack2(), PyFloat_Unpack4() and PyFloat_Unpack8()
71 [clinic start generated code]*/
72 
73 static PyObject *
_testcapi_float_unpack_impl(PyObject * module,const char * data,Py_ssize_t data_length,int le)74 _testcapi_float_unpack_impl(PyObject *module, const char *data,
75                             Py_ssize_t data_length, int le)
76 /*[clinic end generated code: output=617059f889ddbfe4 input=c095e4bb75a696cd]*/
77 {
78     assert(!PyErr_Occurred());
79     double d;
80     switch (data_length)
81     {
82     case 2:
83         d = PyFloat_Unpack2(data, le);
84         break;
85     case 4:
86         d = PyFloat_Unpack4(data, le);
87         break;
88     case 8:
89         d = PyFloat_Unpack8(data, le);
90         break;
91     default:
92         PyErr_SetString(PyExc_ValueError, "data length must 2, 4 or 8 bytes");
93         return NULL;
94     }
95 
96     if (d == -1.0 && PyErr_Occurred()) {
97         return NULL;
98     }
99     return PyFloat_FromDouble(d);
100 }
101 
102 static PyMethodDef test_methods[] = {
103     _TESTCAPI_FLOAT_PACK_METHODDEF
104     _TESTCAPI_FLOAT_UNPACK_METHODDEF
105     {NULL},
106 };
107 
108 int
_PyTestCapi_Init_Float(PyObject * mod)109 _PyTestCapi_Init_Float(PyObject *mod)
110 {
111     if (PyModule_AddFunctions(mod, test_methods) < 0) {
112         return -1;
113     }
114 
115     return 0;
116 }
117