Skip to content

Commit e0431c0

Browse files
Merge pull request #1243 from mpajkowski/zlib_module
Implement zlib module
2 parents c7bee80 + 7b4a360 commit e0431c0

5 files changed

Lines changed: 298 additions & 0 deletions

File tree

Cargo.lock

Lines changed: 76 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/snippets/stdlib_zlib.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import zlib
2+
from testutils import assert_raises
3+
4+
# checksum functions
5+
assert zlib.crc32(b"123") == 2286445522
6+
assert zlib.crc32(b"123", 1) == 2307525093
7+
assert zlib.crc32(b"123", 2) == 2345449404
8+
assert zlib.crc32(b"123", 3) == 2316230027
9+
assert zlib.crc32(b"123", 4) == 2403453710
10+
assert zlib.crc32(b"123", 5) == 2390991161
11+
assert zlib.crc32(b"123", 6) == 2361728864
12+
assert zlib.crc32(b"123", -123) == 3515918521
13+
assert zlib.crc32(b"123", -122) == 3554023136
14+
assert zlib.crc32(b"123", -121) == 3524558039
15+
assert zlib.crc32(b"123", -120) == 3645389802
16+
assert zlib.crc32(b"123", -119) == 3632943581
17+
assert zlib.crc32(b"123", -118) == 3670863748
18+
assert zlib.crc32(b"123") == zlib.crc32(b"123", 0)
19+
20+
assert zlib.adler32(b"456") == 20906144
21+
assert zlib.adler32(b"456", 1) == 20906144
22+
assert zlib.adler32(b"456", 2) == 21102753
23+
assert zlib.adler32(b"456", 3) == 21299362
24+
assert zlib.adler32(b"456", 4) == 21495971
25+
assert zlib.adler32(b"456", 5) == 21692580
26+
assert zlib.adler32(b"456", 6) == 21889189
27+
assert zlib.adler32(b"456", -123) == 393267
28+
assert zlib.adler32(b"456", -122) == 589876
29+
assert zlib.adler32(b"456", -121) == 786485
30+
assert zlib.adler32(b"456", -120) == 983094
31+
assert zlib.adler32(b"456", -119) == 1179703
32+
assert zlib.adler32(b"456", -118) == 1376312
33+
assert zlib.adler32(b"456") == zlib.adler32(b"456", 1)
34+
35+
# compression
36+
lorem = bytes("Lorem ipsum dolor sit amet", "utf-8")
37+
38+
compressed_lorem_list = [
39+
b"x\x01\x01\x1a\x00\xe5\xffLorem ipsum dolor sit amet\x83\xd5\t\xc5",
40+
b"x\x01\xf3\xc9/J\xcdU\xc8,(.\xcdUH\xc9\xcf\xc9/R(\xce,QH\xccM-\x01\x00\x83\xd5\t\xc5",
41+
b"x^\xf3\xc9/J\xcdU\xc8,(.\xcdUH\xc9\xcf\xc9/R(\xce,QH\xccM-\x01\x00\x83\xd5\t\xc5",
42+
b"x^\xf3\xc9/J\xcdU\xc8,(.\xcdUH\xc9\xcf\xc9/R(\xce,QH\xccM-\x01\x00\x83\xd5\t\xc5",
43+
b"x^\xf3\xc9/J\xcdU\xc8,(.\xcdUH\xc9\xcf\xc9/R(\xce,QH\xccM-\x01\x00\x83\xd5\t\xc5",
44+
b"x^\xf3\xc9/J\xcdU\xc8,(.\xcdUH\xc9\xcf\xc9/R(\xce,QH\xccM-\x01\x00\x83\xd5\t\xc5",
45+
b"x\x9c\xf3\xc9/J\xcdU\xc8,(.\xcdUH\xc9\xcf\xc9/R(\xce,QH\xccM-\x01\x00\x83\xd5\t\xc5",
46+
b"x\xda\xf3\xc9/J\xcdU\xc8,(.\xcdUH\xc9\xcf\xc9/R(\xce,QH\xccM-\x01\x00\x83\xd5\t\xc5",
47+
b"x\xda\xf3\xc9/J\xcdU\xc8,(.\xcdUH\xc9\xcf\xc9/R(\xce,QH\xccM-\x01\x00\x83\xd5\t\xc5",
48+
b"x\xda\xf3\xc9/J\xcdU\xc8,(.\xcdUH\xc9\xcf\xc9/R(\xce,QH\xccM-\x01\x00\x83\xd5\t\xc5",
49+
]
50+
51+
for level, text in enumerate(compressed_lorem_list):
52+
assert zlib.compress(lorem, level) == text
53+
54+
# default level
55+
assert zlib.compress(lorem) == zlib.compress(lorem, -1) == zlib.compress(lorem, 6)
56+
57+
# decompression
58+
for text in compressed_lorem_list:
59+
assert zlib.decompress(text) == lorem
60+
61+
assert_raises(zlib.error, lambda: zlib.compress(b"123", -40))
62+
assert_raises(zlib.error, lambda: zlib.compress(b"123", 10))

vm/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,5 +72,9 @@ flamer = { version = "0.3", optional = true }
7272
pwd = "1"
7373

7474
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
75+
crc32fast = "1.2.0"
76+
adler32 = "1.0.3"
77+
flate2 = { version = "1.0", features = ["zlib"], default-features = false }
78+
libz-sys = "1.0.25"
7579
gethostname = "0.2.0"
7680
subprocess = "0.1.18"

vm/src/stdlib/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ mod pwd;
4343
pub mod signal;
4444
#[cfg(not(target_arch = "wasm32"))]
4545
mod subprocess;
46+
#[cfg(not(target_arch = "wasm32"))]
47+
mod zlib;
4648

4749
use crate::pyobject::PyObjectRef;
4850

@@ -99,6 +101,7 @@ pub fn get_module_inits() -> HashMap<String, StdlibInitFunc> {
99101
modules.insert("socket".to_string(), Box::new(socket::make_module));
100102
modules.insert("signal".to_string(), Box::new(signal::make_module));
101103
modules.insert("subprocess".to_string(), Box::new(subprocess::make_module));
104+
modules.insert("zlib".to_string(), Box::new(zlib::make_module));
102105
}
103106

104107
// Unix-only

0 commit comments

Comments
 (0)