Skip to content

Commit 6f54eb1

Browse files
authored
Merge pull request RustPython#3577 from gilteunchoi/zlib_fix
Arguments wrapping in zlib functions
2 parents 05cf41f + 600e924 commit 6f54eb1

File tree

2 files changed

+27
-14
lines changed

2 files changed

+27
-14
lines changed

Lib/test/test_zlib.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,6 @@ def test_speech(self):
167167
x = zlib.compress(HAMLET_SCENE)
168168
self.assertEqual(zlib.decompress(x), HAMLET_SCENE)
169169

170-
# TODO: RUSTPYTHON
171-
@unittest.expectedFailure
172170
def test_keywords(self):
173171
x = zlib.compress(HAMLET_SCENE, level=3)
174172
self.assertEqual(zlib.decompress(x), HAMLET_SCENE)

stdlib/src/zlib.rs

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ mod zlib {
55
use crate::common::lock::PyMutex;
66
use crate::vm::{
77
builtins::{PyBaseExceptionRef, PyBytes, PyBytesRef, PyIntRef, PyTypeRef},
8-
function::{ArgBytesLike, OptionalArg},
8+
function::{ArgBytesLike, OptionalArg, OptionalOption},
99
IntoPyRef, PyResult, PyValue, VirtualMachine,
1010
};
1111
use adler32::RollingAdler32 as Adler32;
@@ -90,14 +90,21 @@ mod zlib {
9090
}
9191
}
9292

93+
#[derive(FromArgs)]
94+
struct PyFuncCompressArgs {
95+
#[pyarg(positional)]
96+
data: ArgBytesLike,
97+
#[pyarg(any, optional)]
98+
level: OptionalOption<i32>,
99+
}
100+
93101
/// Returns a bytes object containing compressed data.
94102
#[pyfunction]
95-
fn compress(
96-
data: ArgBytesLike,
97-
level: OptionalArg<i32>,
98-
vm: &VirtualMachine,
99-
) -> PyResult<PyBytesRef> {
100-
let compression = compression_from_int(level.into_option())
103+
fn compress(args: PyFuncCompressArgs, vm: &VirtualMachine) -> PyResult<PyBytesRef> {
104+
let data = args.data;
105+
let level = args.level;
106+
107+
let compression = compression_from_int(level.flatten())
101108
.ok_or_else(|| new_zlib_error("Bad compression level", vm))?;
102109

103110
let mut encoder = ZlibEncoder::new(Vec::new(), compression);
@@ -223,14 +230,22 @@ mod zlib {
223230
}
224231
}
225232

226-
/// Returns a bytes object containing the uncompressed data.
227-
#[pyfunction]
228-
fn decompress(
233+
#[derive(FromArgs)]
234+
struct PyFuncDecompressArgs {
235+
#[pyarg(positional)]
229236
data: ArgBytesLike,
237+
#[pyarg(any, optional)]
230238
wbits: OptionalArg<i8>,
239+
#[pyarg(any, optional)]
231240
bufsize: OptionalArg<usize>,
232-
vm: &VirtualMachine,
233-
) -> PyResult<Vec<u8>> {
241+
}
242+
243+
/// Returns a bytes object containing the uncompressed data.
244+
#[pyfunction]
245+
fn decompress(arg: PyFuncDecompressArgs, vm: &VirtualMachine) -> PyResult<Vec<u8>> {
246+
let data = arg.data;
247+
let wbits = arg.wbits;
248+
let bufsize = arg.bufsize;
234249
data.with_ref(|data| {
235250
let bufsize = bufsize.unwrap_or(DEF_BUF_SIZE);
236251

0 commit comments

Comments
 (0)