Skip to content

Commit 3498a52

Browse files
authored
Merge pull request RustPython#1808 from youknowone/str-splitlines
Fix str.splitlines() for \r
2 parents 3d07a73 + 967952d commit 3498a52

File tree

2 files changed

+6
-4
lines changed

2 files changed

+6
-4
lines changed

Lib/test/string_tests.py

-2
Original file line numberDiff line numberDiff line change
@@ -946,8 +946,6 @@ def test_title(self):
946946
self.checkequal('Getint', "getInt", 'title')
947947
self.checkraises(TypeError, 'hello', 'title', 42)
948948

949-
# TODO: RUSTPYTHON
950-
@unittest.expectedFailure
951949
def test_splitlines(self):
952950
self.checkequal(['abc', 'def', '', 'ghi'], "abc\ndef\n\rghi", 'splitlines')
953951
self.checkequal(['abc', 'def', '', 'ghi'], "abc\ndef\n\r\nghi", 'splitlines')

vm/src/obj/objstr.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -803,11 +803,15 @@ impl PyString {
803803
let keepends = args.keepends.unwrap_or(false);
804804
let mut elements = vec![];
805805
let mut curr = "".to_owned();
806-
for ch in self.value.chars() {
807-
if ch == '\n' {
806+
let mut chars = self.value.chars().peekable();
807+
while let Some(ch) = chars.next() {
808+
if ch == '\n' || ch == '\r' {
808809
if keepends {
809810
curr.push(ch);
810811
}
812+
if ch == '\r' && chars.peek() == Some(&'\n') {
813+
continue;
814+
}
811815
elements.push(vm.ctx.new_str(curr.clone()));
812816
curr.clear();
813817
} else {

0 commit comments

Comments
 (0)