mirror of https://github.com/python/cpython
SF bug #442520: test_struct fails on SPARC.
The ob_sval member of a string object isn't necessarily aligned to better than a native long, so the new "q" and "Q" struct codes can't get away w/ casting tricks on platforms where LONG_LONG requires stricter-than-long alignment. After I thought of a few elaborate workarounds, Guido bashed me over the head with the obvious memcpy approach, herewith implemented.
This commit is contained in:
parent
cdab3bf7eb
commit
3dac559299
|
@ -547,13 +547,19 @@ nu_ulong(const char *p, const formatdef *f)
|
||||||
static PyObject *
|
static PyObject *
|
||||||
nu_longlong(const char *p, const formatdef *f)
|
nu_longlong(const char *p, const formatdef *f)
|
||||||
{
|
{
|
||||||
return PyLong_FromLongLong(*(LONG_LONG *)p);
|
/* p may not be properly aligned */
|
||||||
|
LONG_LONG x;
|
||||||
|
memcpy(&x, p, sizeof(LONG_LONG));
|
||||||
|
return PyLong_FromLongLong(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
nu_ulonglong(const char *p, const formatdef *f)
|
nu_ulonglong(const char *p, const formatdef *f)
|
||||||
{
|
{
|
||||||
return PyLong_FromUnsignedLongLong(*(unsigned LONG_LONG *)p);
|
/* p may not be properly aligned */
|
||||||
|
unsigned LONG_LONG x;
|
||||||
|
memcpy(&x, p, sizeof(unsigned LONG_LONG));
|
||||||
|
return PyLong_FromUnsignedLongLong(x);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -700,7 +706,7 @@ np_longlong(char *p, PyObject *v, const formatdef *f)
|
||||||
LONG_LONG x;
|
LONG_LONG x;
|
||||||
if (get_longlong(v, &x) < 0)
|
if (get_longlong(v, &x) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
* (LONG_LONG *)p = x;
|
memcpy(p, &x, sizeof(LONG_LONG));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -710,7 +716,7 @@ np_ulonglong(char *p, PyObject *v, const formatdef *f)
|
||||||
unsigned LONG_LONG x;
|
unsigned LONG_LONG x;
|
||||||
if (get_ulonglong(v, &x) < 0)
|
if (get_ulonglong(v, &x) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
* (unsigned LONG_LONG *)p = x;
|
memcpy(p, &x, sizeof(unsigned LONG_LONG));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue