wip: so much suspense code

This commit is contained in:
Jonathan Kelley committed 2022-11-03 22:30:26 -07:00
1 parent d2ce57ba6e
commit aec1b326ba
9 files changed
+305 -37

No files matched your search

+20 -1
View File
@@ -1,3 +1,7 @@
use std::task::Context;
use futures_util::task::noop_waker_ref;
use crate::{
any_props::AnyProps,
arena::ElementId,
@@ -23,6 +27,7 @@ impl VirtualDom {
height,
props,
tasks: self.pending_futures.clone(),
suspense_boundary: None,
node_arena_1: BumpFrame::new(50),
node_arena_2: BumpFrame::new(50),
render_cnt: Default::default(),
@@ -53,7 +58,7 @@ impl VirtualDom {
let scope = &mut self.scopes[id.0];
scope.hook_idx.set(0);
let res = {
let mut new_nodes = {
let props = unsafe { &mut *scope.props };
let props: &mut dyn AnyProps = unsafe { std::mem::transmute(props) };
let res: RenderReturn = props.render(scope);
@@ -61,6 +66,20 @@ impl VirtualDom {
res
};
// immediately resolve futures that can be resolved immediatelys
let res = match &mut new_nodes {
RenderReturn::Sync(_) => new_nodes,
RenderReturn::Async(fut) => {
use futures_util::FutureExt;
let mut cx = Context::from_waker(&noop_waker_ref());
match fut.poll_unpin(&mut cx) {
std::task::Poll::Ready(nodes) => RenderReturn::Sync(nodes),
std::task::Poll::Pending => new_nodes,
}
}
};
let frame = match scope.render_cnt % 2 {
0 => &mut scope.node_arena_1,
1 => &mut scope.node_arena_2,