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