Mercurial > cpython-lru_cache-weakref
diff Modules/structmodule.c @ 18705:8df77415a61d legacy-trunk
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.
| author | Tim Peters <tim.peters@gmail.com> |
|---|---|
| date | Wed, 18 Jul 2001 20:47:31 +0000 |
| parents | 2367b7a001a7 |
| children | 01f66f5db326 |
line wrap: on
line diff
--- a/Modules/structmodule.c Wed Jul 18 20:03:32 2001 +0000 +++ b/Modules/structmodule.c Wed Jul 18 20:47:31 2001 +0000 @@ -547,13 +547,19 @@ static PyObject * 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 * 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 @@ -700,7 +706,7 @@ LONG_LONG x; if (get_longlong(v, &x) < 0) return -1; - * (LONG_LONG *)p = x; + memcpy(p, &x, sizeof(LONG_LONG)); return 0; } @@ -710,7 +716,7 @@ unsigned LONG_LONG x; if (get_ulonglong(v, &x) < 0) return -1; - * (unsigned LONG_LONG *)p = x; + memcpy(p, &x, sizeof(unsigned LONG_LONG)); return 0; } #endif
