@@ -587,7 +587,6 @@ fn ssz_encode_derive_stable_container(
587587 let mut active_fields = BitVector :: <#max_fields>:: new( ) ;
588588
589589 let mut working_field: usize = 0 ;
590-
591590 #(
592591 if self . #struct_fields_vec. is_some( ) {
593592 active_fields. set( working_field, true ) . expect( "Should not be out of bounds" ) ;
@@ -1358,6 +1357,8 @@ fn ssz_decode_derive_stable_container(
13581357 let mut is_fixed_lens = vec ! [ ] ;
13591358 let mut fixed_lens = vec ! [ ] ;
13601359
1360+ let mut working_index: usize = 0 ;
1361+
13611362 for ( ty, ident, field_opts) in parse_ssz_fields ( struct_data) {
13621363 let ident = match ident {
13631364 Some ( ref ident) => ident,
@@ -1405,14 +1406,21 @@ fn ssz_decode_derive_stable_container(
14051406 from_ssz_bytes = quote ! { <#ty as ssz:: Decode >:: from_ssz_bytes( slice) } ;
14061407
14071408 register_types. push ( quote ! {
1408- builder. register_type:: <#ty>( ) ?
1409+ if bitvector. get( #working_index) . unwrap( ) {
1410+ builder. register_type:: <#ty>( ) ?;
1411+ }
14091412 } ) ;
14101413 decodes. push ( quote ! {
1411- decoder. decode_next( ) ?
1414+ let #ident = if bitvector. get( #working_index) . unwrap( ) {
1415+ decoder. decode_next( ) ?
1416+ } else {
1417+ None
1418+ } ;
14121419 } ) ;
14131420 }
14141421
14151422 fixed_decodes. push ( quote ! {
1423+ let #ident = if bitvector. get( #working_index) . unwrap( ) {
14161424 start = end;
14171425 end = end
14181426 . checked_add( #ssz_fixed_len)
@@ -1425,9 +1433,14 @@ fn ssz_decode_derive_stable_container(
14251433 expected: end
14261434 } ) ?;
14271435 #from_ssz_bytes?
1436+ } else {
1437+ None
1438+ } ;
14281439 } ) ;
14291440 is_fixed_lens. push ( is_ssz_fixed_len) ;
14301441 fixed_lens. push ( ssz_fixed_len) ;
1442+
1443+ working_index += 1 ;
14311444 }
14321445
14331446 let output = quote ! {
@@ -1465,14 +1478,8 @@ fn ssz_decode_derive_stable_container(
14651478 let mut start: usize = 0 ;
14661479 let mut end = start;
14671480
1468- let mut working_field: usize = 0 ;
14691481 #(
1470- let #field_names = if bitvector. get( working_field) . unwrap( ) {
1471- #fixed_decodes
1472- } else {
1473- None
1474- } ;
1475- working_field += 1 ;
1482+ #fixed_decodes
14761483 ) *
14771484
14781485 Ok ( Self {
@@ -1483,27 +1490,16 @@ fn ssz_decode_derive_stable_container(
14831490 } else {
14841491 let mut builder = ssz:: SszDecoderBuilder :: new( bytes) ;
14851492
1486- let mut working_field: usize = 0 ;
14871493 #(
1488- if bitvector. get( working_field) . unwrap( ) {
1489- #register_types
1490- }
1491- working_field += 1 ;
1494+ #register_types
14921495 ) *
14931496
14941497 let mut decoder = builder. build( ) ?;
14951498
1496- let mut working_field: usize = 0 ;
14971499 #(
1498- let #field_names = if bitvector. get( working_field) . unwrap( ) {
1499- #decodes
1500- } else {
1501- None
1502- } ;
1503- working_field += 1 ;
1500+ #decodes
15041501 ) *
15051502
1506-
15071503 Ok ( Self {
15081504 #(
15091505 #field_names,
@@ -1529,15 +1525,12 @@ fn ssz_decode_derive_profile_container(
15291525 let mut decodes = vec ! [ ] ;
15301526 let mut is_fixed_lens = vec ! [ ] ;
15311527 let mut fixed_lens = vec ! [ ] ;
1532- let mut optional_field_indices: Vec < usize > = vec ! [ ] ;
15331528 let mut optional_field_names: Vec < & Ident > = vec ! [ ] ;
15341529 // Since we use a truncated bitvector, we need to keep track of which optional field we are up
15351530 // to.
15361531 let mut working_optional_index: usize = 0 ;
15371532
1538- for ( field_index, ( ty, ident, field_opts) ) in
1539- parse_ssz_fields ( struct_data) . into_iter ( ) . enumerate ( )
1540- {
1533+ for ( ty, ident, field_opts) in parse_ssz_fields ( struct_data) {
15411534 let mut is_optional = false ;
15421535 let ident = match ident {
15431536 Some ( ref ident) => ident,
@@ -1565,7 +1558,6 @@ fn ssz_decode_derive_profile_container(
15651558
15661559 // Check if field is optional.
15671560 if ty_inner_type ( "Option" , ty) . is_some ( ) {
1568- optional_field_indices. push ( field_index) ;
15691561 optional_field_names. push ( ident) ;
15701562 is_optional = true ;
15711563 }
@@ -1583,18 +1575,9 @@ fn ssz_decode_derive_profile_container(
15831575 register_types. push ( quote ! {
15841576 builder. register_type_parameterized( #is_ssz_fixed_len, #ssz_fixed_len) ?;
15851577 } ) ;
1586- // If the field is optional, we need to check the bitvector before decoding.
1587- if is_optional {
1588- decodes. push ( quote ! {
1589- if bitvector. get( #working_optional_index) . unwrap( )
1590- if self . #ident. is_some( ) {
1591- let #ident = decoder. decode_next_with( |slice| #module:: from_ssz_bytes( slice) ) ?;
1592- } else {
1593- // Value is None so just decode an Option::default();
1594- let #ident = <_>:: default ( ) ;
1595- }
1596- } ) ;
1597- }
1578+ decodes. push ( quote ! {
1579+ let #ident = decoder. decode_next_with( |slice| #module:: from_ssz_bytes( slice) ) ?;
1580+ } ) ;
15981581 } else {
15991582 is_ssz_fixed_len = quote ! { <#ty as ssz:: Decode >:: is_ssz_fixed_len( ) } ;
16001583 ssz_fixed_len = quote ! { <#ty as ssz:: Decode >:: ssz_fixed_len( ) } ;
@@ -1603,9 +1586,19 @@ fn ssz_decode_derive_profile_container(
16031586 register_types. push ( quote ! {
16041587 builder. register_type:: <#ty>( ) ?;
16051588 } ) ;
1606- decodes. push ( quote ! {
1607- let #ident = decoder. decode_next( ) ?;
1608- } ) ;
1589+ if is_optional {
1590+ decodes. push ( quote ! {
1591+ let #ident = if bitvector. get( #working_optional_index) . unwrap( ) {
1592+ decoder. decode_next( ) ?
1593+ } else {
1594+ <_>:: default ( )
1595+ } ;
1596+ } ) ;
1597+ } else {
1598+ decodes. push ( quote ! {
1599+ let #ident = decoder. decode_next( ) ?;
1600+ } ) ;
1601+ }
16091602 }
16101603
16111604 // If the field is optional, we need to check the bitvector before decoding.
@@ -1653,6 +1646,8 @@ fn ssz_decode_derive_profile_container(
16531646 is_fixed_lens. push ( is_ssz_fixed_len) ;
16541647 fixed_lens. push ( ssz_fixed_len) ;
16551648 }
1649+
1650+ // Increment the working index so we check the next field of the bitvector.
16561651 if is_optional {
16571652 working_optional_index += 1
16581653 } ;
0 commit comments