bug finding start point
Konnor Andrews 2024-07-23
parent 98b067e · commit 8bbf8c6
-rw-r--r--src/build/builders/core/enum.rs33
-rw-r--r--src/protocol/visitor.rs4
-rw-r--r--src/walk.rs63
3 files changed, 39 insertions, 61 deletions
diff --git a/src/build/builders/core/enum.rs b/src/build/builders/core/enum.rs
index dd5b0b8..f5ba931 100644
--- a/src/build/builders/core/enum.rs
+++ b/src/build/builders/core/enum.rs
@@ -250,36 +250,13 @@ where
{
let visitor = VariantVisitor::<Info, Mode, E> { marker: None };
- E::value(visitor)
- .update_map::<'_, '_, _, Flow>(walker, |walker, visitor| {
- let y: DynVisitor<'_, 'lt, 'ctx, E> = DynVisitor(visitor);
- let walker: DynWalkerObjSafe<'b, 'd, 'ctx, E> = walker;
- let x: Canonical<'_, Flow, E> = walker.walk(y);
- let y: Canonical<'_, Flow, E, &'_ ()> = x.cast();
+ E::value((walker, visitor))
+ .update_map((), |_, (walker, visitor)| {
+ let y = DynVisitor(visitor);
+ let x = walker.walk(y);
+ let y = x.cast();
y
- // E::value(Flow::Done).cast()
});
- // .then(self, |this, ((visitor, _), result)| {
- // if let Some(variant) = visitor.marker {
- // match core::mem::replace(&mut this.inner, Inner::Temp) {
- // // A variant was given so we need to make the builder for
- // // it.
- // Inner::Seed(seed) => Info::new_builder(seed, variant)
- // .map((this, result), |(this, result), builder| {
- // this.inner = Inner::Builder { builder };
- // result.to_done().into()
- // })
- // .cast::<()>(),
- // inner => {
- // this.inner = inner;
- // E::value::<VisitResult>(result.to_done().into()).cast()
- // }
- // }
- // } else {
- // E::value(result.to_done().into()).cast()
- // }
- // });
- // .cast()
todo!();
}
}
diff --git a/src/protocol/visitor.rs b/src/protocol/visitor.rs
index feb9c02..5f09279 100644
--- a/src/protocol/visitor.rs
+++ b/src/protocol/visitor.rs
@@ -138,7 +138,7 @@ pub trait EffectiveVisitExt<'lt>: Effective<'lt> {
VisitResult::Control(_) => (update, ControlFlow::Break(result)),
},
(cap, HasSendAndSync(f)),
- |(cap, HasSendAndSync(f)), update, ()| f(cap, update),
+ |(cap, HasSendAndSync(f)), update, ()| f(cap, update).cast().into_raw(),
(),
|_, update, out| (update, out)
)
@@ -163,7 +163,7 @@ pub trait EffectiveVisitExt<'lt>: Effective<'lt> {
VisitResult::Control(_) => (update, ControlFlow::Break(result)),
},
(cap, HasSendAndSync(f)),
- |(cap, HasSendAndSync(f)), update, ()| f(cap, update),
+ |(cap, HasSendAndSync(f)), update, ()| f(cap, update).cast().into_raw(),
(),
|_, update, out| (update, out)
)
diff --git a/src/walk.rs b/src/walk.rs
index b2564da..1c56ad5 100644
--- a/src/walk.rs
+++ b/src/walk.rs
@@ -48,7 +48,7 @@ pub trait Walker<'ctx, E: Environment>: DynBind<E> {
}
pub trait WalkerObjSafe<'lt, 'ctx: 'lt, E: Environment>: DynBind<E> + 'lt {
- fn walk<'a: 'c, 'b: 'c, 'd: 'b, 'c>(
+ fn walk<'a, 'b: 'c, 'd: 'b, 'c>(
&'a mut self,
visitor: DynVisitor<'b, 'd, 'ctx, E>,
) -> Canonical<'c, Flow, E>
@@ -119,41 +119,42 @@ where
Self: DynBind<E>,
{
#[inline(always)]
- fn walk<'a: 'c, 'b: 'c, 'd: 'b, 'c>(
+ fn walk<'a, 'b: 'c, 'd: 'b, 'c>(
&'a mut self,
visitor: DynVisitor<'b, 'd, 'ctx, E>,
) -> Canonical<'c, Flow, E>
where
Self: 'a,
{
- if let DynWalkerState::Pending(walker) =
- core::mem::replace(&mut self.state, DynWalkerState::Walking)
- {
- E::value((self, visitor))
- .update_map(walker, |walker, (this, visitor)| {
- // Walk the walker.
- walker
- .walk(visitor.cast())
- .map(this, |this, value| match value {
- Ok(value) => {
- this.state = DynWalkerState::Done(value);
- Flow::Done
- }
- Err(err) => {
- this.state = DynWalkerState::Err(err);
-
- // Signal that control flow should stop as soon as possible as we
- // are in an error state.
- Flow::Err
- }
- })
- .cast()
- })
- .map((), |_, (_, value)| value)
- .cast()
- } else {
- // Can't do anything if the walker has already been walked.
- E::value(Flow::Done).cast()
- }
+ todo!()
+ // if let DynWalkerState::Pending(walker) =
+ // core::mem::replace(&mut self.state, DynWalkerState::Walking)
+ // {
+ // E::value((self, visitor))
+ // .update_map(walker, |walker, (this, visitor)| {
+ // // Walk the walker.
+ // walker
+ // .walk(visitor.cast())
+ // .map(this, |this, value| match value {
+ // Ok(value) => {
+ // this.state = DynWalkerState::Done(value);
+ // Flow::Done
+ // }
+ // Err(err) => {
+ // this.state = DynWalkerState::Err(err);
+ //
+ // // Signal that control flow should stop as soon as possible as we
+ // // are in an error state.
+ // Flow::Err
+ // }
+ // })
+ // .cast()
+ // })
+ // .map((), |_, (_, value)| value)
+ // .cast()
+ // } else {
+ // // Can't do anything if the walker has already been walked.
+ // E::value(Flow::Done).cast()
+ // }
}
}