|
@@ -1,5 +1,5 @@
|
|
use crate::nodes::RenderReturn;
|
|
use crate::nodes::RenderReturn;
|
|
-use crate::{Attribute, AttributeValue};
|
|
|
|
|
|
+use crate::{Attribute, AttributeValue, VComponent};
|
|
use bumpalo::Bump;
|
|
use bumpalo::Bump;
|
|
use std::cell::RefCell;
|
|
use std::cell::RefCell;
|
|
use std::cell::{Cell, UnsafeCell};
|
|
use std::cell::{Cell, UnsafeCell};
|
|
@@ -7,7 +7,10 @@ use std::cell::{Cell, UnsafeCell};
|
|
pub(crate) struct BumpFrame {
|
|
pub(crate) struct BumpFrame {
|
|
pub bump: UnsafeCell<Bump>,
|
|
pub bump: UnsafeCell<Bump>,
|
|
pub node: Cell<*const RenderReturn<'static>>,
|
|
pub node: Cell<*const RenderReturn<'static>>,
|
|
|
|
+
|
|
|
|
+ // The bump allocator will not call the destructor of the objects it allocated. Attributes and props need to have there destructor called, so we keep a list of them to drop before the bump allocator is reset.
|
|
pub(crate) attributes_to_drop_before_reset: RefCell<Vec<*const Attribute<'static>>>,
|
|
pub(crate) attributes_to_drop_before_reset: RefCell<Vec<*const Attribute<'static>>>,
|
|
|
|
+ pub(crate) props_to_drop_before_reset: RefCell<Vec<*const VComponent<'static>>>,
|
|
}
|
|
}
|
|
|
|
|
|
impl BumpFrame {
|
|
impl BumpFrame {
|
|
@@ -17,6 +20,7 @@ impl BumpFrame {
|
|
bump: UnsafeCell::new(bump),
|
|
bump: UnsafeCell::new(bump),
|
|
node: Cell::new(std::ptr::null()),
|
|
node: Cell::new(std::ptr::null()),
|
|
attributes_to_drop_before_reset: Default::default(),
|
|
attributes_to_drop_before_reset: Default::default(),
|
|
|
|
+ props_to_drop_before_reset: Default::default(),
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -41,6 +45,10 @@ impl BumpFrame {
|
|
.push(attribute);
|
|
.push(attribute);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /// Reset the bump allocator and drop all the attributes and props that were allocated in it.
|
|
|
|
+ ///
|
|
|
|
+ /// # Safety
|
|
|
|
+ /// The caller must insure that no reference to anything allocated in the bump allocator is available after this function is called.
|
|
pub(crate) unsafe fn reset(&self) {
|
|
pub(crate) unsafe fn reset(&self) {
|
|
let mut attributes = self.attributes_to_drop_before_reset.borrow_mut();
|
|
let mut attributes = self.attributes_to_drop_before_reset.borrow_mut();
|
|
attributes.drain(..).for_each(|attribute| {
|
|
attributes.drain(..).for_each(|attribute| {
|
|
@@ -49,9 +57,20 @@ impl BumpFrame {
|
|
_ = l.take();
|
|
_ = l.take();
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
+ let mut props = self.props_to_drop_before_reset.borrow_mut();
|
|
|
|
+ props.drain(..).for_each(|prop| {
|
|
|
|
+ let prop = unsafe { &*prop };
|
|
|
|
+ _ = prop.props.borrow_mut().take();
|
|
|
|
+ });
|
|
unsafe {
|
|
unsafe {
|
|
let bump = &mut *self.bump.get();
|
|
let bump = &mut *self.bump.get();
|
|
bump.reset();
|
|
bump.reset();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+impl Drop for BumpFrame {
|
|
|
|
+ fn drop(&mut self) {
|
|
|
|
+ unsafe { self.reset() }
|
|
|
|
+ }
|
|
|
|
+}
|