@@ -589,7 +589,6 @@ fn ssz_encode_derive_stable_container(
589589 let mut active_fields = BitVector :: <#max_fields>:: new( ) ;
590590
591591 let mut working_field: usize = 0 ;
592-
593592 #(
594593 if self . #struct_fields_vec. is_some( ) {
595594 active_fields. set( working_field, true ) . expect( "Should not be out of bounds" ) ;
@@ -1356,6 +1355,8 @@ fn ssz_decode_derive_stable_container(
13561355 let mut is_fixed_lens = vec ! [ ] ;
13571356 let mut fixed_lens = vec ! [ ] ;
13581357
1358+ let mut working_index: usize = 0 ;
1359+
13591360 for ( ty, ident, field_opts) in parse_ssz_fields ( struct_data) {
13601361 let ident = match ident {
13611362 Some ( ref ident) => ident,
@@ -1403,14 +1404,21 @@ fn ssz_decode_derive_stable_container(
14031404 from_ssz_bytes = quote ! { <#ty as ssz:: Decode >:: from_ssz_bytes( slice) } ;
14041405
14051406 register_types. push ( quote ! {
1406- builder. register_type:: <#ty>( ) ?
1407+ if bitvector. get( #working_index) . unwrap( ) {
1408+ builder. register_type:: <#ty>( ) ?;
1409+ }
14071410 } ) ;
14081411 decodes. push ( quote ! {
1409- decoder. decode_next( ) ?
1412+ let #ident = if bitvector. get( #working_index) . unwrap( ) {
1413+ decoder. decode_next( ) ?
1414+ } else {
1415+ None
1416+ } ;
14101417 } ) ;
14111418 }
14121419
14131420 fixed_decodes. push ( quote ! {
1421+ let #ident = if bitvector. get( #working_index) . unwrap( ) {
14141422 start = end;
14151423 end = end
14161424 . checked_add( #ssz_fixed_len)
@@ -1423,9 +1431,14 @@ fn ssz_decode_derive_stable_container(
14231431 expected: end
14241432 } ) ?;
14251433 #from_ssz_bytes?
1434+ } else {
1435+ None
1436+ } ;
14261437 } ) ;
14271438 is_fixed_lens. push ( is_ssz_fixed_len) ;
14281439 fixed_lens. push ( ssz_fixed_len) ;
1440+
1441+ working_index += 1 ;
14291442 }
14301443
14311444 let output = quote ! {
@@ -1463,14 +1476,8 @@ fn ssz_decode_derive_stable_container(
14631476 let mut start: usize = 0 ;
14641477 let mut end = start;
14651478
1466- let mut working_field: usize = 0 ;
14671479 #(
1468- let #field_names = if bitvector. get( working_field) . unwrap( ) {
1469- #fixed_decodes
1470- } else {
1471- None
1472- } ;
1473- working_field += 1 ;
1480+ #fixed_decodes
14741481 ) *
14751482
14761483 Ok ( Self {
@@ -1481,27 +1488,16 @@ fn ssz_decode_derive_stable_container(
14811488 } else {
14821489 let mut builder = ssz:: SszDecoderBuilder :: new( bytes) ;
14831490
1484- let mut working_field: usize = 0 ;
14851491 #(
1486- if bitvector. get( working_field) . unwrap( ) {
1487- #register_types
1488- }
1489- working_field += 1 ;
1492+ #register_types
14901493 ) *
14911494
14921495 let mut decoder = builder. build( ) ?;
14931496
1494- let mut working_field: usize = 0 ;
14951497 #(
1496- let #field_names = if bitvector. get( working_field) . unwrap( ) {
1497- #decodes
1498- } else {
1499- None
1500- } ;
1501- working_field += 1 ;
1498+ #decodes
15021499 ) *
15031500
1504-
15051501 Ok ( Self {
15061502 #(
15071503 #field_names,
@@ -1527,15 +1523,12 @@ fn ssz_decode_derive_profile_container(
15271523 let mut decodes = vec ! [ ] ;
15281524 let mut is_fixed_lens = vec ! [ ] ;
15291525 let mut fixed_lens = vec ! [ ] ;
1530- let mut optional_field_indices: Vec < usize > = vec ! [ ] ;
15311526 let mut optional_field_names: Vec < & Ident > = vec ! [ ] ;
15321527 // Since we use a truncated bitvector, we need to keep track of which optional field we are up
15331528 // to.
15341529 let mut working_optional_index: usize = 0 ;
15351530
1536- for ( field_index, ( ty, ident, field_opts) ) in
1537- parse_ssz_fields ( struct_data) . into_iter ( ) . enumerate ( )
1538- {
1531+ for ( ty, ident, field_opts) in parse_ssz_fields ( struct_data) {
15391532 let mut is_optional = false ;
15401533 let ident = match ident {
15411534 Some ( ref ident) => ident,
@@ -1563,7 +1556,6 @@ fn ssz_decode_derive_profile_container(
15631556
15641557 // Check if field is optional.
15651558 if ty_inner_type ( "Option" , ty) . is_some ( ) {
1566- optional_field_indices. push ( field_index) ;
15671559 optional_field_names. push ( ident) ;
15681560 is_optional = true ;
15691561 }
@@ -1581,18 +1573,9 @@ fn ssz_decode_derive_profile_container(
15811573 register_types. push ( quote ! {
15821574 builder. register_type_parameterized( #is_ssz_fixed_len, #ssz_fixed_len) ?;
15831575 } ) ;
1584- // If the field is optional, we need to check the bitvector before decoding.
1585- if is_optional {
1586- decodes. push ( quote ! {
1587- if bitvector. get( #working_optional_index) . unwrap( )
1588- if self . #ident. is_some( ) {
1589- let #ident = decoder. decode_next_with( |slice| #module:: from_ssz_bytes( slice) ) ?;
1590- } else {
1591- // Value is None so just decode an Option::default();
1592- let #ident = <_>:: default ( ) ;
1593- }
1594- } ) ;
1595- }
1576+ decodes. push ( quote ! {
1577+ let #ident = decoder. decode_next_with( |slice| #module:: from_ssz_bytes( slice) ) ?;
1578+ } ) ;
15961579 } else {
15971580 is_ssz_fixed_len = quote ! { <#ty as ssz:: Decode >:: is_ssz_fixed_len( ) } ;
15981581 ssz_fixed_len = quote ! { <#ty as ssz:: Decode >:: ssz_fixed_len( ) } ;
@@ -1601,9 +1584,19 @@ fn ssz_decode_derive_profile_container(
16011584 register_types. push ( quote ! {
16021585 builder. register_type:: <#ty>( ) ?;
16031586 } ) ;
1604- decodes. push ( quote ! {
1605- let #ident = decoder. decode_next( ) ?;
1606- } ) ;
1587+ if is_optional {
1588+ decodes. push ( quote ! {
1589+ let #ident = if bitvector. get( #working_optional_index) . unwrap( ) {
1590+ decoder. decode_next( ) ?
1591+ } else {
1592+ <_>:: default ( )
1593+ } ;
1594+ } ) ;
1595+ } else {
1596+ decodes. push ( quote ! {
1597+ let #ident = decoder. decode_next( ) ?;
1598+ } ) ;
1599+ }
16071600 }
16081601
16091602 // If the field is optional, we need to check the bitvector before decoding.
@@ -1651,6 +1644,8 @@ fn ssz_decode_derive_profile_container(
16511644 is_fixed_lens. push ( is_ssz_fixed_len) ;
16521645 fixed_lens. push ( ssz_fixed_len) ;
16531646 }
1647+
1648+ // Increment the working index so we check the next field of the bitvector.
16541649 if is_optional {
16551650 working_optional_index += 1
16561651 } ;
0 commit comments