Răsfoiți Sursa

check if templates are ptr eq before doing full equality check

Evan Almloff 2 ani în urmă
părinte
comite
84416cbe6a
2 a modificat fișierele cu 5 adăugiri și 29 ștergeri
  1. 3 1
      packages/core/src/diff.rs
  2. 2 28
      packages/core/src/scopes.rs

+ 3 - 1
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);
         }
 

+ 2 - 28
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()
         })
     }