aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Modules/_struct.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/_struct.c')
-rw-r--r--Modules/_struct.c69
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);
}