From bd62ae8dbbfea602c7985c5f9d807d8885f333a2 Mon Sep 17 00:00:00 2001 From: timofey Date: Sat, 29 Jul 2023 19:59:42 +0000 Subject: [PATCH] `mprepare` --- src/rcore/modes.rs | 30 ++++++++++++++++++++++++++---- src/rstd/inlining/modes.rs | 4 +++- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/rcore/modes.rs b/src/rcore/modes.rs index fb6c2de..69adccb 100644 --- a/src/rcore/modes.rs +++ b/src/rcore/modes.rs @@ -54,7 +54,7 @@ impl<'a, Ctx: Context<'a>, F: FactoryModeParse<'a, Ctx>> FactoryParse<'a, Ctx> f } fn extend(&self, mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self> { - <::Mode as Mode>::xseal(self.mextend(mentionable, tail)) + <::Mode as Mode>::xseal(self.mextend(Self::mprepare(mentionable), tail)) } } @@ -76,7 +76,14 @@ pub type ExtensionSourceM<'a, Ctx, F> = pub trait FactoryModeParse<'a, Ctx: Context<'a>>: FactoryBase<'a, Ctx> + ParseMode { fn mdeserialize>(&self, inctx: I) -> ParseResultM<'a, Ctx, Self, I>; - fn mextend(&self, mentionable: Self::Mtbl, tail: &[u8]) -> ExtensionResultM<'a, Ctx, Self>; + + fn mextend( + &self, + mentionable: ExtensionSourceM<'a, Ctx, Self>, + tail: &[u8], + ) -> ExtensionResultM<'a, Ctx, Self>; + + fn mprepare(mentionable: Self::Mtbl) -> ExtensionSourceM<'a, Ctx, Self>; } pub trait FactoryModeProxy<'a, Ctx: Context<'a>> { @@ -84,11 +91,14 @@ pub trait FactoryModeProxy<'a, Ctx: Context<'a>> { fn pmdeserialize>(f: &Self::F, inctx: I) -> ParseResultM<'a, Ctx, Self::F, I>; + fn pmextend( f: &Self::F, - mentionable: Mtbl<'a, Ctx, Self::F>, + mentionable: ExtensionSourceM<'a, Ctx, Self::F>, tail: &[u8], ) -> ExtensionResultM<'a, Ctx, Self::F>; + + fn pmprepare(mentionable: Mtbl<'a, Ctx, Self::F>) -> ExtensionSourceM<'a, Ctx, Self::F>; } impl<'a, Ctx: Context<'a>, F: FactoryBase<'a, Ctx> + WithParseMode> FactoryModeParse<'a, Ctx> for F @@ -99,9 +109,17 @@ where >::pmdeserialize(self, inctx) } - fn mextend(&self, mentionable: Self::Mtbl, tail: &[u8]) -> ExtensionResultM<'a, Ctx, Self> { + fn mextend( + &self, + mentionable: ExtensionSourceM<'a, Ctx, Self>, + tail: &[u8], + ) -> ExtensionResultM<'a, Ctx, Self> { >::pmextend(self, mentionable, tail) } + + fn mprepare(mentionable: Self::Mtbl) -> ExtensionSourceM<'a, Ctx, Self> { + >::pmprepare(mentionable) + } } pub struct RegularMode; @@ -169,4 +187,8 @@ impl<'a, Ctx: Context<'a>, F: RegularFactory<'a, Ctx>> FactoryModeProxy<'a, Ctx> fn pmextend(f: &F, mentionable: Mtbl<'a, Ctx, F>, tail: &[u8]) -> ExtensionResultM<'a, Ctx, F> { f.rextend(mentionable, tail) } + + fn pmprepare(mentionable: Mtbl<'a, Ctx, Self::F>) -> ExtensionSourceM<'a, Ctx, Self::F> { + mentionable + } } diff --git a/src/rstd/inlining/modes.rs b/src/rstd/inlining/modes.rs index 5402be9..cd8e5ec 100644 --- a/src/rstd/inlining/modes.rs +++ b/src/rstd/inlining/modes.rs @@ -59,11 +59,13 @@ impl<'a, Ctx: Context<'a>, F: InlineableFactory<'a, Ctx>> FactoryModeProxy<'a, C fn pmextend( f: &F, - _mentionable: Mtbl<'a, Ctx, F>, + _mentionable: ExtensionSourceM<'a, Ctx, F>, tail: &[u8], ) -> ExtensionResultM<'a, Ctx, F> { f.extension_error(tail) } + + fn pmprepare(_mentionable: Mtbl<'a, Ctx, Self::F>) -> ExtensionSourceM<'a, Ctx, Self::F> {} } impl AtomicProxy for WithMode {