From f91b19c08947aad20e095a4103cf144794baf16d Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 5 Aug 2020 09:57:45 -0700 Subject: [PATCH] tags, highlight: Avoid completely deallocating buffers when shrinking --- highlight/src/lib.rs | 16 ++++++++++------ tags/src/c_lib.rs | 16 ++++++++++------ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/highlight/src/lib.rs b/highlight/src/lib.rs index 1cffefa2..e4aebbfb 100644 --- a/highlight/src/lib.rs +++ b/highlight/src/lib.rs @@ -900,12 +900,8 @@ impl HtmlRenderer { } pub fn reset(&mut self) { - self.html.truncate(BUFFER_HTML_RESERVE_CAPACITY); - self.line_offsets.truncate(BUFFER_LINES_RESERVE_CAPACITY); - self.html.shrink_to_fit(); - self.line_offsets.shrink_to_fit(); - self.html.clear(); - self.line_offsets.clear(); + shrink_and_clear(&mut self.html, BUFFER_HTML_RESERVE_CAPACITY); + shrink_and_clear(&mut self.line_offsets, BUFFER_LINES_RESERVE_CAPACITY); self.line_offsets.push(0); } @@ -1069,3 +1065,11 @@ fn injection_for_match<'a>( (language_name, content_node, include_children) } + +fn shrink_and_clear(vec: &mut Vec, capacity: usize) { + if vec.len() > capacity { + vec.truncate(capacity); + vec.shrink_to_fit(); + } + vec.clear(); +} diff --git a/tags/src/c_lib.rs b/tags/src/c_lib.rs index c2bec6ca..b0786580 100644 --- a/tags/src/c_lib.rs +++ b/tags/src/c_lib.rs @@ -119,12 +119,8 @@ pub extern "C" fn ts_tagger_tag( let scope_name = unsafe { unwrap(CStr::from_ptr(scope_name).to_str()) }; if let Some(config) = tagger.languages.get(scope_name) { - buffer.tags.truncate(BUFFER_TAGS_RESERVE_CAPACITY); - buffer.docs.truncate(BUFFER_DOCS_RESERVE_CAPACITY); - buffer.tags.shrink_to_fit(); - buffer.docs.shrink_to_fit(); - buffer.tags.clear(); - buffer.docs.clear(); + shrink_and_clear(&mut buffer.tags, BUFFER_TAGS_RESERVE_CAPACITY); + shrink_and_clear(&mut buffer.docs, BUFFER_DOCS_RESERVE_CAPACITY); let source_code = unsafe { slice::from_raw_parts(source_code, source_code_len as usize) }; let cancellation_flag = unsafe { cancellation_flag.as_ref() }; @@ -262,3 +258,11 @@ fn unwrap(result: Result) -> T { abort(); }) } + +fn shrink_and_clear(vec: &mut Vec, capacity: usize) { + if vec.len() > capacity { + vec.truncate(capacity); + vec.shrink_to_fit(); + } + vec.clear(); +}