mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
bpo-46906: Add PyFloat_Pack8() to the C API (GH-31657)
Add new functions to pack and unpack C double (serialize and deserialize): * PyFloat_Pack2(), PyFloat_Pack4(), PyFloat_Pack8() * PyFloat_Unpack2(), PyFloat_Unpack4(), PyFloat_Unpack8() Document these functions and add unit tests. Rename private functions and move them from the internal C API to the public C API: * _PyFloat_Pack2() => PyFloat_Pack2() * _PyFloat_Pack4() => PyFloat_Pack4() * _PyFloat_Pack8() => PyFloat_Pack8() * _PyFloat_Unpack2() => PyFloat_Unpack2() * _PyFloat_Unpack4() => PyFloat_Unpack4() * _PyFloat_Unpack8() => PyFloat_Unpack8() Replace the "unsigned char*" type with "char*" which is more common and easy to use.
This commit is contained in:
parent
ecfff63e06
commit
882d8096c2
13 changed files with 294 additions and 91 deletions
|
@ -9,7 +9,6 @@
|
|||
|
||||
#define PY_SSIZE_T_CLEAN
|
||||
#include "Python.h"
|
||||
#include "pycore_floatobject.h" // _PyFloat_Unpack4()
|
||||
#include "pycore_moduleobject.h" // _PyModule_GetState()
|
||||
#include "structmember.h" // PyMemberDef
|
||||
#include <stddef.h> // offsetof()
|
||||
|
@ -2056,15 +2055,14 @@ array__array_reconstructor_impl(PyObject *module, PyTypeObject *arraytype,
|
|||
Py_ssize_t i;
|
||||
int le = (mformat_code == IEEE_754_FLOAT_LE) ? 1 : 0;
|
||||
Py_ssize_t itemcount = Py_SIZE(items) / 4;
|
||||
const unsigned char *memstr =
|
||||
(unsigned char *)PyBytes_AS_STRING(items);
|
||||
const char *memstr = PyBytes_AS_STRING(items);
|
||||
|
||||
converted_items = PyList_New(itemcount);
|
||||
if (converted_items == NULL)
|
||||
return NULL;
|
||||
for (i = 0; i < itemcount; i++) {
|
||||
PyObject *pyfloat = PyFloat_FromDouble(
|
||||
_PyFloat_Unpack4(&memstr[i * 4], le));
|
||||
PyFloat_Unpack4(&memstr[i * 4], le));
|
||||
if (pyfloat == NULL) {
|
||||
Py_DECREF(converted_items);
|
||||
return NULL;
|
||||
|
@ -2078,15 +2076,14 @@ array__array_reconstructor_impl(PyObject *module, PyTypeObject *arraytype,
|
|||
Py_ssize_t i;
|
||||
int le = (mformat_code == IEEE_754_DOUBLE_LE) ? 1 : 0;
|
||||
Py_ssize_t itemcount = Py_SIZE(items) / 8;
|
||||
const unsigned char *memstr =
|
||||
(unsigned char *)PyBytes_AS_STRING(items);
|
||||
const char *memstr = PyBytes_AS_STRING(items);
|
||||
|
||||
converted_items = PyList_New(itemcount);
|
||||
if (converted_items == NULL)
|
||||
return NULL;
|
||||
for (i = 0; i < itemcount; i++) {
|
||||
PyObject *pyfloat = PyFloat_FromDouble(
|
||||
_PyFloat_Unpack8(&memstr[i * 8], le));
|
||||
PyFloat_Unpack8(&memstr[i * 8], le));
|
||||
if (pyfloat == NULL) {
|
||||
Py_DECREF(converted_items);
|
||||
return NULL;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue