summaryrefslogtreecommitdiffstats
path: root/Modules/_struct.c
diff options
context:
space:
mode:
authorBob Ippolito <bob@redivi.com>2006-05-25 21:09:45 (GMT)
committerBob Ippolito <bob@redivi.com>2006-05-25 21:09:45 (GMT)
commit964e02a901558b7c03170e642cb7a6d4609bd15c (patch)
tree6ba11914a7564ac7624cc172db9924786dfa8165 /Modules/_struct.c
parent955b64c03139ec34ce9307960c3e36d6de20e559 (diff)
downloadcpython-964e02a901558b7c03170e642cb7a6d4609bd15c.zip
cpython-964e02a901558b7c03170e642cb7a6d4609bd15c.tar.gz
cpython-964e02a901558b7c03170e642cb7a6d4609bd15c.tar.bz2
fix test_float regression and 64-bit size mismatch issue
Diffstat (limited to 'Modules/_struct.c')
-rw-r--r--Modules/_struct.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/Modules/_struct.c b/Modules/_struct.c
index 06676fa..fb3e497 100644
--- a/Modules/_struct.c
+++ b/Modules/_struct.c
@@ -1486,14 +1486,28 @@ init_struct(void)
other = lilendian_table;
else
other = bigendian_table;
+ /* Scan through the native table, find a matching
+ entry in the endian table and swap in the
+ native implementations whenever possible
+ (64-bit platforms may not have "standard" sizes) */
while (native->format != '\0' && other->format != '\0') {
ptr = other;
while (ptr->format != '\0') {
if (ptr->format == native->format) {
- ptr->pack = native->pack;
- ptr->unpack = native->unpack;
+ /* Match faster when formats are
+ listed in the same order */
if (ptr == other)
other++;
+ /* Only use the trick if the
+ size matches */
+ if (ptr->size != native->size)
+ break;
+ /* Skip float and double, could be
+ "unknown" float format */
+ if (ptr->format == 'd' || ptr->format == 'f')
+ break;
+ ptr->pack = native->pack;
+ ptr->unpack = native->unpack;
break;
}
ptr++;