From 84416cbe6a84d1b48074dae55562297ff5d73c98 Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Wed, 7 Dec 2022 10:11:27 -0600 Subject: [PATCH] check if templates are ptr eq before doing full equality check --- packages/core/src/diff.rs | 4 +++- packages/core/src/scopes.rs | 30 ++---------------------------- 2 files changed, 5 insertions(+), 29 deletions(-) diff --git a/packages/core/src/diff.rs b/packages/core/src/diff.rs index 28ffb2404..544b4bb16 100644 --- a/packages/core/src/diff.rs +++ b/packages/core/src/diff.rs @@ -61,7 +61,9 @@ impl<'b> VirtualDom { } fn diff_node(&mut self, left_template: &'b VNode<'b>, right_template: &'b VNode<'b>) { - if left_template.template.name != right_template.template.name { + if !std::ptr::eq(left_template.template.name, right_template.template.name) + && left_template.template.name != right_template.template.name + { return self.light_diff_templates(left_template, right_template); } diff --git a/packages/core/src/scopes.rs b/packages/core/src/scopes.rs index 54402f159..06f5bf8c3 100644 --- a/packages/core/src/scopes.rs +++ b/packages/core/src/scopes.rs @@ -384,35 +384,9 @@ impl<'src> ScopeState { /// Uses the currently active [`Bump`] allocator pub fn raw_text(&'src self, args: Arguments) -> &'src str { args.as_str().unwrap_or_else(|| { + use bumpalo::core_alloc::fmt::Write; let mut str_buf = bumpalo::collections::String::new_in(self.bump()); - struct Wrapper<'a, 'b>(&'a mut bumpalo::collections::Vec<'b, u8>); - - impl<'a, 'b> std::fmt::Write for Wrapper<'a, 'b> { - fn write_str(&mut self, s: &str) -> std::fmt::Result { - unsafe { - copy(s, self.0); - } - Ok(()) - } - fn write_char(&mut self, c: char) -> std::fmt::Result { - self.0.push(c as u8); - Ok(()) - } - } - - unsafe fn copy<'a>(s: &str, buf: &mut bumpalo::collections::Vec<'a, u8>) { - let old_len = buf.len(); - buf.reserve(s.len()); - let ptr = buf.as_mut_ptr().add(old_len); - let bytes = s.as_bytes(); - let str_ptr = bytes.as_ptr(); - for o in 0..s.len() { - *ptr.add(o) = *str_ptr.add(o); - } - buf.set_len(old_len + s.len()); - } - - let _ = unsafe { std::fmt::write(&mut Wrapper(str_buf.as_mut_vec()), args) }; + str_buf.write_fmt(args).unwrap(); str_buf.into_bump_str() }) }