diff options
Diffstat (limited to 'Modules/_struct.c')
-rw-r--r-- | Modules/_struct.c | 69 |
1 files changed, 10 insertions, 59 deletions
diff --git a/Modules/_struct.c b/Modules/_struct.c index ee757ed8a9d..3fad35a8c94 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -11,10 +11,8 @@ #include "pycore_bytesobject.h" // _PyBytesWriter #include "pycore_long.h" // _PyLong_AsByteArray() #include "pycore_moduleobject.h" // _PyModule_GetState() +#include "pycore_weakref.h" // FT_CLEAR_WEAKREFS() -#ifdef Py_HAVE_C_COMPLEX -# include "_complex.h" // complex -#endif #include <stddef.h> // offsetof() /*[clinic input] @@ -495,25 +493,23 @@ nu_double(_structmodulestate *state, const char *p, const formatdef *f) return PyFloat_FromDouble(x); } -#ifdef Py_HAVE_C_COMPLEX static PyObject * nu_float_complex(_structmodulestate *state, const char *p, const formatdef *f) { - float complex x; + float x[2]; memcpy(&x, p, sizeof(x)); - return PyComplex_FromDoubles(creal(x), cimag(x)); + return PyComplex_FromDoubles(x[0], x[1]); } static PyObject * nu_double_complex(_structmodulestate *state, const char *p, const formatdef *f) { - double complex x; + double x[2]; memcpy(&x, p, sizeof(x)); - return PyComplex_FromDoubles(creal(x), cimag(x)); + return PyComplex_FromDoubles(x[0], x[1]); } -#endif static PyObject * nu_void_p(_structmodulestate *state, const char *p, const formatdef *f) @@ -788,13 +784,12 @@ np_double(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) return 0; } -#ifdef Py_HAVE_C_COMPLEX static int np_float_complex(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { Py_complex c = PyComplex_AsCComplex(v); - float complex x = CMPLXF((float)c.real, (float)c.imag); + float x[2] = {(float)c.real, (float)c.imag}; if (c.real == -1 && PyErr_Occurred()) { PyErr_SetString(state->StructError, @@ -810,7 +805,7 @@ np_double_complex(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { Py_complex c = PyComplex_AsCComplex(v); - double complex x = CMPLX(c.real, c.imag); + double x[2] = {c.real, c.imag}; if (c.real == -1 && PyErr_Occurred()) { PyErr_SetString(state->StructError, @@ -820,25 +815,6 @@ np_double_complex(_structmodulestate *state, char *p, PyObject *v, memcpy(p, &x, sizeof(x)); return 0; } -#else -static int -np_complex_stub(_structmodulestate *state, char *p, PyObject *v, - const formatdef *f) -{ - PyErr_Format(state->StructError, - "'%c' format not supported on this system", - f->format); - return -1; -} -static PyObject * -nu_complex_stub(_structmodulestate *state, const char *p, const formatdef *f) -{ - PyErr_Format(state->StructError, - "'%c' format not supported on this system", - f->format); - return NULL; -} -#endif static int np_void_p(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) @@ -878,13 +854,8 @@ static const formatdef native_table[] = { {'e', sizeof(short), _Alignof(short), nu_halffloat, np_halffloat}, {'f', sizeof(float), _Alignof(float), nu_float, np_float}, {'d', sizeof(double), _Alignof(double), nu_double, np_double}, -#ifdef Py_HAVE_C_COMPLEX - {'F', sizeof(float complex), _Alignof(float complex), nu_float_complex, np_float_complex}, - {'D', sizeof(double complex), _Alignof(double complex), nu_double_complex, np_double_complex}, -#else - {'F', 1, 0, nu_complex_stub, np_complex_stub}, - {'D', 1, 0, nu_complex_stub, np_complex_stub}, -#endif + {'F', 2*sizeof(float), _Alignof(float), nu_float_complex, np_float_complex}, + {'D', 2*sizeof(double), _Alignof(double), nu_double_complex, np_double_complex}, {'P', sizeof(void *), _Alignof(void *), nu_void_p, np_void_p}, {0} }; @@ -985,7 +956,6 @@ bu_double(_structmodulestate *state, const char *p, const formatdef *f) return unpack_double(p, 0); } -#ifdef Py_HAVE_C_COMPLEX static PyObject * bu_float_complex(_structmodulestate *state, const char *p, const formatdef *f) { @@ -1015,7 +985,6 @@ bu_double_complex(_structmodulestate *state, const char *p, const formatdef *f) } return PyComplex_FromDoubles(x, y); } -#endif static PyObject * bu_bool(_structmodulestate *state, const char *p, const formatdef *f) @@ -1156,7 +1125,6 @@ bp_double(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) return PyFloat_Pack8(x, p, 0); } -#ifdef Py_HAVE_C_COMPLEX static int bp_float_complex(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { @@ -1186,7 +1154,6 @@ bp_double_complex(_structmodulestate *state, char *p, PyObject *v, const formatd } return PyFloat_Pack8(x.imag, p + 8, 0); } -#endif static int bp_bool(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) @@ -1218,13 +1185,8 @@ static formatdef bigendian_table[] = { {'e', 2, 0, bu_halffloat, bp_halffloat}, {'f', 4, 0, bu_float, bp_float}, {'d', 8, 0, bu_double, bp_double}, -#ifdef Py_HAVE_C_COMPLEX {'F', 8, 0, bu_float_complex, bp_float_complex}, {'D', 16, 0, bu_double_complex, bp_double_complex}, -#else - {'F', 1, 0, nu_complex_stub, np_complex_stub}, - {'D', 1, 0, nu_complex_stub, np_complex_stub}, -#endif {0} }; @@ -1324,7 +1286,6 @@ lu_double(_structmodulestate *state, const char *p, const formatdef *f) return unpack_double(p, 1); } -#ifdef Py_HAVE_C_COMPLEX static PyObject * lu_float_complex(_structmodulestate *state, const char *p, const formatdef *f) { @@ -1354,7 +1315,6 @@ lu_double_complex(_structmodulestate *state, const char *p, const formatdef *f) } return PyComplex_FromDoubles(x, y); } -#endif static int lp_int(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) @@ -1489,7 +1449,6 @@ lp_double(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) return PyFloat_Pack8(x, p, 1); } -#ifdef Py_HAVE_C_COMPLEX static int lp_float_complex(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { @@ -1520,7 +1479,6 @@ lp_double_complex(_structmodulestate *state, char *p, PyObject *v, const formatd } return PyFloat_Pack8(x.imag, p + 8, 1); } -#endif static formatdef lilendian_table[] = { {'x', 1, 0, NULL}, @@ -1542,13 +1500,8 @@ static formatdef lilendian_table[] = { {'e', 2, 0, lu_halffloat, lp_halffloat}, {'f', 4, 0, lu_float, lp_float}, {'d', 8, 0, lu_double, lp_double}, -#ifdef Py_HAVE_C_COMPLEX {'F', 8, 0, lu_float_complex, lp_float_complex}, {'D', 16, 0, lu_double_complex, lp_double_complex}, -#else - {'F', 1, 0, nu_complex_stub, np_complex_stub}, - {'D', 1, 0, nu_complex_stub, np_complex_stub}, -#endif {0} }; @@ -1842,9 +1795,7 @@ s_dealloc(PyObject *op) PyStructObject *s = PyStructObject_CAST(op); PyTypeObject *tp = Py_TYPE(s); PyObject_GC_UnTrack(s); - if (s->weakreflist != NULL) { - PyObject_ClearWeakRefs(op); - } + FT_CLEAR_WEAKREFS(op, s->weakreflist); if (s->s_codes != NULL) { PyMem_Free(s->s_codes); } |