Path: blob/main/crates/fuzzing/src/generators/gc_ops/mutator.rs
3068 views
//! Mutators for the `gc` operations.12use crate::generators::gc_ops::ops::{GcOp, GcOps};3use mutatis::{Candidates, Context, DefaultMutate, Generate, Mutate, Result as MutResult};45/// A mutator for the gc ops6#[derive(Debug)]7pub struct GcOpsMutator;89impl Mutate<GcOps> for GcOpsMutator {10fn mutate(&mut self, c: &mut Candidates<'_>, ops: &mut GcOps) -> mutatis::Result<()> {11if !c.shrink() {12c.mutation(|ctx| {13if let Some(idx) = ctx.rng().gen_index(ops.ops.len() + 1) {14let op = GcOp::generate(ctx)?;15ops.ops.insert(idx, op);16}17Ok(())18})?;19}2021if !ops.ops.is_empty() {22c.mutation(|ctx| {23let idx = ctx24.rng()25.gen_index(ops.ops.len())26.expect("ops is not empty");27ops.ops.remove(idx);28Ok(())29})?;30}31Ok(())32}33}3435impl DefaultMutate for GcOps {36type DefaultMutate = GcOpsMutator;37}3839impl Default for GcOpsMutator {40fn default() -> Self {41GcOpsMutator42}43}4445impl<'a> arbitrary::Arbitrary<'a> for GcOps {46fn arbitrary(u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result<Self> {47let mut session = mutatis::Session::new().seed(u.arbitrary()?);48session49.generate()50.map_err(|_| arbitrary::Error::IncorrectFormat)51}52}5354impl Generate<GcOps> for GcOpsMutator {55fn generate(&mut self, _ctx: &mut Context) -> MutResult<GcOps> {56let mut ops = GcOps::default();57let mut session = mutatis::Session::new();5859for _ in 0..64 {60session.mutate(&mut ops)?;61}6263Ok(ops)64}65}666768