From 1aa76bdf785d65f534880c420a44e89c8b56aac4 Mon Sep 17 00:00:00 2001 From: Woshiluo Luo Date: Sun, 31 Aug 2025 23:41:09 +0800 Subject: [PATCH 1/2] fix: wrong level set when serialize chore: bump & lock dyn_serde version Signed-off-by: Woshiluo Luo --- Cargo.toml | 2 +- examples/serialize.rs | 2 +- src/de.rs | 2 +- src/de_mut/reg.rs | 2 +- src/ser/patch.rs | 4 ++-- src/ser/serializer.rs | 41 ++++++++++++++++++++++++++++++++--------- 6 files changed, 38 insertions(+), 15 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b73c02f..d160a2e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,7 @@ edition = "2024" [dependencies] serde = { version = "1.0", default-features = false, features = ["derive"] } -dyn_serde = { version = "1.0.2", default-features = false, optional = true } +dyn_serde = { version = "=1.1.2", default-features = false, optional = true } [features] default = ["std", "ser"] diff --git a/examples/serialize.rs b/examples/serialize.rs index 14a6247..97edda5 100644 --- a/examples/serialize.rs +++ b/examples/serialize.rs @@ -3,7 +3,7 @@ use std::io::prelude::*; use serde_device_tree::ser::serializer::ValueType; -const MAX_SIZE: usize = 256 + 32; +const MAX_SIZE: usize = 1024; fn main() { #[derive(Serialize)] diff --git a/src/de.rs b/src/de.rs index a5ff2c7..93ed378 100644 --- a/src/de.rs +++ b/src/de.rs @@ -97,7 +97,7 @@ struct DeviceTree { } impl DeviceTree { - pub fn tags(&self) -> Tags { + pub fn tags(&self) -> Tags<'_> { let structure_addr = (u32::from_be(self.header.off_dt_struct) - HEADER_LEN) as usize; let structure_len = u32::from_be(self.header.size_dt_struct) as usize; let strings_addr = (u32::from_be(self.header.off_dt_strings) - HEADER_LEN) as usize; diff --git a/src/de_mut/reg.rs b/src/de_mut/reg.rs index eb5504d..445d8c4 100644 --- a/src/de_mut/reg.rs +++ b/src/de_mut/reg.rs @@ -58,7 +58,7 @@ impl<'de> Deserialize<'de> for Reg<'_> { } impl Reg<'_> { - pub fn iter(&self) -> RegIter { + pub fn iter(&self) -> RegIter<'_> { RegIter { data: self.0.cursor.data_on(self.0.dtb), config: self.0.reg, diff --git a/src/ser/patch.rs b/src/ser/patch.rs index f6e4c52..50708c3 100644 --- a/src/ser/patch.rs +++ b/src/ser/patch.rs @@ -56,7 +56,7 @@ impl<'se> Patch<'se> { #[inline(always)] pub fn get_depth_path(&self, x: usize) -> &'se str { - self.name.split('/').nth(x - 1).unwrap_or_default() + self.name.split('/').nth(x).unwrap_or_default() } // I hope to impl serde::ser::Serializer, but erase_serialize's return value is different from @@ -66,7 +66,7 @@ impl<'se> Patch<'se> { pub fn serialize(&self, serializer: Serializer<'_, 'se>) { self.parsed.set(true); self.data - .serialize_dyn(&mut ::new(serializer)) + .dyn_serialize(&mut ::new(serializer)) .unwrap(); } } diff --git a/src/ser/serializer.rs b/src/ser/serializer.rs index 84fb0bf..2ca70f2 100644 --- a/src/ser/serializer.rs +++ b/src/ser/serializer.rs @@ -69,6 +69,17 @@ impl<'a, 'se> Serializer<'a, 'se> { } } + #[inline(always)] + pub fn get_origin(self) -> Serializer<'a, 'se> { + Serializer { + ser: self.ser, + current_dep: self.current_dep, + current_name: self.current_name, + prop_token_offset: 0, + overwrite_patch: None, + } + } + #[inline(always)] pub fn get_next_ref<'b>(&'b mut self) -> Serializer<'b, 'se> { Serializer { @@ -79,6 +90,17 @@ impl<'a, 'se> Serializer<'a, 'se> { overwrite_patch: None, } } + + #[inline(always)] + pub fn get_origin_ref<'b>(&'b mut self) -> Serializer<'b, 'se> { + Serializer { + ser: self.ser, + current_dep: self.current_dep, + current_name: self.current_name, + prop_token_offset: 0, + overwrite_patch: None, + } + } } trait SerializeDynamicField<'se> { @@ -96,7 +118,7 @@ trait SerializeDynamicField<'se> { impl<'se> SerializeDynamicField<'se> for Serializer<'_, 'se> { fn start_node(&mut self) -> Result<(), Error> { self.ser.dst.step_by_u32(FDT_BEGIN_NODE); - if self.current_dep == 1 { + if self.current_dep == 0 { // The name of root node should be empty. self.ser.dst.step_by_u32(0); } else { @@ -109,10 +131,11 @@ impl<'se> SerializeDynamicField<'se> for Serializer<'_, 'se> { fn end_node(&mut self) -> Result<(), Error> { for patch in self.ser.patch_list.add_list(self.current_dep) { let key = patch.get_depth_path(self.current_dep + 1); - self.serialize_dynamic_field(key, patch.data)?; + let mut ser = self.get_next_ref(); + ser.serialize_dynamic_field(key, patch.data)?; } self.ser.dst.step_by_u32(FDT_END_NODE); - if self.current_dep == 1 { + if self.current_dep == 0 { self.ser.dst.step_by_u32(FDT_END); } @@ -131,12 +154,12 @@ impl<'se> SerializeDynamicField<'se> for Serializer<'_, 'se> { { let value_type = match self.overwrite_patch { Some(data) => { - let ser = self.get_next_ref(); + let ser = self.get_origin_ref(); data.serialize(ser); data.patch_type } None => { - let ser = self.get_next_ref(); + let ser = self.get_origin_ref(); value.serialize(ser)?.0 } }; @@ -259,7 +282,7 @@ impl serde::ser::SerializeSeq for Serializer<'_, '_> { where T: ?Sized + serde::ser::Serialize, { - value.serialize(self.get_next_ref())?; + value.serialize(self.get_origin_ref())?; Ok(()) } @@ -277,7 +300,7 @@ impl serde::ser::SerializeTuple for Serializer<'_, '_> { where T: ?Sized + serde::ser::Serialize, { - value.serialize(self.get_next_ref())?; + value.serialize(self.get_origin_ref())?; Ok(()) } @@ -475,7 +498,7 @@ impl<'se> serde::ser::Serializer for Serializer<'_, 'se> { } fn serialize_map(self, _len: Option) -> Result { - let mut ser = self.get_next(); + let mut ser = self.get_origin(); ser.start_node()?; Ok(ser) } @@ -485,7 +508,7 @@ impl<'se> serde::ser::Serializer for Serializer<'_, 'se> { _name: &'static str, _len: usize, ) -> Result { - let mut ser = self.get_next(); + let mut ser = self.get_origin(); ser.start_node()?; Ok(ser) } From 805718b71cbeb9bec4a1bc53fcf71f69450e9490 Mon Sep 17 00:00:00 2001 From: Woshiluo Luo Date: Mon, 1 Sep 2025 00:54:44 +0800 Subject: [PATCH 2/2] feat: support serialize unit Also update example Signed-off-by: Woshiluo Luo --- examples/serialize.rs | 33 +++++++++++++++++++++++++++++---- src/ser/serializer.rs | 2 +- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/examples/serialize.rs b/examples/serialize.rs index 97edda5..2734b8d 100644 --- a/examples/serialize.rs +++ b/examples/serialize.rs @@ -17,13 +17,38 @@ fn main() { struct Base1 { pub hello: &'static str, } + #[derive(Serialize)] + struct ReversedMemory { + #[serde(rename = "#address-cells")] + pub address_cell: u32, + #[serde(rename = "#size-cells")] + pub size_cell: u32, + pub ranges: (), + } + #[derive(Serialize)] + struct ReversedMemoryItem { + pub reg: [u32; 4], + } let mut buf1 = [0u8; MAX_SIZE]; { - let new_base = Base1 { hello: "added" }; - let patch = - serde_device_tree::ser::patch::Patch::new("/base3", &new_base as _, ValueType::Node); - let list = [patch]; + let new_base = ReversedMemory { + address_cell: 2, + size_cell: 2, + ranges: (), + }; + let new_base_2 = ReversedMemoryItem { reg: [0, 1, 0, 20] }; + let patch1 = serde_device_tree::ser::patch::Patch::new( + "/reversed-memory", + &new_base as _, + ValueType::Node, + ); + let patch2 = serde_device_tree::ser::patch::Patch::new( + "/reversed-memory/mmode_resv1@0", + &new_base_2 as _, + ValueType::Node, + ); + let list = [patch1, patch2]; let base = Base { hello: 0xdeedbeef, base1: Base1 { diff --git a/src/ser/serializer.rs b/src/ser/serializer.rs index 2ca70f2..2b982f3 100644 --- a/src/ser/serializer.rs +++ b/src/ser/serializer.rs @@ -426,7 +426,7 @@ impl<'se> serde::ser::Serializer for Serializer<'_, 'se> { } fn serialize_unit(self) -> Result { - todo!("unit"); + Ok((ValueType::Prop, self.ser.dst.get_offset())) } fn serialize_unit_struct(self, _name: &'static str) -> Result {