From 964e02a901558b7c03170e642cb7a6d4609bd15c Mon Sep 17 00:00:00 2001 From: Bob Ippolito Date: Thu, 25 May 2006 21:09:45 +0000 Subject: fix test_float regression and 64-bit size mismatch issue --- Modules/_struct.c | 18 ++++++++++++++++-- 1 file 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++; -- cgit v0.12