Skip to content

Commit 234c015

Browse files
committed
PySliceableSequence for PyString reuse len cache
1 parent 04d0ee8 commit 234c015

File tree

1 file changed

+15
-13
lines changed

1 file changed

+15
-13
lines changed

vm/src/obj/objstr.rs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ impl PyString {
253253
}
254254
}
255255
SequenceIndex::Slice(slice) => {
256-
let string = self.value.get_slice_items(vm, &slice)?;
256+
let string = self.get_slice_items(vm, &slice)?;
257257
Ok(vm.new_str(string))
258258
}
259259
}
@@ -1206,38 +1206,40 @@ pub fn borrow_value(obj: &PyObjectRef) -> &str {
12061206
&obj.payload::<PyString>().unwrap().value
12071207
}
12081208

1209-
impl PySliceableSequence for str {
1209+
impl PySliceableSequence for PyString {
12101210
type Sliced = String;
12111211

12121212
fn do_slice(&self, range: Range<usize>) -> Self::Sliced {
1213-
self.chars()
1213+
self.value
1214+
.chars()
12141215
.skip(range.start)
12151216
.take(range.end - range.start)
12161217
.collect()
12171218
}
12181219

12191220
fn do_slice_reverse(&self, range: Range<usize>) -> Self::Sliced {
1220-
let count = self.chars().count();
1221-
1222-
self.chars()
1221+
let count = self.len();
1222+
self.value
1223+
.chars()
12231224
.rev()
12241225
.skip(count - range.end)
12251226
.take(range.end - range.start)
12261227
.collect()
12271228
}
12281229

12291230
fn do_stepped_slice(&self, range: Range<usize>, step: usize) -> Self::Sliced {
1230-
self.chars()
1231+
self.value
1232+
.chars()
12311233
.skip(range.start)
12321234
.take(range.end - range.start)
12331235
.step_by(step)
12341236
.collect()
12351237
}
12361238

12371239
fn do_stepped_slice_reverse(&self, range: Range<usize>, step: usize) -> Self::Sliced {
1238-
let count = self.chars().count();
1239-
1240-
self.chars()
1240+
let count = self.len();
1241+
self.value
1242+
.chars()
12411243
.rev()
12421244
.skip(count - range.end)
12431245
.take(range.end - range.start)
@@ -1246,15 +1248,15 @@ impl PySliceableSequence for str {
12461248
}
12471249

12481250
fn empty() -> Self::Sliced {
1249-
String::default()
1251+
String::new()
12501252
}
12511253

12521254
fn len(&self) -> usize {
1253-
self.chars().count()
1255+
self.len()
12541256
}
12551257

12561258
fn is_empty(&self) -> bool {
1257-
self.is_empty()
1259+
self.value.is_empty()
12581260
}
12591261
}
12601262

0 commit comments

Comments
 (0)