From 76ceb59b2ba915c8c33e622e346261a20d9eabe7 Mon Sep 17 00:00:00 2001 From: Moreal Date: Wed, 29 Sep 2021 01:13:08 +0900 Subject: [PATCH] Fix `PyStr::startswith` --- vm/src/anystr.rs | 6 +++--- vm/src/builtins/pystr.rs | 4 ++++ vm/src/bytesinner.rs | 4 ++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/vm/src/anystr.rs b/vm/src/anystr.rs index e8de731e6c..59bed317a9 100644 --- a/vm/src/anystr.rs +++ b/vm/src/anystr.rs @@ -145,7 +145,7 @@ pub trait AnyStr<'s>: 's { // FIXME: get_chars is expensive for str fn get_chars(&self, range: std::ops::Range) -> &Self; fn bytes_len(&self) -> usize; - // fn chars_len(&self) -> usize; // cannot access to cache here + fn chars_len(&self) -> usize; // cannot access to cache here fn is_empty(&self) -> bool; fn py_add(&self, other: &Self) -> Self::Container { @@ -201,11 +201,11 @@ pub trait AnyStr<'s>: 's { T: TryFromObject, F: Fn(&Self, &T) -> bool, { - let (affix, range) = args.get_value(self.bytes_len()); + let (affix, range) = args.get_value(self.chars_len()); if !range.is_normal() { return Ok(false); } - let value = self.get_bytes(range); + let value = self.get_chars(range); single_or_tuple_any( affix, &|s: &T| Ok(func(value, s)), diff --git a/vm/src/builtins/pystr.rs b/vm/src/builtins/pystr.rs index ec3ea2ae73..64c46d20e5 100644 --- a/vm/src/builtins/pystr.rs +++ b/vm/src/builtins/pystr.rs @@ -1645,6 +1645,10 @@ impl<'s> AnyStr<'s> for str { Self::len(self) } + fn chars_len(&self) -> usize { + self.chars().count() + } + fn py_split_whitespace(&self, maxsplit: isize, convert: F) -> Vec where F: Fn(&Self) -> PyObjectRef, diff --git a/vm/src/bytesinner.rs b/vm/src/bytesinner.rs index 61c391710d..8becd55929 100644 --- a/vm/src/bytesinner.rs +++ b/vm/src/bytesinner.rs @@ -1073,6 +1073,10 @@ impl<'s> AnyStr<'s> for [u8] { Self::len(self) } + fn chars_len(&self) -> usize { + Self::len(self) + } + fn py_split_whitespace(&self, maxsplit: isize, convert: F) -> Vec where F: Fn(&Self) -> PyObjectRef,