From a3eb9a33da3dc87ffcfce8d6f8bfb84b8245a805 Mon Sep 17 00:00:00 2001 From: Jeong YunWon Date: Wed, 29 Apr 2020 03:03:58 +0900 Subject: [PATCH] pystr::get_chars --- vm/src/obj/objbyteinner.rs | 4 ++++ vm/src/obj/objstr.rs | 13 +++++++++++++ vm/src/obj/pystr.rs | 6 ++++-- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/vm/src/obj/objbyteinner.rs b/vm/src/obj/objbyteinner.rs index e27089697..e684e0fdc 100644 --- a/vm/src/obj/objbyteinner.rs +++ b/vm/src/obj/objbyteinner.rs @@ -1324,6 +1324,10 @@ impl PyCommonString for [u8] { &self[range] } + fn get_chars<'a>(&'a self, range: std::ops::Range) -> &'a Self { + &self[range] + } + fn is_empty(&self) -> bool { Self::is_empty(self) } diff --git a/vm/src/obj/objstr.rs b/vm/src/obj/objstr.rs index 474f20ca2..2fd535d59 100644 --- a/vm/src/obj/objstr.rs +++ b/vm/src/obj/objstr.rs @@ -1745,6 +1745,19 @@ impl PyCommonString for str { &self[range] } + fn get_chars<'a>(&'a self, range: std::ops::Range) -> &'a Self { + let mut chars = self.chars(); + for _ in 0..range.start { + let _ = chars.next(); + } + let start = chars.as_str(); + for _ in range { + let _ = chars.next(); + } + let end = chars.as_str(); + &start[..start.len() - end.len()] + } + fn is_empty(&self) -> bool { Self::is_empty(self) } diff --git a/vm/src/obj/pystr.rs b/vm/src/obj/pystr.rs index 2b9f05cc3..fba47558a 100644 --- a/vm/src/obj/pystr.rs +++ b/vm/src/obj/pystr.rs @@ -118,6 +118,8 @@ pub trait PyCommonString { fn with_capacity(capacity: usize) -> Self::Container; fn get_bytes<'a>(&'a self, range: std::ops::Range) -> &'a Self; + // FIXME: get_chars is expensive for str + fn get_chars<'a>(&'a self, range: std::ops::Range) -> &'a Self; fn bytes_len(&self) -> usize; fn chars_len(&self) -> usize; fn is_empty(&self) -> bool; @@ -216,7 +218,7 @@ pub trait PyCommonString { { if range.is_normal() { let start = range.start; - if let Some(index) = find(self.get_bytes(range), &needle) { + if let Some(index) = find(self.get_chars(range), &needle) { return Some(start + index); } } @@ -229,7 +231,7 @@ pub trait PyCommonString { F: Fn(&Self, &Self) -> usize, { if range.is_normal() { - count(self.get_bytes(range), &needle) + count(self.get_chars(range), &needle) } else { 0 }