summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2007-05-22 22:44:07 (GMT)
committerGuido van Rossum <guido@python.org>2007-05-22 22:44:07 (GMT)
commit776152b6018fa1dc25c7a1960237c76c26931cab (patch)
treef7621cb7d856de93ab664bcd34b59bbe4e6373b3
parentdcee3c0d1f536bef1c01fbdcbf714b82b7aa1b1e (diff)
downloadcpython-776152b6018fa1dc25c7a1960237c76c26931cab.zip
cpython-776152b6018fa1dc25c7a1960237c76c26931cab.tar.gz
cpython-776152b6018fa1dc25c7a1960237c76c26931cab.tar.bz2
zlib now uses bytes everywhere, and the test passes.
-rw-r--r--Lib/test/test_zlib.py84
-rw-r--r--Modules/zlibmodule.c98
2 files changed, 104 insertions, 78 deletions
diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py
index dc4a7d8..a3310a5 100644
--- a/Lib/test/test_zlib.py
+++ b/Lib/test/test_zlib.py
@@ -7,22 +7,22 @@ import random
class ChecksumTestCase(unittest.TestCase):
# checksum test cases
def test_crc32start(self):
- self.assertEqual(zlib.crc32(""), zlib.crc32("", 0))
- self.assert_(zlib.crc32("abc", 0xffffffff))
+ self.assertEqual(zlib.crc32(b""), zlib.crc32(b"", 0))
+ self.assert_(zlib.crc32(b"abc", 0xffffffff))
def test_crc32empty(self):
- self.assertEqual(zlib.crc32("", 0), 0)
- self.assertEqual(zlib.crc32("", 1), 1)
- self.assertEqual(zlib.crc32("", 432), 432)
+ self.assertEqual(zlib.crc32(b"", 0), 0)
+ self.assertEqual(zlib.crc32(b"", 1), 1)
+ self.assertEqual(zlib.crc32(b"", 432), 432)
def test_adler32start(self):
- self.assertEqual(zlib.adler32(""), zlib.adler32("", 1))
- self.assert_(zlib.adler32("abc", 0xffffffff))
+ self.assertEqual(zlib.adler32(b""), zlib.adler32(b"", 1))
+ self.assert_(zlib.adler32(b"abc", 0xffffffff))
def test_adler32empty(self):
- self.assertEqual(zlib.adler32("", 0), 0)
- self.assertEqual(zlib.adler32("", 1), 1)
- self.assertEqual(zlib.adler32("", 432), 432)
+ self.assertEqual(zlib.adler32(b"", 0), 0)
+ self.assertEqual(zlib.adler32(b"", 1), 1)
+ self.assertEqual(zlib.adler32(b"", 432), 432)
def assertEqual32(self, seen, expected):
# 32-bit values masked -- checksums on 32- vs 64- bit machines
@@ -30,13 +30,13 @@ class ChecksumTestCase(unittest.TestCase):
self.assertEqual(seen & 0x0FFFFFFFF, expected & 0x0FFFFFFFF)
def test_penguins(self):
- self.assertEqual32(zlib.crc32("penguin", 0), 0x0e5c1a120)
- self.assertEqual32(zlib.crc32("penguin", 1), 0x43b6aa94)
- self.assertEqual32(zlib.adler32("penguin", 0), 0x0bcf02f6)
- self.assertEqual32(zlib.adler32("penguin", 1), 0x0bd602f7)
+ self.assertEqual32(zlib.crc32(b"penguin", 0), 0x0e5c1a120)
+ self.assertEqual32(zlib.crc32(b"penguin", 1), 0x43b6aa94)
+ self.assertEqual32(zlib.adler32(b"penguin", 0), 0x0bcf02f6)
+ self.assertEqual32(zlib.adler32(b"penguin", 1), 0x0bd602f7)
- self.assertEqual(zlib.crc32("penguin"), zlib.crc32("penguin", 0))
- self.assertEqual(zlib.adler32("penguin"),zlib.adler32("penguin",1))
+ self.assertEqual(zlib.crc32(b"penguin"), zlib.crc32(b"penguin", 0))
+ self.assertEqual(zlib.adler32(b"penguin"),zlib.adler32(b"penguin",1))
@@ -109,10 +109,10 @@ class CompressObjectTestCase(unittest.TestCase):
for i in range(0, len(data), 256):
bufs.append(co.compress(data[i:i+256]))
bufs.append(co.flush())
- combuf = ''.join(bufs)
+ combuf = b''.join(bufs)
dco = zlib.decompressobj()
- y1 = dco.decompress(''.join(bufs))
+ y1 = dco.decompress(b''.join(bufs))
y2 = dco.flush()
self.assertEqual(data, y1 + y2)
@@ -125,7 +125,7 @@ class CompressObjectTestCase(unittest.TestCase):
for i in range(0, len(data), cx):
bufs.append(co.compress(data[i:i+cx]))
bufs.append(co.flush())
- combuf = ''.join(bufs)
+ combuf = b''.join(bufs)
self.assertEqual(data, zlib.decompress(combuf))
@@ -133,8 +133,8 @@ class CompressObjectTestCase(unittest.TestCase):
bufs = []
for i in range(0, len(combuf), dcx):
bufs.append(dco.decompress(combuf[i:i+dcx]))
- self.assertEqual('', dco.unconsumed_tail, ########
- "(A) uct should be '': not %d long" %
+ self.assertEqual(b'', dco.unconsumed_tail, ########
+ "(A) uct should be b'': not %d long" %
len(dco.unconsumed_tail))
if flush:
bufs.append(dco.flush())
@@ -145,10 +145,10 @@ class CompressObjectTestCase(unittest.TestCase):
bufs.append(chunk)
else:
break
- self.assertEqual('', dco.unconsumed_tail, ########
- "(B) uct should be '': not %d long" %
+ self.assertEqual(b'', dco.unconsumed_tail, ########
+ "(B) uct should be b'': not %d long" %
len(dco.unconsumed_tail))
- self.assertEqual(data, ''.join(bufs))
+ self.assertEqual(data, b''.join(bufs))
# Failure means: "decompressobj with init options failed"
def test_decompincflush(self):
@@ -164,7 +164,7 @@ class CompressObjectTestCase(unittest.TestCase):
for i in range(0, len(data), cx):
bufs.append(co.compress(data[i:i+cx]))
bufs.append(co.flush())
- combuf = ''.join(bufs)
+ combuf = b''.join(bufs)
self.assertEqual(data, zlib.decompress(combuf),
'compressed data failure')
@@ -179,7 +179,7 @@ class CompressObjectTestCase(unittest.TestCase):
bufs.append(chunk)
cb = dco.unconsumed_tail
bufs.append(dco.flush())
- self.assertEqual(data, ''.join(bufs), 'Wrong data retrieved')
+ self.assertEqual(data, b''.join(bufs), 'Wrong data retrieved')
def test_decompressmaxlen(self, flush=False):
# Check a decompression object with max_length specified
@@ -189,7 +189,7 @@ class CompressObjectTestCase(unittest.TestCase):
for i in range(0, len(data), 256):
bufs.append(co.compress(data[i:i+256]))
bufs.append(co.flush())
- combuf = ''.join(bufs)
+ combuf = b''.join(bufs)
self.assertEqual(data, zlib.decompress(combuf),
'compressed data failure')
@@ -211,7 +211,7 @@ class CompressObjectTestCase(unittest.TestCase):
self.failIf(len(chunk) > max_length,
'chunk too big (%d>%d)' % (len(chunk),max_length))
bufs.append(chunk)
- self.assertEqual(data, ''.join(bufs), 'Wrong data retrieved')
+ self.assertEqual(data, b''.join(bufs), 'Wrong data retrieved')
def test_decompressmaxlenflush(self):
self.test_decompressmaxlen(flush=True)
@@ -220,7 +220,7 @@ class CompressObjectTestCase(unittest.TestCase):
# Misc tests of max_length
dco = zlib.decompressobj()
self.assertRaises(ValueError, dco.decompress, "", -1)
- self.assertEqual('', dco.unconsumed_tail)
+ self.assertEqual(b'', dco.unconsumed_tail)
def test_flushes(self):
# Test flush() with the various options, using all the
@@ -237,7 +237,7 @@ class CompressObjectTestCase(unittest.TestCase):
b = obj.flush( sync )
c = obj.compress( data[3000:] )
d = obj.flush()
- self.assertEqual(zlib.decompress(''.join([a,b,c,d])),
+ self.assertEqual(zlib.decompress(b''.join([a,b,c,d])),
data, ("Decompress failed: flush "
"mode=%i, level=%i") % (sync, level))
del obj
@@ -284,13 +284,13 @@ class CompressObjectTestCase(unittest.TestCase):
co = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
self.failUnless(co.flush()) # Returns a zlib header
dco = zlib.decompressobj()
- self.assertEqual(dco.flush(), "") # Returns nothing
+ self.assertEqual(dco.flush(), b"") # Returns nothing
if hasattr(zlib.compressobj(), "copy"):
def test_compresscopy(self):
# Test copying a compression object
data0 = HAMLET_SCENE
- data1 = HAMLET_SCENE.swapcase()
+ data1 = bytes(str(HAMLET_SCENE, "ascii").swapcase(), "ascii")
c0 = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
bufs0 = []
bufs0.append(c0.compress(data0))
@@ -300,11 +300,11 @@ class CompressObjectTestCase(unittest.TestCase):
bufs0.append(c0.compress(data0))
bufs0.append(c0.flush())
- s0 = ''.join(bufs0)
+ s0 = b''.join(bufs0)
bufs1.append(c1.compress(data1))
bufs1.append(c1.flush())
- s1 = ''.join(bufs1)
+ s1 = b''.join(bufs1)
self.assertEqual(zlib.decompress(s0),data0+data0)
self.assertEqual(zlib.decompress(s1),data0+data1)
@@ -330,10 +330,10 @@ class CompressObjectTestCase(unittest.TestCase):
bufs1 = bufs0[:]
bufs0.append(d0.decompress(comp[32:]))
- s0 = ''.join(bufs0)
+ s0 = b''.join(bufs0)
bufs1.append(d1.decompress(comp[32:]))
- s1 = ''.join(bufs1)
+ s1 = b''.join(bufs1)
self.assertEqual(s0,s1)
self.assertEqual(s0,data)
@@ -353,11 +353,10 @@ def genblock(seed, length, step=1024, generator=random):
randint = generator.randint
if length < step or step < 2:
step = length
- blocks = []
+ blocks = bytes()
for i in range(0, length, step):
- blocks.append(''.join([chr(randint(0,255))
- for x in range(step)]))
- return ''.join(blocks)[:length]
+ blocks += bytes(randint(0, 255) for x in range(step))
+ return blocks
@@ -370,7 +369,7 @@ def choose_lines(source, number, seed=None, generator=random):
-HAMLET_SCENE = """
+HAMLET_SCENE = b"""
LAERTES
O, fear me not.
@@ -444,4 +443,5 @@ def test_main():
)
if __name__ == "__main__":
- test_main()
+ unittest.main() # XXX
+ ###test_main()
diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c
index da31e8b..51395a2 100644
--- a/Modules/zlibmodule.c
+++ b/Modules/zlibmodule.c
@@ -96,12 +96,12 @@ newcompobject(PyTypeObject *type)
if (self == NULL)
return NULL;
self->is_initialised = 0;
- self->unused_data = PyString_FromString("");
+ self->unused_data = PyBytes_FromStringAndSize("", 0);
if (self->unused_data == NULL) {
Py_DECREF(self);
return NULL;
}
- self->unconsumed_tail = PyString_FromString("");
+ self->unconsumed_tail = PyBytes_FromStringAndSize("", 0);
if (self->unconsumed_tail == NULL) {
Py_DECREF(self);
return NULL;
@@ -174,8 +174,8 @@ PyZlib_compress(PyObject *self, PyObject *args)
err=deflateEnd(&zst);
if (err == Z_OK)
- ReturnVal = PyString_FromStringAndSize((char *)output,
- zst.total_out);
+ ReturnVal = PyBytes_FromStringAndSize((char *)output,
+ zst.total_out);
else
zlib_error(zst, err, "while finishing compression");
@@ -210,12 +210,12 @@ PyZlib_decompress(PyObject *self, PyObject *args)
zst.avail_in = length;
zst.avail_out = r_strlen;
- if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen)))
+ if (!(result_str = PyBytes_FromStringAndSize(NULL, r_strlen)))
return NULL;
zst.zalloc = (alloc_func)NULL;
zst.zfree = (free_func)Z_NULL;
- zst.next_out = (Byte *)PyString_AS_STRING(result_str);
+ zst.next_out = (Byte *)PyBytes_AS_STRING(result_str);
zst.next_in = (Byte *)input;
err = inflateInit2(&zst, wsize);
@@ -255,12 +255,12 @@ PyZlib_decompress(PyObject *self, PyObject *args)
/* fall through */
case(Z_OK):
/* need more memory */
- if (_PyString_Resize(&result_str, r_strlen << 1) < 0) {
+ if (PyBytes_Resize(result_str, r_strlen << 1) < 0) {
inflateEnd(&zst);
goto error;
}
- zst.next_out = (unsigned char *)PyString_AS_STRING(result_str) \
- + r_strlen;
+ zst.next_out =
+ (unsigned char *)PyBytes_AS_STRING(result_str) + r_strlen;
zst.avail_out = r_strlen;
r_strlen = r_strlen << 1;
break;
@@ -277,7 +277,9 @@ PyZlib_decompress(PyObject *self, PyObject *args)
goto error;
}
- _PyString_Resize(&result_str, zst.total_out);
+ if (PyBytes_Resize(result_str, zst.total_out) < 0)
+ goto error;
+
return result_str;
error:
@@ -399,7 +401,7 @@ PyZlib_objcompress(compobject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "s#:compress", &input, &inplen))
return NULL;
- if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
+ if (!(RetVal = PyBytes_FromStringAndSize(NULL, length)))
return NULL;
ENTER_ZLIB
@@ -408,7 +410,7 @@ PyZlib_objcompress(compobject *self, PyObject *args)
self->zst.avail_in = inplen;
self->zst.next_in = input;
self->zst.avail_out = length;
- self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
+ self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Py_BEGIN_ALLOW_THREADS
err = deflate(&(self->zst), Z_NO_FLUSH);
@@ -417,10 +419,13 @@ PyZlib_objcompress(compobject *self, PyObject *args)
/* while Z_OK and the output buffer is full, there might be more output,
so extend the output buffer and try again */
while (err == Z_OK && self->zst.avail_out == 0) {
- if (_PyString_Resize(&RetVal, length << 1) < 0)
+ if (PyBytes_Resize(RetVal, length << 1) < 0) {
+ Py_DECREF(RetVal);
+ RetVal = NULL;
goto error;
- self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
- + length;
+ }
+ self->zst.next_out =
+ (unsigned char *)PyBytes_AS_STRING(RetVal) + length;
self->zst.avail_out = length;
length = length << 1;
@@ -439,7 +444,10 @@ PyZlib_objcompress(compobject *self, PyObject *args)
RetVal = NULL;
goto error;
}
- _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
+ if (PyBytes_Resize(RetVal, self->zst.total_out - start_total_out) < 0) {
+ Py_DECREF(RetVal);
+ RetVal = NULL;
+ }
error:
LEAVE_ZLIB
@@ -478,7 +486,7 @@ PyZlib_objdecompress(compobject *self, PyObject *args)
/* limit amount of data allocated to max_length */
if (max_length && length > max_length)
length = max_length;
- if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
+ if (!(RetVal = PyBytes_FromStringAndSize(NULL, length)))
return NULL;
ENTER_ZLIB
@@ -487,7 +495,7 @@ PyZlib_objdecompress(compobject *self, PyObject *args)
self->zst.avail_in = inplen;
self->zst.next_in = input;
self->zst.avail_out = length;
- self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
+ self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Py_BEGIN_ALLOW_THREADS
err = inflate(&(self->zst), Z_SYNC_FLUSH);
@@ -509,10 +517,13 @@ PyZlib_objdecompress(compobject *self, PyObject *args)
if (max_length && length > max_length)
length = max_length;
- if (_PyString_Resize(&RetVal, length) < 0)
+ if (PyBytes_Resize(RetVal, length) < 0) {
+ Py_DECREF(RetVal);
+ RetVal = NULL;
goto error;
- self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
- + old_length;
+ }
+ self->zst.next_out =
+ (unsigned char *)PyBytes_AS_STRING(RetVal) + old_length;
self->zst.avail_out = length - old_length;
Py_BEGIN_ALLOW_THREADS
@@ -524,7 +535,7 @@ PyZlib_objdecompress(compobject *self, PyObject *args)
of specified size. Return the unconsumed tail in an attribute.*/
if(max_length) {
Py_DECREF(self->unconsumed_tail);
- self->unconsumed_tail = PyString_FromStringAndSize((char *)self->zst.next_in,
+ self->unconsumed_tail = PyBytes_FromStringAndSize((char *)self->zst.next_in,
self->zst.avail_in);
if(!self->unconsumed_tail) {
Py_DECREF(RetVal);
@@ -541,7 +552,7 @@ PyZlib_objdecompress(compobject *self, PyObject *args)
*/
if (err == Z_STREAM_END) {
Py_XDECREF(self->unused_data); /* Free original empty string */
- self->unused_data = PyString_FromStringAndSize(
+ self->unused_data = PyBytes_FromStringAndSize(
(char *)self->zst.next_in, self->zst.avail_in);
if (self->unused_data == NULL) {
Py_DECREF(RetVal);
@@ -558,7 +569,10 @@ PyZlib_objdecompress(compobject *self, PyObject *args)
goto error;
}
- _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
+ if (PyBytes_Resize(RetVal, self->zst.total_out - start_total_out) < 0) {
+ Py_DECREF(RetVal);
+ RetVal = NULL;
+ }
error:
LEAVE_ZLIB
@@ -588,10 +602,10 @@ PyZlib_flush(compobject *self, PyObject *args)
/* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
doing any work at all; just return an empty string. */
if (flushmode == Z_NO_FLUSH) {
- return PyString_FromStringAndSize(NULL, 0);
+ return PyBytes_FromStringAndSize(NULL, 0);
}
- if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
+ if (!(RetVal = PyBytes_FromStringAndSize(NULL, length)))
return NULL;
ENTER_ZLIB
@@ -599,7 +613,7 @@ PyZlib_flush(compobject *self, PyObject *args)
start_total_out = self->zst.total_out;
self->zst.avail_in = 0;
self->zst.avail_out = length;
- self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
+ self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Py_BEGIN_ALLOW_THREADS
err = deflate(&(self->zst), flushmode);
@@ -608,10 +622,13 @@ PyZlib_flush(compobject *self, PyObject *args)
/* while Z_OK and the output buffer is full, there might be more output,
so extend the output buffer and try again */
while (err == Z_OK && self->zst.avail_out == 0) {
- if (_PyString_Resize(&RetVal, length << 1) < 0)
+ if (PyBytes_Resize(RetVal, length << 1) < 0) {
+ Py_DECREF(RetVal);
+ RetVal = NULL;
goto error;
- self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
- + length;
+ }
+ self->zst.next_out =
+ (unsigned char *)PyBytes_AS_STRING(RetVal) + length;
self->zst.avail_out = length;
length = length << 1;
@@ -645,7 +662,10 @@ PyZlib_flush(compobject *self, PyObject *args)
goto error;
}
- _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
+ if (PyBytes_Resize(RetVal, self->zst.total_out - start_total_out) < 0) {
+ Py_DECREF(RetVal);
+ RetVal = NULL;
+ }
error:
LEAVE_ZLIB
@@ -773,7 +793,7 @@ PyZlib_unflush(compobject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "|i:flush", &length))
return NULL;
- if (!(retval = PyString_FromStringAndSize(NULL, length)))
+ if (!(retval = PyBytes_FromStringAndSize(NULL, length)))
return NULL;
@@ -781,7 +801,7 @@ PyZlib_unflush(compobject *self, PyObject *args)
start_total_out = self->zst.total_out;
self->zst.avail_out = length;
- self->zst.next_out = (Byte *)PyString_AS_STRING(retval);
+ self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval);
Py_BEGIN_ALLOW_THREADS
err = inflate(&(self->zst), Z_FINISH);
@@ -790,9 +810,12 @@ PyZlib_unflush(compobject *self, PyObject *args)
/* while Z_OK and the output buffer is full, there might be more output,
so extend the output buffer and try again */
while ((err == Z_OK || err == Z_BUF_ERROR) && self->zst.avail_out == 0) {
- if (_PyString_Resize(&retval, length << 1) < 0)
+ if (PyBytes_Resize(retval, length << 1) < 0) {
+ Py_DECREF(retval);
+ retval = NULL;
goto error;
- self->zst.next_out = (Byte *)PyString_AS_STRING(retval) + length;
+ }
+ self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval) + length;
self->zst.avail_out = length;
length = length << 1;
@@ -814,7 +837,10 @@ PyZlib_unflush(compobject *self, PyObject *args)
goto error;
}
}
- _PyString_Resize(&retval, self->zst.total_out - start_total_out);
+ if (PyBytes_Resize(retval, self->zst.total_out - start_total_out) < 0) {
+ Py_DECREF(retval);
+ retval = NULL;
+ }
error: