Add OptionalStage (#1600)
This commit is contained in:
parent
fc16b70a65
commit
cce25d0a94
@ -223,3 +223,84 @@ where
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// A stage wrapper where the stages do not need to be initialized, but can be [`None`].
|
||||
#[derive(Debug)]
|
||||
pub struct OptionalStage<E, EM, ST, Z>
|
||||
where
|
||||
E: UsesState,
|
||||
EM: UsesState<State = E::State>,
|
||||
ST: StagesTuple<E, EM, E::State, Z>,
|
||||
Z: UsesState<State = E::State>,
|
||||
{
|
||||
stages: Option<ST>,
|
||||
phantom: PhantomData<(E, EM, Z)>,
|
||||
}
|
||||
|
||||
impl<E, EM, ST, Z> UsesState for OptionalStage<E, EM, ST, Z>
|
||||
where
|
||||
E: UsesState,
|
||||
EM: UsesState<State = E::State>,
|
||||
ST: StagesTuple<E, EM, E::State, Z>,
|
||||
Z: UsesState<State = E::State>,
|
||||
{
|
||||
type State = E::State;
|
||||
}
|
||||
|
||||
impl<E, EM, ST, Z> Stage<E, EM, Z> for OptionalStage<E, EM, ST, Z>
|
||||
where
|
||||
E: UsesState,
|
||||
EM: UsesState<State = E::State>,
|
||||
ST: StagesTuple<E, EM, E::State, Z>,
|
||||
Z: UsesState<State = E::State>,
|
||||
{
|
||||
fn perform(
|
||||
&mut self,
|
||||
fuzzer: &mut Z,
|
||||
executor: &mut E,
|
||||
state: &mut E::State,
|
||||
manager: &mut EM,
|
||||
corpus_idx: CorpusId,
|
||||
) -> Result<(), Error> {
|
||||
if let Some(stages) = &mut self.stages {
|
||||
stages.perform_all(fuzzer, executor, state, manager, corpus_idx)
|
||||
} else {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<E, EM, ST, Z> OptionalStage<E, EM, ST, Z>
|
||||
where
|
||||
E: UsesState,
|
||||
EM: UsesState<State = E::State>,
|
||||
ST: StagesTuple<E, EM, E::State, Z>,
|
||||
Z: UsesState<State = E::State>,
|
||||
{
|
||||
/// Constructor for this conditionally enabled stage.
|
||||
#[must_use]
|
||||
pub fn new(stages: Option<ST>) -> Self {
|
||||
Self {
|
||||
stages,
|
||||
phantom: PhantomData,
|
||||
}
|
||||
}
|
||||
|
||||
/// Constructor for this conditionally enabled stage with set stages.
|
||||
#[must_use]
|
||||
pub fn some(stages: ST) -> Self {
|
||||
Self {
|
||||
stages: Some(stages),
|
||||
phantom: PhantomData,
|
||||
}
|
||||
}
|
||||
|
||||
/// Constructor for this conditionally enabled stage, without stages set.
|
||||
#[must_use]
|
||||
pub fn none() -> Self {
|
||||
Self {
|
||||
stages: None,
|
||||
phantom: PhantomData,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user