aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPascal Kuthe2023-06-04 15:20:04 +0000
committerGitHub2023-06-04 15:20:04 +0000
commitde0ef8af15945fb7f761503c615a2d6213d2fd82 (patch)
treef36686fde846a49c982c2293d1dcbfa7062211bf
parentd511122279b3b479362830305f4812f096273b6a (diff)
fix UB in diff gutter (#7227)
-rw-r--r--helix-vcs/src/diff/line_cache.rs18
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 {