[pypy-commit] pypy zlib-copying: And now the same for compressobj...

Julian Berman pypy.commits at gmail.com
Tue Feb 5 08:56:02 EST 2019


Author: Julian Berman <Julian+Hg at GrayVines.com>
Branch: zlib-copying
Changeset: r95837:9b6800b03333
Date: 2019-02-05 14:12 +0100
http://bitbucket.org/pypy/pypy/changeset/9b6800b03333/

Log:	And now the same for compressobj...

diff --git a/pypy/module/zlib/interp_zlib.py b/pypy/module/zlib/interp_zlib.py
--- a/pypy/module/zlib/interp_zlib.py
+++ b/pypy/module/zlib/interp_zlib.py
@@ -138,15 +138,18 @@
                  method=rzlib.Z_DEFLATED,             # \
                  wbits=rzlib.MAX_WBITS,               #  \   undocumented
                  memLevel=rzlib.DEF_MEM_LEVEL,        #  /    parameters
-                 strategy=rzlib.Z_DEFAULT_STRATEGY):  # /
+                 strategy=rzlib.Z_DEFAULT_STRATEGY,   # /
+                 stream=None):
         ZLibObject.__init__(self, space)
-        try:
-            self.stream = rzlib.deflateInit(level, method, wbits,
-                                            memLevel, strategy)
-        except rzlib.RZlibError as e:
-            raise zlib_error(space, e.msg)
-        except ValueError:
-            raise oefmt(space.w_ValueError, "Invalid initialization option")
+        if stream is None:
+            try:
+                stream = rzlib.deflateInit(level, method, wbits,
+                                                memLevel, strategy)
+            except rzlib.RZlibError as e:
+                raise zlib_error(space, e.msg)
+            except ValueError:
+                raise oefmt(space.w_ValueError, "Invalid initialization option")
+        self.stream = stream
         self.register_finalizer(space)
 
     def _finalize_(self):
@@ -178,6 +181,17 @@
             raise zlib_error(space, e.msg)
         return space.newbytes(result)
 
+    def copy(self, space):
+        try:
+            self.lock()
+            try:
+                copied = rzlib.deflateCopy(self.stream)
+            finally:
+                self.unlock()
+        except rzlib.RZlibError as e:
+            raise zlib_error(space, e.msg)
+        return Compress(space=space, stream=copied)
+
     @unwrap_spec(mode="c_int")
     def flush(self, space, mode=rzlib.Z_FINISH):
         """
@@ -228,6 +242,7 @@
 Compress.typedef = TypeDef(
     'Compress',
     __new__ = interp2app(Compress___new__),
+    copy = interp2app(Compress.copy),
     compress = interp2app(Compress.compress),
     flush = interp2app(Compress.flush),
     __doc__ = """compressobj([level]) -- Return a compressor object.
@@ -266,7 +281,6 @@
                 raise zlib_error(space, e.msg)
             except ValueError:
                 raise oefmt(space.w_ValueError, "Invalid initialization option")
-        self.space = space
         self.stream = stream
         self.unused_data = unused_data
         self.unconsumed_tail = unconsumed_tail
@@ -330,7 +344,7 @@
             raise zlib_error(space, e.msg)
 
         return Decompress(
-            space=self.space,
+            space=space,
             stream=copied,
             # unused_data=self.unused_data,
             # unconsumed_tail=self.unconsumed_tail,
diff --git a/pypy/module/zlib/test/test_zlib.py b/pypy/module/zlib/test/test_zlib.py
--- a/pypy/module/zlib/test/test_zlib.py
+++ b/pypy/module/zlib/test/test_zlib.py
@@ -311,3 +311,20 @@
         decompressor = self.zlib.decompressobj()
         self.intentionally_break_a_z_stream(zobj=decompressor)
         raises(self.zlib.error, decompressor.copy)
+
+    def test_compress_copy(self):
+        compressor = self.zlib.compressobj()
+        d1 = compressor.compress(self.expanded[:10])
+        assert d1
+
+        copied = compressor.copy()
+
+        from_copy = copied.compress(self.expanded[10:])
+        from_compressor = compressor.compress(self.expanded[10:])
+
+        assert (d1 + from_copy) == (d1 + from_compressor)
+
+    def test_unsuccessful_compress_copy(self):
+        compressor = self.zlib.compressobj()
+        self.intentionally_break_a_z_stream(zobj=compressor)
+        raises(self.zlib.error, compressor.copy)


More information about the pypy-commit mailing list