forked from Orchid/orchid
Fixed a hang when the cleanup code for an extension is too slow
This commit is contained in:
@@ -103,18 +103,24 @@ impl Expr {
|
||||
}
|
||||
impl Format for Expr {
|
||||
async fn print<'a>(&'a self, c: &'a (impl FmtCtx + ?Sized + 'a)) -> FmtUnit {
|
||||
return print_expr(self, c, Substack::Bottom).await;
|
||||
return print_expr(self, c, Substack::Bottom, &[]).await;
|
||||
}
|
||||
}
|
||||
async fn print_expr<'a>(
|
||||
pub async fn print_expr<'a>(
|
||||
expr: &'a Expr,
|
||||
c: &'a (impl FmtCtx + ?Sized + 'a),
|
||||
visited: Substack<'_, api::ExprTicket>,
|
||||
id_only: &[api::ExprTicket],
|
||||
) -> FmtUnit {
|
||||
if visited.iter().any(|id| id == &expr.id()) {
|
||||
return "CYCLIC_EXPR".to_string().into();
|
||||
}
|
||||
print_exprkind(&*expr.kind().read().await, c, visited.push(expr.id())).boxed_local().await
|
||||
if id_only.iter().any(|id| id == &expr.id()) {
|
||||
return format!("{:?}", expr.id()).into();
|
||||
}
|
||||
print_exprkind(&*expr.kind().read().await, c, visited.push(expr.id()), id_only)
|
||||
.boxed_local()
|
||||
.await
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
@@ -138,13 +144,14 @@ impl ExprKind {
|
||||
}
|
||||
impl Format for ExprKind {
|
||||
async fn print<'a>(&'a self, c: &'a (impl FmtCtx + ?Sized + 'a)) -> FmtUnit {
|
||||
print_exprkind(self, c, Substack::Bottom).await
|
||||
print_exprkind(self, c, Substack::Bottom, &[]).await
|
||||
}
|
||||
}
|
||||
async fn print_exprkind<'a>(
|
||||
ek: &ExprKind,
|
||||
c: &'a (impl FmtCtx + ?Sized + 'a),
|
||||
visited: Substack<'_, api::ExprTicket>,
|
||||
id_only: &[api::ExprTicket],
|
||||
) -> FmtUnit {
|
||||
match &ek {
|
||||
ExprKind::Arg => "Arg".to_string().into(),
|
||||
@@ -156,10 +163,10 @@ async fn print_exprkind<'a>(
|
||||
ExprKind::Call(f, x) => tl_cache!(Rc<Variants>: Rc::new(Variants::default()
|
||||
.unbounded("{0b} {1l}")
|
||||
.bounded("({0b} {1})")))
|
||||
.units([print_expr(f, c, visited).await, print_expr(x, c, visited).await]),
|
||||
.units([print_expr(f, c, visited, id_only).await, print_expr(x, c, visited, id_only).await]),
|
||||
ExprKind::Identity(id) =>
|
||||
tl_cache!(Rc<Variants>: Rc::new(Variants::default().bounded("{{{0}}}"))).units([print_expr(
|
||||
id, c, visited,
|
||||
id, c, visited, id_only,
|
||||
)
|
||||
.boxed_local()
|
||||
.await]),
|
||||
@@ -167,14 +174,14 @@ async fn print_exprkind<'a>(
|
||||
ExprKind::Lambda(None, body) => tl_cache!(Rc<Variants>: Rc::new(Variants::default()
|
||||
// .unbounded("\\.{0l}")
|
||||
.bounded("(\\.{0b})")))
|
||||
.units([print_expr(body, c, visited).await]),
|
||||
.units([print_expr(body, c, visited, id_only).await]),
|
||||
ExprKind::Lambda(Some(path), body) => tl_cache!(Rc<Variants>: Rc::new(Variants::default()
|
||||
// .unbounded("\\{0b}. {1l}")
|
||||
.bounded("(\\{0b}. {1b})")))
|
||||
.units([format!("{path}").into(), print_expr(body, c, visited).await]),
|
||||
.units([format!("{path}").into(), print_expr(body, c, visited, id_only).await]),
|
||||
ExprKind::Seq(l, r) =>
|
||||
tl_cache!(Rc<Variants>: Rc::new(Variants::default().bounded("[{0b}]{1l}")))
|
||||
.units([print_expr(l, c, visited).await, print_expr(r, c, visited).await]),
|
||||
.units([print_expr(l, c, visited, id_only).await, print_expr(r, c, visited, id_only).await]),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user