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