Skip to content

Commit d767785

Browse files
committed
Cleanup
1 parent a7f3ada commit d767785

File tree

2 files changed

+49
-45
lines changed

2 files changed

+49
-45
lines changed

ssz_derive/src/lib.rs

Lines changed: 38 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -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
};

ssz_derive/tests/tests.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,8 @@ struct Shape {
268268
#[ssz(struct_behaviour = "profile")]
269269
struct Square {
270270
side: u16,
271+
#[ssz(skip_serializing, skip_deserializing)]
272+
skip: Vec<u8>,
271273
color: u8,
272274
}
273275

@@ -284,7 +286,9 @@ struct Circle {
284286
struct ShapeVec {
285287
side: Option<u16>,
286288
color: Option<u8>,
287-
radius: Option<ssz_types::VariableList<u8, typenum::U8>>,
289+
#[ssz(skip_serializing, skip_deserializing)]
290+
skip: Vec<u8>,
291+
radius: Option<ssz_types::VariableList<u8, typenum::U4>>,
288292
}
289293

290294
#[test]
@@ -317,7 +321,11 @@ fn shape_2() {
317321
/// Square(side=0x42, color=1)
318322
/// 420001
319323
fn square() {
320-
let square = Square { side: 42, color: 1 };
324+
let square = Square {
325+
side: 42,
326+
skip: vec![],
327+
color: 1,
328+
};
321329

322330
assert_encode_decode(&square, &vec![42, 0, 1]);
323331
}
@@ -339,6 +347,7 @@ fn shape_3() {
339347
let shape = ShapeVec {
340348
side: None,
341349
color: Some(1),
350+
skip: vec![],
342351
radius: Some(vec![1, 2, 3, 4].into()),
343352
};
344353

0 commit comments

Comments
 (0)