diff options
author | Pascal Kuthe | 2023-06-04 15:20:04 +0000 |
---|---|---|
committer | GitHub | 2023-06-04 15:20:04 +0000 |
commit | de0ef8af15945fb7f761503c615a2d6213d2fd82 (patch) | |
tree | f36686fde846a49c982c2293d1dcbfa7062211bf /helix-vcs | |
parent | d511122279b3b479362830305f4812f096273b6a (diff) |
fix UB in diff gutter (#7227)
Diffstat (limited to 'helix-vcs')
-rw-r--r-- | helix-vcs/src/diff/line_cache.rs | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/helix-vcs/src/diff/line_cache.rs b/helix-vcs/src/diff/line_cache.rs index 8e48250f..460a2065 100644 --- a/helix-vcs/src/diff/line_cache.rs +++ b/helix-vcs/src/diff/line_cache.rs @@ -20,8 +20,8 @@ use super::{MAX_DIFF_BYTES, MAX_DIFF_LINES}; /// A cache that stores the `lines` of a rope as a vector. /// It allows safely reusing the allocation of the vec when updating the rope pub(crate) struct InternedRopeLines { - diff_base: Rope, - doc: Rope, + diff_base: Box<Rope>, + doc: Box<Rope>, num_tokens_diff_base: u32, interned: InternedInput<RopeSlice<'static>>, } @@ -34,8 +34,8 @@ impl InternedRopeLines { after: Vec::with_capacity(doc.len_lines()), interner: Interner::new(diff_base.len_lines() + doc.len_lines()), }, - diff_base, - doc, + diff_base: Box::new(diff_base), + doc: Box::new(doc), // will be populated by update_diff_base_impl num_tokens_diff_base: 0, }; @@ -44,19 +44,19 @@ impl InternedRopeLines { } pub fn doc(&self) -> Rope { - self.doc.clone() + Rope::clone(&*self.doc) } pub fn diff_base(&self) -> Rope { - self.diff_base.clone() + Rope::clone(&*self.diff_base) } /// Updates the `diff_base` and optionally the document if `doc` is not None pub fn update_diff_base(&mut self, diff_base: Rope, doc: Option<Rope>) { self.interned.clear(); - self.diff_base = diff_base; + self.diff_base = Box::new(diff_base); if let Some(doc) = doc { - self.doc = doc + self.doc = Box::new(doc) } if !self.is_too_large() { self.update_diff_base_impl(); @@ -74,7 +74,7 @@ impl InternedRopeLines { .interner .erase_tokens_after(self.num_tokens_diff_base.into()); - self.doc = doc; + self.doc = Box::new(doc); if self.is_too_large() { self.interned.after.clear(); } else { |