]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Merged revisions 61820-61823 via svnmerge from
authorChristian Heimes <christian@cheimes.de>
Mon, 24 Mar 2008 02:19:29 +0000 (02:19 +0000)
committerChristian Heimes <christian@cheimes.de>
Mon, 24 Mar 2008 02:19:29 +0000 (02:19 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r61820 | gregory.p.smith | 2008-03-23 23:14:38 +0100 (Sun, 23 Mar 2008) | 2 lines

  replace calls to get the initial values with the raw constants.
........
  r61821 | gregory.p.smith | 2008-03-24 00:43:02 +0100 (Mon, 24 Mar 2008) | 2 lines

  A bugfix for r61813, it would fail if the data size was >=2**32.
........
  r61822 | gregory.p.smith | 2008-03-24 00:45:12 +0100 (Mon, 24 Mar 2008) | 2 lines

  prevent a warning from the struct module when data size >= 2**32.
........
  r61823 | gregory.p.smith | 2008-03-24 01:08:01 +0100 (Mon, 24 Mar 2008) | 4 lines

  Have the binascii module use zlib's optimized crc32() function when available
  to reduce our code size (1k data table and tiny bit of code).  It falls back
  to its own without zlib.
........

Lib/gzip.py
Modules/binascii.c
Modules/zlibmodule.c
setup.py

index e82cc61dc0686dc071ae75c08e24594602da30ed..45fae9facf869ee62a04e96e410bd88e0780cafe 100644 (file)
@@ -17,7 +17,6 @@ READ, WRITE = 1, 2
 
 def U32(i):
     """Return i as an unsigned integer, assuming it fits in 32 bits.
-
     If it's >= 2GB when viewed as a 32-bit unsigned int, return a long.
     """
     if i < 0:
@@ -320,7 +319,7 @@ class GzipFile:
         if crc32 != self.crc:
             raise IOError("CRC check failed %s != %s" % (hex(crc32),
                                                          hex(self.crc)))
-        elif isize != self.size:
+        elif isize != (self.size & 0xffffffff):
             raise IOError("Incorrect length of data produced")
 
     def close(self):
@@ -328,7 +327,7 @@ class GzipFile:
             self.fileobj.write(self.compress.flush())
             write32u(self.fileobj, self.crc)
             # self.size may exceed 2GB, or even 4GB
-            write32u(self.fileobj, self.size)
+            write32u(self.fileobj, self.size & 0xffffffff)
             self.fileobj = None
         elif self.mode == READ:
             self.fileobj = None
index e09255c2af00a67fe75b06d7753382f3fe72e7c7..034dc01c13ec302dd60aec2ebee3143086629704 100644 (file)
@@ -56,6 +56,9 @@
 #define PY_SSIZE_T_CLEAN
 
 #include "Python.h"
+#ifdef USE_ZLIB_CRC32
+#include "zlib.h"
+#endif
 
 static PyObject *Error;
 static PyObject *Incomplete;
@@ -776,6 +779,20 @@ binascii_crc_hqx(PyObject *self, PyObject *args)
 PyDoc_STRVAR(doc_crc32,
 "(data, oldcrc = 0) -> newcrc. Compute CRC-32 incrementally");
 
+#ifdef USE_ZLIB_CRC32
+/* This was taken from zlibmodule.c PyZlib_crc32 (but is PY_SSIZE_T_CLEAN) */
+static PyObject *
+binascii_crc32(PyObject *self, PyObject *args)
+{
+    uLong crc32val = 0;  /* crc32(0L, Z_NULL, 0) */
+    Byte *buf;
+    int len;
+    if (!PyArg_ParseTuple(args, "s#|I:crc32", &buf, &len, &crc32val))
+        return NULL;
+    crc32val = crc32(crc32val, buf, len);
+    return PyLong_FromUnsignedLong(crc32val & 0xffffffffU);
+}
+#else  /* USE_ZLIB_CRC32 */
 /*  Crc - 32 BIT ANSI X3.66 CRC checksum files
     Also known as: ISO 3307
 **********************************************************************|
@@ -914,6 +931,7 @@ binascii_crc32(PyObject *self, PyObject *args)
        result = (crc ^ 0xFFFFFFFF);
        return PyLong_FromUnsignedLong(result & 0xffffffff);
 }
+#endif  /* USE_ZLIB_CRC32 */
 
 
 static PyObject *
index 3426ccfd12118195fe4a102ff42f0606ffa94589..cecb9cf38bbb50fe4bbb685c2bd1686337acf969 100644 (file)
@@ -915,7 +915,7 @@ PyDoc_STRVAR(adler32__doc__,
 static PyObject *
 PyZlib_adler32(PyObject *self, PyObject *args)
 {
-    unsigned int adler32val = adler32(0L, Z_NULL, 0);
+    uLong adler32val = 1;  /* adler32(0L, Z_NULL, 0) */
     Byte *buf;
     int len;
 
@@ -934,7 +934,7 @@ PyDoc_STRVAR(crc32__doc__,
 static PyObject *
 PyZlib_crc32(PyObject *self, PyObject *args)
 {
-    unsigned int crc32val = crc32(0L, Z_NULL, 0);
+    uLong crc32val = 0;  /* crc32(0L, Z_NULL, 0) */
     Byte *buf;
     int len;
     if (!PyArg_ParseTuple(args, "s#|I:crc32", &buf, &len, &crc32val))
index 2365a0b48b23bcf8abc1a964a2bcf955f9cac306..be34cd11ec9464ab5b42ef83551aa1f086e20fa7 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -472,9 +472,6 @@ class PyBuildExt(build_ext):
         # select(2); not on ancient System V
         exts.append( Extension('select', ['selectmodule.c']) )
 
-        # Helper module for various ascii-encoders
-        exts.append( Extension('binascii', ['binascii.c']) )
-
         # Fred Drake's interface to the Python parser
         exts.append( Extension('parser', ['parsermodule.c']) )
 
@@ -1005,6 +1002,7 @@ class PyBuildExt(build_ext):
         # You can upgrade zlib to version 1.1.4 yourself by going to
         # http://www.gzip.org/zlib/
         zlib_inc = find_file('zlib.h', [], inc_dirs)
+        have_zlib = False
         if zlib_inc is not None:
             zlib_h = zlib_inc[0] + '/zlib.h'
             version = '"0.0.0"'
@@ -1026,6 +1024,7 @@ class PyBuildExt(build_ext):
                     exts.append( Extension('zlib', ['zlibmodule.c'],
                                            libraries = ['z'],
                                            extra_link_args = zlib_extra_link_args))
+                    have_zlib = True
                 else:
                     missing.append('zlib')
             else:
@@ -1033,6 +1032,21 @@ class PyBuildExt(build_ext):
         else:
             missing.append('zlib')
 
+        # Helper module for various ascii-encoders.  Uses zlib for an optimized
+        # crc32 if we have it.  Otherwise binascii uses its own.
+        if have_zlib:
+            extra_compile_args = ['-DUSE_ZLIB_CRC32']
+            libraries = ['z']
+            extra_link_args = zlib_extra_link_args
+        else:
+            extra_compile_args = []
+            libraries = []
+            extra_link_args = []
+        exts.append( Extension('binascii', ['binascii.c'],
+                               extra_compile_args = extra_compile_args,
+                               libraries = libraries,
+                               extra_link_args = extra_link_args) )
+
         # Gustavo Niemeyer's bz2 module.
         if (self.compiler.find_library_file(lib_dirs, 'bz2')):
             if sys.platform == "darwin":