Skip to content

Commit 631e688

Browse files
committed
clean up escaped prefix tracking
1 parent 1899c09 commit 631e688

File tree

1 file changed

+12
-5
lines changed

1 file changed

+12
-5
lines changed

src/escape.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ impl fmt::Debug for UnescapedRoute {
108108
pub struct UnescapedRef<'a> {
109109
pub inner: &'a [u8],
110110
escaped: &'a [usize],
111+
// An offset applied to each escaped index.
111112
offset: isize,
112113
}
113114

@@ -116,9 +117,11 @@ impl<'a> UnescapedRef<'a> {
116117
pub fn to_owned(self) -> UnescapedRoute {
117118
let mut escaped = Vec::new();
118119
for &i in self.escaped {
119-
let i = i.wrapping_add_signed(-self.offset);
120-
if i < self.inner.len() {
121-
escaped.push(i);
120+
let i = i.checked_add_signed(self.offset);
121+
122+
match i {
123+
Some(i) if i < self.inner.len() => escaped.push(i),
124+
_ => {}
122125
}
123126
}
124127

@@ -130,15 +133,19 @@ impl<'a> UnescapedRef<'a> {
130133

131134
/// Returns true if the character at the given index was escaped.
132135
pub fn is_escaped(&self, i: usize) -> bool {
133-
self.escaped.contains(&(i.wrapping_add_signed(self.offset)))
136+
if let Some(i) = i.checked_add_signed(-self.offset) {
137+
return self.escaped.contains(&i);
138+
}
139+
140+
false
134141
}
135142

136143
/// Slices the route with `start..`.
137144
pub fn slice_off(&self, start: usize) -> UnescapedRef<'a> {
138145
UnescapedRef {
139146
inner: &self.inner[start..],
140147
escaped: self.escaped,
141-
offset: self.offset + (start as isize),
148+
offset: self.offset - (start as isize),
142149
}
143150
}
144151

0 commit comments

Comments
 (0)