fix: it compiles again
This commit is contained in:
1 parent
0e6c845690
commit
77686ba329
5 files changed
+265
-306
No files matched your search
+209
-281
File diff suppressed because it is too large.
Load diff
@@ -368,8 +368,13 @@ pub struct VComponent<'src> {
|
|||||||
pub(crate) bump_props: *const (),
|
pub(crate) bump_props: *const (),
|
||||||
|
|
||||||
// during the "teardown" process we'll take the caller out so it can be dropped properly
|
// during the "teardown" process we'll take the caller out so it can be dropped properly
|
||||||
pub(crate) caller: Option<VCompCaller<'src>>,
|
// pub(crate) caller: Option<VCompCaller<'src>>,
|
||||||
pub(crate) comparator: Option<BumpBox<'src, dyn Fn(&VComponent) -> bool + 'src>>,
|
pub(crate) caller: &'src dyn Fn(&'src Scope) -> Element,
|
||||||
|
|
||||||
|
pub(crate) comparator: Option<&'src dyn Fn(&VComponent) -> bool>,
|
||||||
|
|
||||||
|
pub(crate) drop_props: RefCell<Option<BumpBox<'src, dyn FnMut()>>>,
|
||||||
|
// pub(crate) comparator: Option<BumpBox<'src, dyn Fn(&VComponent) -> bool + 'src>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct VSuspended<'a> {
|
pub struct VSuspended<'a> {
|
||||||
@@ -588,26 +593,26 @@ impl<'a> NodeFactory<'a> {
|
|||||||
|
|
||||||
let key = key.map(|f| self.raw_text(f).0);
|
let key = key.map(|f| self.raw_text(f).0);
|
||||||
|
|
||||||
let caller: &'a mut dyn Fn(&Scope) -> Element =
|
let caller: &'a mut dyn Fn(&'a Scope) -> Element =
|
||||||
bump.alloc(move |scope: &Scope| -> Element {
|
bump.alloc(move |scope: &Scope| -> Element {
|
||||||
log::debug!("calling component renderr {:?}", scope.our_arena_idx);
|
log::debug!("calling component renderr {:?}", scope.our_arena_idx);
|
||||||
let props: &'_ P = unsafe { &*(bump_props as *const P) };
|
let props: &'_ P = unsafe { &*(bump_props as *const P) };
|
||||||
let res = component(scope, props);
|
let res = component(scope, props);
|
||||||
// let res = component((Context { scope }, props));
|
res
|
||||||
unsafe { std::mem::transmute(res) }
|
|
||||||
});
|
});
|
||||||
|
|
||||||
let can_memoize = P::IS_STATIC;
|
let can_memoize = P::IS_STATIC;
|
||||||
|
|
||||||
VNode::Component(bump.alloc(VComponent {
|
VNode::Component(bump.alloc(VComponent {
|
||||||
user_fc,
|
user_fc,
|
||||||
comparator,
|
comparator: Some(comparator),
|
||||||
bump_props,
|
bump_props,
|
||||||
caller,
|
caller,
|
||||||
key,
|
key,
|
||||||
can_memoize,
|
can_memoize,
|
||||||
drop_props,
|
drop_props,
|
||||||
associated_scope: Cell::new(None),
|
associated_scope: Cell::new(None),
|
||||||
|
hard_allocation: Cell::new(None),
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ pub struct Scope {
|
|||||||
pub(crate) old_root: RefCell<Option<NodeLink>>,
|
pub(crate) old_root: RefCell<Option<NodeLink>>,
|
||||||
pub(crate) new_root: RefCell<Option<NodeLink>>,
|
pub(crate) new_root: RefCell<Option<NodeLink>>,
|
||||||
|
|
||||||
pub(crate) caller: *mut dyn Fn(&Scope) -> Element,
|
pub(crate) caller: *const dyn Fn(&Scope) -> Element,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
we care about:
|
we care about:
|
||||||
|
|||||||
@@ -44,10 +44,15 @@ impl ScopeArena {
|
|||||||
unsafe { Some(&*self.scopes[id.0]) }
|
unsafe { Some(&*self.scopes[id.0]) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// this is unsafe
|
||||||
|
pub unsafe fn get_scope_mut(&self, id: &ScopeId) -> Option<*mut Scope> {
|
||||||
|
Some(self.scopes[id.0])
|
||||||
|
}
|
||||||
|
|
||||||
pub fn new_with_key(
|
pub fn new_with_key(
|
||||||
&mut self,
|
&mut self,
|
||||||
fc_ptr: *const (),
|
fc_ptr: *const (),
|
||||||
caller: *mut dyn Fn(&Scope) -> Element,
|
caller: *const dyn Fn(&Scope) -> Element,
|
||||||
parent_scope: Option<*mut Scope>,
|
parent_scope: Option<*mut Scope>,
|
||||||
height: u32,
|
height: u32,
|
||||||
subtree: u32,
|
subtree: u32,
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ pub struct VirtualDom {
|
|||||||
|
|
||||||
_root_caller: *mut dyn Fn(&Scope) -> Element,
|
_root_caller: *mut dyn Fn(&Scope) -> Element,
|
||||||
|
|
||||||
pub(crate) scopes: ScopeArena,
|
pub(crate) scopes: Box<ScopeArena>,
|
||||||
|
|
||||||
receiver: UnboundedReceiver<SchedulerMsg>,
|
receiver: UnboundedReceiver<SchedulerMsg>,
|
||||||
pub(crate) sender: UnboundedSender<SchedulerMsg>,
|
pub(crate) sender: UnboundedSender<SchedulerMsg>,
|
||||||
@@ -152,7 +152,7 @@ impl VirtualDom {
|
|||||||
let base_scope = scopes.new_with_key(root as _, caller_ref, None, 0, 0);
|
let base_scope = scopes.new_with_key(root as _, caller_ref, None, 0, 0);
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
scopes,
|
scopes: Box::new(scopes),
|
||||||
base_scope,
|
base_scope,
|
||||||
receiver,
|
receiver,
|
||||||
// todo: clean this up manually?
|
// todo: clean this up manually?
|
||||||
@@ -358,13 +358,13 @@ impl VirtualDom {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut diff_state: DiffState = DiffState::new(Mutations::new());
|
let scopes = &self.scopes;
|
||||||
|
let mut diff_state = DiffState::new(scopes);
|
||||||
|
|
||||||
let mut ran_scopes = FxHashSet::default();
|
let mut ran_scopes = FxHashSet::default();
|
||||||
|
|
||||||
// todo: the 2021 version of rust will let us not have to force the borrow
|
// todo: the 2021 version of rust will let us not have to force the borrow
|
||||||
let scopes = &self.scopes;
|
// let scopes = &self.scopes;
|
||||||
|
|
||||||
// Sort the scopes by height. Theoretically, we'll de-duplicate scopes by height
|
// Sort the scopes by height. Theoretically, we'll de-duplicate scopes by height
|
||||||
self.dirty_scopes
|
self.dirty_scopes
|
||||||
.retain(|id| scopes.get_scope(id).is_some());
|
.retain(|id| scopes.get_scope(id).is_some());
|
||||||
@@ -394,7 +394,10 @@ impl VirtualDom {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let work_completed = self.scopes.work(&mut diff_state, &mut deadline);
|
// let scopes = &mut self.scopes;
|
||||||
|
let work_completed = diff_state.work(&mut deadline);
|
||||||
|
// let work_completed = crate::diff::work(&mut diff_state, &mut deadline);
|
||||||
|
// let work_completed = crate::diff::work(&mut diff_state, &mut deadline);
|
||||||
|
|
||||||
if work_completed {
|
if work_completed {
|
||||||
let DiffState {
|
let DiffState {
|
||||||
@@ -440,20 +443,25 @@ impl VirtualDom {
|
|||||||
/// apply_edits(edits);
|
/// apply_edits(edits);
|
||||||
/// ```
|
/// ```
|
||||||
pub fn rebuild(&mut self) -> Mutations {
|
pub fn rebuild(&mut self) -> Mutations {
|
||||||
let mut diff_machine = DiffState::new(Mutations::new());
|
let mut diff_state = DiffState::new(&self.scopes);
|
||||||
|
|
||||||
let scope_id = self.base_scope;
|
let scope_id = self.base_scope;
|
||||||
if self.scopes.run_scope(&scope_id) {
|
if self.scopes.run_scope(&scope_id) {
|
||||||
diff_machine
|
todo!();
|
||||||
.stack
|
// diff_state
|
||||||
.create_node(self.scopes.fin_head(&scope_id), MountType::Append);
|
// .stack
|
||||||
|
// .create_node(self.scopes.fin_head(&scope_id), MountType::Append);
|
||||||
|
|
||||||
diff_machine.stack.scope_stack.push(scope_id);
|
// diff_state.stack.scope_stack.push(scope_id);
|
||||||
|
|
||||||
self.scopes.work(&mut diff_machine, || false);
|
let work_completed = diff_state.work(|| false);
|
||||||
|
// let scopes = &mut self.scopes;
|
||||||
|
//
|
||||||
|
// let work_completed = crate::diff::work(&mut diff_state, || false);
|
||||||
|
// self.scopes.work(&mut diff_machine, || false);
|
||||||
}
|
}
|
||||||
|
|
||||||
diff_machine.mutations
|
diff_state.mutations
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Compute a manual diff of the VirtualDOM between states.
|
/// Compute a manual diff of the VirtualDOM between states.
|
||||||
@@ -494,15 +502,28 @@ impl VirtualDom {
|
|||||||
log::debug!("hard diff {:?}", scope_id);
|
log::debug!("hard diff {:?}", scope_id);
|
||||||
|
|
||||||
if self.scopes.run_scope(scope_id) {
|
if self.scopes.run_scope(scope_id) {
|
||||||
let mut diff_machine = DiffState::new(Mutations::new());
|
let mut diff_machine = DiffState::new(&self.scopes);
|
||||||
|
|
||||||
diff_machine.force_diff = true;
|
diff_machine.force_diff = true;
|
||||||
|
|
||||||
self.scopes.diff_scope(&mut diff_machine, scope_id);
|
let work_completed = diff_machine.work(|| false);
|
||||||
|
// let scopes = &mut self.scopes;
|
||||||
|
// crate::diff::diff_scope(&mut diff_machine, scope_id);
|
||||||
|
// self.scopes.diff_scope(&mut diff_machine, scope_id);
|
||||||
|
|
||||||
dbg!(&diff_machine.mutations);
|
// dbg!(&diff_machine.mutations);
|
||||||
|
// let DiffState {
|
||||||
|
// mutations,
|
||||||
|
// stack,
|
||||||
|
// seen_scopes,
|
||||||
|
// force_diff,
|
||||||
|
// ..
|
||||||
|
// } = mutations;
|
||||||
|
|
||||||
Some(diff_machine.mutations)
|
// let mutations = diff_machine.mutations;
|
||||||
|
|
||||||
|
// Some(unsafe { std::mem::transmute(mutations) })
|
||||||
|
todo!()
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user