From 274bb24efdbeed0ab1a91f3c02f86551ef16eac7 Mon Sep 17 00:00:00 2001 From: Ulrik Sverdrup Date: Wed, 24 Jun 2015 16:22:09 +0200 Subject: [PATCH] StrSearcher: Explicitly separate the long and short cases This is needed to not drop performance, after the trait-based changes. Force separate versions of the next method to be generated for the short and long period cases. --- src/libcore/str/pattern.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/libcore/str/pattern.rs b/src/libcore/str/pattern.rs index 6d68615a8cfd..dccdaa9120d1 100644 --- a/src/libcore/str/pattern.rs +++ b/src/libcore/str/pattern.rs @@ -628,7 +628,7 @@ unsafe impl<'a, 'b> Searcher<'a> for StrSearcher<'a, 'b> { } } - #[inline] + #[inline(always)] fn next_match(&mut self) -> Option<(usize, usize)> { match self.searcher { StrSearcherImpl::Empty(..) => { @@ -642,9 +642,15 @@ unsafe impl<'a, 'b> Searcher<'a> for StrSearcher<'a, 'b> { } StrSearcherImpl::TwoWay(ref mut searcher) => { let is_long = searcher.memory == usize::MAX; - searcher.next::(self.haystack.as_bytes(), - self.needle.as_bytes(), - is_long) + if is_long { + searcher.next::(self.haystack.as_bytes(), + self.needle.as_bytes(), + true) + } else { + searcher.next::(self.haystack.as_bytes(), + self.needle.as_bytes(), + false) + } } } } @@ -854,7 +860,7 @@ impl TwoWaySearcher { // left to right. If v matches, we try to match u by scanning right to left. // How far we can jump when we encounter a mismatch is all based on the fact // that (u, v) is a critical factorization for the needle. - #[inline] + #[inline(always)] fn next(&mut self, haystack: &[u8], needle: &[u8], long_period: bool) -> S::Output where S: TwoWayStrategy