Skip to content

Commit 7b4a360

Browse files
committed
Rewrite crc32, adler32 from zlib
Get rid of checksum_fn macro
1 parent 49f53bf commit 7b4a360

File tree

1 file changed

+41
-38
lines changed

1 file changed

+41
-38
lines changed

vm/src/stdlib/zlib.rs

Lines changed: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -35,46 +35,49 @@ pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {
3535
})
3636
}
3737

38-
macro_rules! checksum_fn {
39-
($fn_name: ident, $h_new: expr, $h_update: expr, $h_compute: expr, $begin_state: expr) => {
40-
fn $fn_name(
41-
data: PyBytesRef,
42-
begin_state: OptionalArg<PyIntRef>,
43-
vm: &VirtualMachine,
44-
) -> PyResult<PyObjectRef> {
45-
let data = data.get_value();
46-
47-
let begin_state = begin_state
48-
.into_option()
49-
.as_ref()
50-
.map(|v| v.as_bigint().to_i32().unwrap())
51-
.unwrap_or($begin_state);
52-
53-
let mut hasher = $h_new(begin_state as u32);
54-
$h_update(&mut hasher, &data);
55-
56-
let checksum: u32 = $h_compute(hasher);
57-
58-
Ok(vm.new_int(checksum))
59-
}
60-
};
38+
/// Compute an Adler-32 checksum of data.
39+
fn zlib_adler32(
40+
data: PyBytesRef,
41+
begin_state: OptionalArg<PyIntRef>,
42+
vm: &VirtualMachine,
43+
) -> PyResult<PyObjectRef> {
44+
let data = data.get_value();
45+
46+
let begin_state = begin_state
47+
.into_option()
48+
.as_ref()
49+
.map(|v| v.as_bigint().to_i32().unwrap())
50+
.unwrap_or(1);
51+
52+
let mut hasher = Adler32::from_value(begin_state as u32);
53+
hasher.update_buffer(data);
54+
55+
let checksum: u32 = hasher.hash();
56+
57+
Ok(vm.new_int(checksum))
6158
}
6259

63-
checksum_fn!(
64-
zlib_adler32,
65-
|value| Adler32::from_value(value),
66-
|hasher: &mut Adler32, buffer| hasher.update_buffer(buffer),
67-
|hasher: Adler32| hasher.hash(),
68-
1
69-
);
70-
71-
checksum_fn!(
72-
zlib_crc32,
73-
|value| Crc32::new_with_initial(value),
74-
|hasher: &mut Crc32, buffer| hasher.update(buffer),
75-
|hasher: Crc32| hasher.finalize(),
76-
0
77-
);
60+
/// Compute a CRC-32 checksum of data.
61+
fn zlib_crc32(
62+
data: PyBytesRef,
63+
begin_state: OptionalArg<PyIntRef>,
64+
vm: &VirtualMachine,
65+
) -> PyResult<PyObjectRef> {
66+
let data = data.get_value();
67+
68+
let begin_state = begin_state
69+
.into_option()
70+
.as_ref()
71+
.map(|v| v.as_bigint().to_i32().unwrap())
72+
.unwrap_or(0);
73+
74+
let mut hasher = Crc32::new_with_initial(begin_state as u32);
75+
hasher.update(data);
76+
77+
let checksum: u32 = hasher.finalize();
78+
79+
Ok(vm.new_int(checksum))
80+
}
7881

7982
/// Returns a bytes object containing compressed data.
8083
fn zlib_compress(

0 commit comments

Comments
 (0)