]> granicus.if.org Git - python/commitdiff
SF bug #442520: test_struct fails on SPARC.
authorTim Peters <tim.peters@gmail.com>
Wed, 18 Jul 2001 20:47:31 +0000 (20:47 +0000)
committerTim Peters <tim.peters@gmail.com>
Wed, 18 Jul 2001 20:47:31 +0000 (20:47 +0000)
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.

Modules/structmodule.c

index 66b3ac31d9f45cf742ff0bf4dce9928445713a6b..46aa75bd53ff39abcbbd4cb9f02321ecdd20555e 100644 (file)
@@ -547,13 +547,19 @@ nu_ulong(const char *p, const formatdef *f)
 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 @@ np_longlong(char *p, PyObject *v, const formatdef *f)
        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 @@ np_ulonglong(char *p, PyObject *v, const formatdef *f)
        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