summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2006-08-02 04:12:36 (GMT)
committerTim Peters <tim.peters@gmail.com>2006-08-02 04:12:36 (GMT)
commit62decc9f4966c060a3d4bcf762d8940d666496c5 (patch)
treeee10fe1ca87904bfeedfd53f6b649a88b170fa2a
parent4edcba69f34ffa09e7e1cc911ee36cbd3fbc14ec (diff)
downloadcpython-62decc9f4966c060a3d4bcf762d8940d666496c5.zip
cpython-62decc9f4966c060a3d4bcf762d8940d666496c5.tar.gz
cpython-62decc9f4966c060a3d4bcf762d8940d666496c5.tar.bz2
Try to squash struct.pack warnings on the "amd64 gentoo trunk"
buildbot (& possibly other 64-bit boxes) during test_gzip. The native zlib crc32 function returns an unsigned 32-bit integer, which the Python wrapper implicitly casts to C long. Therefore the same crc can "look negative" on a 32-bit box but "look positive" on a 64-bit box. This patch papers over that platform difference when writing the crc to file. It may be better to change the Python wrapper, either to make the result "look positive" on all platforms (which means it may have to return a Python long at times on a 32-bit box), or to keep the sign the same across boxes. But that would be a visible change in what users see, while the current hack changes no visible behavior (well, apart from stopping the struct deprecation warning). Note that the module-level write32() function is no longer used.
-rw-r--r--Lib/gzip.py8
1 files changed, 7 insertions, 1 deletions
diff --git a/Lib/gzip.py b/Lib/gzip.py
index 860accc..0bf29e8 100644
--- a/Lib/gzip.py
+++ b/Lib/gzip.py
@@ -315,7 +315,13 @@ class GzipFile:
def close(self):
if self.mode == WRITE:
self.fileobj.write(self.compress.flush())
- write32(self.fileobj, self.crc)
+ # The native zlib crc is an unsigned 32-bit integer, but
+ # the Python wrapper implicitly casts that to a signed C
+ # long. So, on a 32-bit box self.crc may "look negative",
+ # while the same crc on a 64-bit box may "look positive".
+ # To avoid irksome warnings from the `struct` module, force
+ # it to look positive on all boxes.
+ write32u(self.fileobj, LOWU32(self.crc))
# self.size may exceed 2GB, or even 4GB
write32u(self.fileobj, LOWU32(self.size))
self.fileobj = None