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:
Tim Peters 2001-07-18 20:47:31 +00:00
parent cdab3bf7eb
commit 3dac559299
1 changed files with 10 additions and 4 deletions

View File

@ -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