Skip to content

Commit 223ac8c

Browse files
authored
Fix str.join returning new object when string argument length is 1 (RustPython#3845)
fix RustPython#3841
1 parent 523a0f9 commit 223ac8c

File tree

2 files changed

+9
-4
lines changed

2 files changed

+9
-4
lines changed

vm/src/anystr.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use crate::{
22
builtins::{PyIntRef, PyTupleRef},
33
cformat::CFormatString,
44
function::OptionalOption,
5-
protocol::PyIterIter,
65
AsObject, PyObject, PyObjectRef, PyResult, TryFromObject, VirtualMachine,
76
};
87
use num_traits::{cast::ToPrimitive, sign::Signed};
@@ -312,7 +311,9 @@ pub trait AnyStr<'s>: 's {
312311

313312
fn py_join<'a>(
314313
&self,
315-
mut iter: PyIterIter<'a, impl AnyStrWrapper<'s, Str = Self> + TryFromObject>,
314+
mut iter: impl std::iter::Iterator<
315+
Item = PyResult<impl AnyStrWrapper<'s, Str = Self> + TryFromObject>,
316+
>,
316317
) -> PyResult<Self::Container> {
317318
let mut joined = if let Some(elem) = iter.next() {
318319
elem?.as_ref().to_container()

vm/src/builtins/str.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -928,9 +928,13 @@ impl PyStr {
928928
}
929929

930930
#[pymethod]
931-
fn join(&self, iterable: ArgIterable<PyStrRef>, vm: &VirtualMachine) -> PyResult<String> {
931+
fn join(&self, iterable: ArgIterable<PyStrRef>, vm: &VirtualMachine) -> PyResult<PyStrRef> {
932932
let iter = iterable.iter(vm)?;
933-
self.as_str().py_join(iter)
933+
934+
match iter.exactly_one() {
935+
Ok(first) => first,
936+
Err(iter) => Ok(vm.ctx.new_str(self.as_str().py_join(iter)?)),
937+
}
934938
}
935939

936940
// FIXME: two traversals of str is expensive

0 commit comments

Comments
 (0)