bug finding start point
| -rw-r--r-- | src/build/builders/core/enum.rs | 33 | ||||
| -rw-r--r-- | src/protocol/visitor.rs | 4 | ||||
| -rw-r--r-- | src/walk.rs | 63 |
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() + // } } } |