Skip to content

Commit 7c57ba6

Browse files
authored
fix: wrong level set when serialize (#17)
* fix: wrong level set when serialize chore: bump & lock dyn_serde version Signed-off-by: Woshiluo Luo <woshiluo.luo@outlook.com> * feat: support serialize unit Also update example Signed-off-by: Woshiluo Luo <woshiluo.luo@outlook.com> --------- Signed-off-by: Woshiluo Luo <woshiluo.luo@outlook.com>
2 parents d4af625 + 805718b commit 7c57ba6

File tree

6 files changed

+68
-20
lines changed

6 files changed

+68
-20
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ edition = "2024"
1515

1616
[dependencies]
1717
serde = { version = "1.0", default-features = false, features = ["derive"] }
18-
dyn_serde = { version = "1.0.2", default-features = false, optional = true }
18+
dyn_serde = { version = "=1.1.2", default-features = false, optional = true }
1919

2020
[features]
2121
default = ["std", "ser"]

examples/serialize.rs

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::io::prelude::*;
33

44
use serde_device_tree::ser::serializer::ValueType;
55

6-
const MAX_SIZE: usize = 256 + 32;
6+
const MAX_SIZE: usize = 1024;
77

88
fn main() {
99
#[derive(Serialize)]
@@ -17,13 +17,38 @@ fn main() {
1717
struct Base1 {
1818
pub hello: &'static str,
1919
}
20+
#[derive(Serialize)]
21+
struct ReversedMemory {
22+
#[serde(rename = "#address-cells")]
23+
pub address_cell: u32,
24+
#[serde(rename = "#size-cells")]
25+
pub size_cell: u32,
26+
pub ranges: (),
27+
}
28+
#[derive(Serialize)]
29+
struct ReversedMemoryItem {
30+
pub reg: [u32; 4],
31+
}
2032
let mut buf1 = [0u8; MAX_SIZE];
2133

2234
{
23-
let new_base = Base1 { hello: "added" };
24-
let patch =
25-
serde_device_tree::ser::patch::Patch::new("/base3", &new_base as _, ValueType::Node);
26-
let list = [patch];
35+
let new_base = ReversedMemory {
36+
address_cell: 2,
37+
size_cell: 2,
38+
ranges: (),
39+
};
40+
let new_base_2 = ReversedMemoryItem { reg: [0, 1, 0, 20] };
41+
let patch1 = serde_device_tree::ser::patch::Patch::new(
42+
"/reversed-memory",
43+
&new_base as _,
44+
ValueType::Node,
45+
);
46+
let patch2 = serde_device_tree::ser::patch::Patch::new(
47+
"/reversed-memory/mmode_resv1@0",
48+
&new_base_2 as _,
49+
ValueType::Node,
50+
);
51+
let list = [patch1, patch2];
2752
let base = Base {
2853
hello: 0xdeedbeef,
2954
base1: Base1 {

src/de.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ struct DeviceTree {
9797
}
9898

9999
impl DeviceTree {
100-
pub fn tags(&self) -> Tags {
100+
pub fn tags(&self) -> Tags<'_> {
101101
let structure_addr = (u32::from_be(self.header.off_dt_struct) - HEADER_LEN) as usize;
102102
let structure_len = u32::from_be(self.header.size_dt_struct) as usize;
103103
let strings_addr = (u32::from_be(self.header.off_dt_strings) - HEADER_LEN) as usize;

src/de_mut/reg.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ impl<'de> Deserialize<'de> for Reg<'_> {
5858
}
5959

6060
impl Reg<'_> {
61-
pub fn iter(&self) -> RegIter {
61+
pub fn iter(&self) -> RegIter<'_> {
6262
RegIter {
6363
data: self.0.cursor.data_on(self.0.dtb),
6464
config: self.0.reg,

src/ser/patch.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ impl<'se> Patch<'se> {
5656

5757
#[inline(always)]
5858
pub fn get_depth_path(&self, x: usize) -> &'se str {
59-
self.name.split('/').nth(x - 1).unwrap_or_default()
59+
self.name.split('/').nth(x).unwrap_or_default()
6060
}
6161

6262
// I hope to impl serde::ser::Serializer, but erase_serialize's return value is different from
@@ -66,7 +66,7 @@ impl<'se> Patch<'se> {
6666
pub fn serialize(&self, serializer: Serializer<'_, 'se>) {
6767
self.parsed.set(true);
6868
self.data
69-
.serialize_dyn(&mut <dyn dyn_serde::Serializer>::new(serializer))
69+
.dyn_serialize(&mut <dyn dyn_serde::Serializer>::new(serializer))
7070
.unwrap();
7171
}
7272
}

src/ser/serializer.rs

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,17 @@ impl<'a, 'se> Serializer<'a, 'se> {
6969
}
7070
}
7171

72+
#[inline(always)]
73+
pub fn get_origin(self) -> Serializer<'a, 'se> {
74+
Serializer {
75+
ser: self.ser,
76+
current_dep: self.current_dep,
77+
current_name: self.current_name,
78+
prop_token_offset: 0,
79+
overwrite_patch: None,
80+
}
81+
}
82+
7283
#[inline(always)]
7384
pub fn get_next_ref<'b>(&'b mut self) -> Serializer<'b, 'se> {
7485
Serializer {
@@ -79,6 +90,17 @@ impl<'a, 'se> Serializer<'a, 'se> {
7990
overwrite_patch: None,
8091
}
8192
}
93+
94+
#[inline(always)]
95+
pub fn get_origin_ref<'b>(&'b mut self) -> Serializer<'b, 'se> {
96+
Serializer {
97+
ser: self.ser,
98+
current_dep: self.current_dep,
99+
current_name: self.current_name,
100+
prop_token_offset: 0,
101+
overwrite_patch: None,
102+
}
103+
}
82104
}
83105

84106
trait SerializeDynamicField<'se> {
@@ -96,7 +118,7 @@ trait SerializeDynamicField<'se> {
96118
impl<'se> SerializeDynamicField<'se> for Serializer<'_, 'se> {
97119
fn start_node(&mut self) -> Result<(), Error> {
98120
self.ser.dst.step_by_u32(FDT_BEGIN_NODE);
99-
if self.current_dep == 1 {
121+
if self.current_dep == 0 {
100122
// The name of root node should be empty.
101123
self.ser.dst.step_by_u32(0);
102124
} else {
@@ -109,10 +131,11 @@ impl<'se> SerializeDynamicField<'se> for Serializer<'_, 'se> {
109131
fn end_node(&mut self) -> Result<(), Error> {
110132
for patch in self.ser.patch_list.add_list(self.current_dep) {
111133
let key = patch.get_depth_path(self.current_dep + 1);
112-
self.serialize_dynamic_field(key, patch.data)?;
134+
let mut ser = self.get_next_ref();
135+
ser.serialize_dynamic_field(key, patch.data)?;
113136
}
114137
self.ser.dst.step_by_u32(FDT_END_NODE);
115-
if self.current_dep == 1 {
138+
if self.current_dep == 0 {
116139
self.ser.dst.step_by_u32(FDT_END);
117140
}
118141

@@ -131,12 +154,12 @@ impl<'se> SerializeDynamicField<'se> for Serializer<'_, 'se> {
131154
{
132155
let value_type = match self.overwrite_patch {
133156
Some(data) => {
134-
let ser = self.get_next_ref();
157+
let ser = self.get_origin_ref();
135158
data.serialize(ser);
136159
data.patch_type
137160
}
138161
None => {
139-
let ser = self.get_next_ref();
162+
let ser = self.get_origin_ref();
140163
value.serialize(ser)?.0
141164
}
142165
};
@@ -259,7 +282,7 @@ impl serde::ser::SerializeSeq for Serializer<'_, '_> {
259282
where
260283
T: ?Sized + serde::ser::Serialize,
261284
{
262-
value.serialize(self.get_next_ref())?;
285+
value.serialize(self.get_origin_ref())?;
263286
Ok(())
264287
}
265288

@@ -277,7 +300,7 @@ impl serde::ser::SerializeTuple for Serializer<'_, '_> {
277300
where
278301
T: ?Sized + serde::ser::Serialize,
279302
{
280-
value.serialize(self.get_next_ref())?;
303+
value.serialize(self.get_origin_ref())?;
281304
Ok(())
282305
}
283306

@@ -403,7 +426,7 @@ impl<'se> serde::ser::Serializer for Serializer<'_, 'se> {
403426
}
404427

405428
fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
406-
todo!("unit");
429+
Ok((ValueType::Prop, self.ser.dst.get_offset()))
407430
}
408431

409432
fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
@@ -475,7 +498,7 @@ impl<'se> serde::ser::Serializer for Serializer<'_, 'se> {
475498
}
476499

477500
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
478-
let mut ser = self.get_next();
501+
let mut ser = self.get_origin();
479502
ser.start_node()?;
480503
Ok(ser)
481504
}
@@ -485,7 +508,7 @@ impl<'se> serde::ser::Serializer for Serializer<'_, 'se> {
485508
_name: &'static str,
486509
_len: usize,
487510
) -> Result<Self::SerializeStruct, Self::Error> {
488-
let mut ser = self.get_next();
511+
let mut ser = self.get_origin();
489512
ser.start_node()?;
490513
Ok(ser)
491514
}

0 commit comments

Comments
 (0)