@@ -561,6 +561,7 @@ void Mutator::CrossOver(const Message& message1, Message* message2,
561
561
messages.push_back (message2);
562
562
ConstMessages sources;
563
563
sources.push_back (&message1);
564
+ sources.push_back (message2);
564
565
int size_increase_hint = static_cast <int >(max_size_hint) -
565
566
static_cast <int >(message2->ByteSizeLong ());
566
567
MutateImpl (sources, messages, true , size_increase_hint);
@@ -591,8 +592,6 @@ bool Mutator::MutateImpl(const ConstMessages& sources, const Messages& messages,
591
592
MutationSampler mutation (keep_initialized_, mutations, &random_);
592
593
for (Message* message : messages) mutation.Sample (message);
593
594
594
- // Don't try same mutation next time.
595
- mutations[static_cast <size_t >(mutation.mutation ())] = false ;
596
595
switch (mutation.mutation ()) {
597
596
case Mutation::None:
598
597
return true ;
@@ -610,7 +609,11 @@ bool Mutator::MutateImpl(const ConstMessages& sources, const Messages& messages,
610
609
DataSourceSampler source_sampler (mutation.field (), &random_,
611
610
size_increase_hint);
612
611
for (const Message* source : sources) source_sampler.Sample (*source);
613
- if (source_sampler.IsEmpty ()) return true ; // CreateField is enough.
612
+ if (source_sampler.IsEmpty ()) {
613
+ if (!IsProto3SimpleField (*mutation.field ().descriptor ()))
614
+ return true ; // CreateField is enough for proto2.
615
+ break ;
616
+ }
614
617
CopyField ()(source_sampler.field (), mutation.field ());
615
618
return true ;
616
619
}
@@ -626,6 +629,9 @@ bool Mutator::MutateImpl(const ConstMessages& sources, const Messages& messages,
626
629
assert (false && " unexpected mutation" );
627
630
return false ;
628
631
}
632
+
633
+ // Don't try same mutation next time.
634
+ mutations[static_cast <size_t >(mutation.mutation ())] = false ;
629
635
}
630
636
return false ;
631
637
}
0 commit comments