Skip to content

Commit 2c85ede

Browse files
committed
Cleanup
1 parent 33d56f2 commit 2c85ede

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
@@ -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
};

ssz_derive/tests/tests.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,8 @@ struct Shape {
276276
#[ssz(struct_behaviour = "profile")]
277277
struct Square {
278278
side: u16,
279+
#[ssz(skip_serializing, skip_deserializing)]
280+
skip: Vec<u8>,
279281
color: u8,
280282
}
281283

@@ -292,7 +294,9 @@ struct Circle {
292294
struct ShapeVec {
293295
side: Option<u16>,
294296
color: Option<u8>,
295-
radius: Option<ssz_types::VariableList<u8, typenum::U8>>,
297+
#[ssz(skip_serializing, skip_deserializing)]
298+
skip: Vec<u8>,
299+
radius: Option<ssz_types::VariableList<u8, typenum::U4>>,
296300
}
297301

298302
#[test]
@@ -325,7 +329,11 @@ fn shape_2() {
325329
/// Square(side=0x42, color=1)
326330
/// 420001
327331
fn square() {
328-
let square = Square { side: 42, color: 1 };
332+
let square = Square {
333+
side: 42,
334+
skip: vec![],
335+
color: 1,
336+
};
329337

330338
assert_encode_decode(&square, &vec![42, 0, 1]);
331339
}
@@ -347,6 +355,7 @@ fn shape_3() {
347355
let shape = ShapeVec {
348356
side: None,
349357
color: Some(1),
358+
skip: vec![],
350359
radius: Some(vec![1, 2, 3, 4].into()),
351360
};
352361

0 commit comments

Comments
 (0)