Skip to content

Commit 559c596

Browse files
authored
Merge pull request RustPython#1859 from youknowone/strbytes-mul
Fix {str,bytes}.__mul__
2 parents 09bc3dd + 203bbc9 commit 559c596

File tree

2 files changed

+7
-18
lines changed

2 files changed

+7
-18
lines changed

vm/src/obj/objbytes.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -421,13 +421,12 @@ impl PyBytes {
421421
}
422422

423423
#[pymethod(name = "__mul__")]
424-
fn repeat(&self, n: isize) -> PyBytes {
425-
self.inner.repeat(n).into()
426-
}
427-
428424
#[pymethod(name = "__rmul__")]
429-
fn rmul(&self, n: isize) -> PyBytes {
430-
self.repeat(n)
425+
fn repeat(&self, value: isize, vm: &VirtualMachine) -> PyResult<PyBytes> {
426+
if value > 0 && self.inner.len() as isize > std::isize::MAX / value {
427+
return Err(vm.new_overflow_error("repeated bytes are too long".to_owned()));
428+
}
429+
Ok(self.inner.repeat(value).into())
431430
}
432431

433432
fn do_cformat(

vm/src/obj/objstr.rs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -332,19 +332,9 @@ impl PyString {
332332
}
333333

334334
#[pymethod(name = "__mul__")]
335-
fn mul(&self, multiplier: isize, vm: &VirtualMachine) -> PyResult<String> {
336-
multiplier
337-
.max(0)
338-
.to_usize()
339-
.map(|multiplier| self.value.repeat(multiplier))
340-
.ok_or_else(|| {
341-
vm.new_overflow_error("cannot fit 'int' into an index-sized integer".to_owned())
342-
})
343-
}
344-
345335
#[pymethod(name = "__rmul__")]
346-
fn rmul(&self, val: isize, vm: &VirtualMachine) -> PyResult<String> {
347-
self.mul(val, vm)
336+
fn mul(&self, value: isize) -> String {
337+
self.value.repeat(value.max(0) as usize)
348338
}
349339

350340
#[pymethod(name = "__str__")]

0 commit comments

Comments
 (0)