refactor: Reduce unsafe blocks

This commit is contained in:
Kogia-sima 2020-11-21 18:39:29 +09:00
parent 82fb9f5469
commit 834289be59
4 changed files with 22 additions and 18 deletions

View File

@ -334,7 +334,7 @@ fn find_block_comment_end(haystack: &str) -> Option<usize> {
let mut depth = 1; let mut depth = 1;
while let Some(p) = memchr2(b'*', b'/', remain.as_bytes()) { while let Some(p) = memchr2(b'*', b'/', remain.as_bytes()) {
let c = unsafe { *remain.as_bytes().get_unchecked(p) }; let c = remain.as_bytes()[p];
let next = remain.as_bytes().get(p + 1); let next = remain.as_bytes().get(p + 1);
match (c, next) { match (c, next) {
@ -344,14 +344,14 @@ fn find_block_comment_end(haystack: &str) -> Option<usize> {
return Some(offset); return Some(offset);
} }
depth -= 1; depth -= 1;
remain = unsafe { remain.get_unchecked(p + 2..) }; remain = &remain[p + 2..];
} }
(b'/', Some(b'*')) => { (b'/', Some(b'*')) => {
depth += 1; depth += 1;
remain = unsafe { remain.get_unchecked(p + 2..) }; remain = &remain[p + 2..];
} }
_ => { _ => {
remain = unsafe { remain.get_unchecked(p + 1..) }; remain = &remain[p + 1..];
} }
} }
} }
@ -364,18 +364,16 @@ fn find_string_end(haystack: &str) -> Option<usize> {
let mut bytes = &haystack.as_bytes()[1..]; let mut bytes = &haystack.as_bytes()[1..];
while let Some(p) = memchr2(b'"', b'\\', bytes) { while let Some(p) = memchr2(b'"', b'\\', bytes) {
unsafe { if bytes[p] == b'\"' {
if *bytes.get_unchecked(p) == b'\"' {
// string terminator found // string terminator found
return Some(haystack.len() - (bytes.len() - p) + 1); return Some(haystack.len() - (bytes.len() - p) + 1);
} else if p + 2 < bytes.len() { } else if p + 2 < bytes.len() {
// skip escape // skip escape
bytes = bytes.get_unchecked(p + 2..); bytes = &bytes[p + 2..];
} else { } else {
break; break;
} }
} }
}
None None
} }

View File

@ -64,7 +64,8 @@ pub fn rustfmt_block(source: &str) -> io::Result<String> {
let output = child.wait_with_output()?; let output = child.wait_with_output()?;
if output.status.success() { if output.status.success() {
let mut s = unsafe { String::from_utf8_unchecked(output.stdout) }; let mut s =
String::from_utf8(output.stdout).expect("rustfmt output is non-UTF-8!");
let brace_offset = s.find('{').unwrap(); let brace_offset = s.find('{').unwrap();
s.replace_range(..brace_offset, ""); s.replace_range(..brace_offset, "");
Ok(s) Ok(s)

View File

@ -68,6 +68,11 @@ impl Buffer {
self.len = new_len; self.len = new_len;
} }
pub(crate) fn truncate(&mut self, new_len: usize) {
assert!(new_len <= self.len);
self.len = new_len;
}
/// Increase the length of buffer by `additional` bytes /// Increase the length of buffer by `additional` bytes
/// ///
/// # Safety /// # Safety

View File

@ -47,7 +47,7 @@ impl<'a, T: Render> Render for Upper<'a, T> {
self.0.render(b)?; self.0.render(b)?;
let s = b.as_str()[old_len..].to_uppercase(); let s = b.as_str()[old_len..].to_uppercase();
unsafe { b._set_len(old_len) }; b.truncate(old_len);
b.push_str(&*s); b.push_str(&*s);
Ok(()) Ok(())
} }
@ -67,7 +67,7 @@ impl<'a, T: Render> Render for Lower<'a, T> {
self.0.render(b)?; self.0.render(b)?;
let s = b.as_str()[old_len..].to_lowercase(); let s = b.as_str()[old_len..].to_lowercase();
unsafe { b._set_len(old_len) }; b.truncate(old_len);
b.push_str(&*s); b.push_str(&*s);
Ok(()) Ok(())
} }
@ -77,7 +77,7 @@ impl<'a, T: Render> Render for Lower<'a, T> {
self.0.render_escaped(b)?; self.0.render_escaped(b)?;
let s = b.as_str()[old_len..].to_lowercase(); let s = b.as_str()[old_len..].to_lowercase();
unsafe { b._set_len(old_len) }; b.truncate(old_len);
b.push_str(&*s); b.push_str(&*s);
Ok(()) Ok(())
} }