@@ -391,6 +391,7 @@ std::optional<NodeInfo> ConsumeNodeStable(MsCtx script_ctx, FuzzedDataProvider&
391
391
bool allow_K = (type_needed == " " _mst) || (type_needed << " K" _mst);
392
392
bool allow_V = (type_needed == " " _mst) || (type_needed << " V" _mst);
393
393
bool allow_W = (type_needed == " " _mst) || (type_needed << " W" _mst);
394
+ static constexpr auto B{" B" _mst}, K{" K" _mst}, V{" V" _mst}, W{" W" _mst};
394
395
395
396
switch (provider.ConsumeIntegral <uint8_t >()) {
396
397
case 0 :
@@ -440,22 +441,22 @@ std::optional<NodeInfo> ConsumeNodeStable(MsCtx script_ctx, FuzzedDataProvider&
440
441
}
441
442
case 11 :
442
443
if (!(allow_B || allow_K || allow_V)) return {};
443
- return {{{" B " _mst , type_needed, type_needed}, Fragment::ANDOR}};
444
+ return {{{B , type_needed, type_needed}, Fragment::ANDOR}};
444
445
case 12 :
445
446
if (!(allow_B || allow_K || allow_V)) return {};
446
- return {{{" V " _mst , type_needed}, Fragment::AND_V}};
447
+ return {{{V , type_needed}, Fragment::AND_V}};
447
448
case 13 :
448
449
if (!allow_B) return {};
449
- return {{{" B " _mst, " W " _mst }, Fragment::AND_B}};
450
+ return {{{B, W }, Fragment::AND_B}};
450
451
case 15 :
451
452
if (!allow_B) return {};
452
- return {{{" B " _mst, " W " _mst }, Fragment::OR_B}};
453
+ return {{{B, W }, Fragment::OR_B}};
453
454
case 16 :
454
455
if (!allow_V) return {};
455
- return {{{" B " _mst, " V " _mst }, Fragment::OR_C}};
456
+ return {{{B, V }, Fragment::OR_C}};
456
457
case 17 :
457
458
if (!allow_B) return {};
458
- return {{{" B " _mst, " B " _mst }, Fragment::OR_D}};
459
+ return {{{B, B }, Fragment::OR_D}};
459
460
case 18 :
460
461
if (!(allow_B || allow_K || allow_V)) return {};
461
462
return {{{type_needed, type_needed}, Fragment::OR_I}};
@@ -472,25 +473,25 @@ std::optional<NodeInfo> ConsumeNodeStable(MsCtx script_ctx, FuzzedDataProvider&
472
473
}
473
474
case 20 :
474
475
if (!allow_W) return {};
475
- return {{{" B " _mst }, Fragment::WRAP_A}};
476
+ return {{{B }, Fragment::WRAP_A}};
476
477
case 21 :
477
478
if (!allow_W) return {};
478
- return {{{" B " _mst }, Fragment::WRAP_S}};
479
+ return {{{B }, Fragment::WRAP_S}};
479
480
case 22 :
480
481
if (!allow_B) return {};
481
- return {{{" K " _mst }, Fragment::WRAP_C}};
482
+ return {{{K }, Fragment::WRAP_C}};
482
483
case 23 :
483
484
if (!allow_B) return {};
484
- return {{{" V " _mst }, Fragment::WRAP_D}};
485
+ return {{{V }, Fragment::WRAP_D}};
485
486
case 24 :
486
487
if (!allow_V) return {};
487
- return {{{" B " _mst }, Fragment::WRAP_V}};
488
+ return {{{B }, Fragment::WRAP_V}};
488
489
case 25 :
489
490
if (!allow_B) return {};
490
- return {{{" B " _mst }, Fragment::WRAP_J}};
491
+ return {{{B }, Fragment::WRAP_J}};
491
492
case 26 :
492
493
if (!allow_B) return {};
493
- return {{{" B " _mst }, Fragment::WRAP_N}};
494
+ return {{{B }, Fragment::WRAP_N}};
494
495
case 27 : {
495
496
if (!allow_B || !IsTapscript (script_ctx)) return {};
496
497
const auto k = provider.ConsumeIntegral <uint16_t >();
@@ -528,20 +529,23 @@ struct SmartInfo
528
529
{
529
530
/* Construct a set of interesting type requirements to reason with (sections of BKVWzondu). */
530
531
std::vector<Type> types;
532
+ static constexpr auto B_mst{" B" _mst}, K_mst{" K" _mst}, V_mst{" V" _mst}, W_mst{" W" _mst};
533
+ static constexpr auto d_mst{" d" _mst}, n_mst{" n" _mst}, o_mst{" o" _mst}, u_mst{" u" _mst}, z_mst{" z" _mst};
534
+ static constexpr auto NONE_mst{" " _mst};
531
535
for (int base = 0 ; base < 4 ; ++base) { /* select from B,K,V,W */
532
- Type type_base = base == 0 ? " B " _mst : base == 1 ? " K " _mst : base == 2 ? " V " _mst : " W " _mst ;
536
+ Type type_base = base == 0 ? B_mst : base == 1 ? K_mst : base == 2 ? V_mst : W_mst ;
533
537
for (int zo = 0 ; zo < 3 ; ++zo) { /* select from z,o,(none) */
534
- Type type_zo = zo == 0 ? " z " _mst : zo == 1 ? " o " _mst : " " _mst ;
538
+ Type type_zo = zo == 0 ? z_mst : zo == 1 ? o_mst : NONE_mst ;
535
539
for (int n = 0 ; n < 2 ; ++n) { /* select from (none),n */
536
540
if (zo == 0 && n == 1 ) continue ; /* z conflicts with n */
537
541
if (base == 3 && n == 1 ) continue ; /* W conflicts with n */
538
- Type type_n = n == 0 ? " " _mst : " n " _mst ;
542
+ Type type_n = n == 0 ? NONE_mst : n_mst ;
539
543
for (int d = 0 ; d < 2 ; ++d) { /* select from (none),d */
540
544
if (base == 2 && d == 1 ) continue ; /* V conflicts with d */
541
- Type type_d = d == 0 ? " " _mst : " d " _mst ;
545
+ Type type_d = d == 0 ? NONE_mst : d_mst ;
542
546
for (int u = 0 ; u < 2 ; ++u) { /* select from (none),u */
543
547
if (base == 2 && u == 1 ) continue ; /* V conflicts with u */
544
- Type type_u = u == 0 ? " " _mst : " u " _mst ;
548
+ Type type_u = u == 0 ? NONE_mst : u_mst ;
545
549
Type type = type_base | type_zo | type_n | type_d | type_u;
546
550
types.push_back (type);
547
551
}
@@ -683,7 +687,7 @@ struct SmartInfo
683
687
/* Find which types are useful. The fuzzer logic only cares about constructing
684
688
* B,V,K,W nodes, so any type that isn't needed in any recipe (directly or
685
689
* indirectly) for the construction of those is uninteresting. */
686
- std::set<Type> useful_types{" B " _mst, " V " _mst, " K " _mst, " W " _mst };
690
+ std::set<Type> useful_types{B_mst, V_mst, K_mst, W_mst };
687
691
// Find the transitive closure by adding types until the set of types does not change.
688
692
while (true ) {
689
693
size_t set_size = useful_types.size ();
0 commit comments