Skip to content

Commit a3eb9a3

Browse files
committed
pystr::get_chars
1 parent 5899348 commit a3eb9a3

File tree

3 files changed

+21
-2
lines changed

3 files changed

+21
-2
lines changed

vm/src/obj/objbyteinner.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1324,6 +1324,10 @@ impl PyCommonString<u8> for [u8] {
13241324
&self[range]
13251325
}
13261326

1327+
fn get_chars<'a>(&'a self, range: std::ops::Range<usize>) -> &'a Self {
1328+
&self[range]
1329+
}
1330+
13271331
fn is_empty(&self) -> bool {
13281332
Self::is_empty(self)
13291333
}

vm/src/obj/objstr.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1745,6 +1745,19 @@ impl PyCommonString<char> for str {
17451745
&self[range]
17461746
}
17471747

1748+
fn get_chars<'a>(&'a self, range: std::ops::Range<usize>) -> &'a Self {
1749+
let mut chars = self.chars();
1750+
for _ in 0..range.start {
1751+
let _ = chars.next();
1752+
}
1753+
let start = chars.as_str();
1754+
for _ in range {
1755+
let _ = chars.next();
1756+
}
1757+
let end = chars.as_str();
1758+
&start[..start.len() - end.len()]
1759+
}
1760+
17481761
fn is_empty(&self) -> bool {
17491762
Self::is_empty(self)
17501763
}

vm/src/obj/pystr.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ pub trait PyCommonString<E> {
118118

119119
fn with_capacity(capacity: usize) -> Self::Container;
120120
fn get_bytes<'a>(&'a self, range: std::ops::Range<usize>) -> &'a Self;
121+
// FIXME: get_chars is expensive for str
122+
fn get_chars<'a>(&'a self, range: std::ops::Range<usize>) -> &'a Self;
121123
fn bytes_len(&self) -> usize;
122124
fn chars_len(&self) -> usize;
123125
fn is_empty(&self) -> bool;
@@ -216,7 +218,7 @@ pub trait PyCommonString<E> {
216218
{
217219
if range.is_normal() {
218220
let start = range.start;
219-
if let Some(index) = find(self.get_bytes(range), &needle) {
221+
if let Some(index) = find(self.get_chars(range), &needle) {
220222
return Some(start + index);
221223
}
222224
}
@@ -229,7 +231,7 @@ pub trait PyCommonString<E> {
229231
F: Fn(&Self, &Self) -> usize,
230232
{
231233
if range.is_normal() {
232-
count(self.get_bytes(range), &needle)
234+
count(self.get_chars(range), &needle)
233235
} else {
234236
0
235237
}

0 commit comments

Comments
 (0)