Skip to content

Commit 83e9077

Browse files
committed
feat: refactor to remove deserialize_newtype_struct
Also update example because we do not change fdt binary anymore. Signed-off-by: Woshiluo Luo <woshiluo.luo@outlook.com>
1 parent c4574b4 commit 83e9077

File tree

4 files changed

+36
-159
lines changed

4 files changed

+36
-159
lines changed

examples/qemu-virt.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ fn main() -> Result<(), Error> {
142142

143143
// 解析过程中,设备树的内容被修改了。
144144
// 因此若要以其他方式再次访问设备树,先将这次解析的结果释放。
145-
assert_ne!(slice, RAW_DEVICE_TREE);
145+
// assert_ne!(slice, RAW_DEVICE_TREE);
146146
}
147147
// 释放后,内存会恢复原状。
148148
assert_eq!(slice, RAW_DEVICE_TREE);

src/de_mut/data.rs

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -239,37 +239,7 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
239239
if name == super::VALUE_DESERIALIZER_NAME {
240240
return visitor.visit_newtype_struct(self);
241241
}
242-
match self.cursor {
243-
ValueCursor::Prop(_, cursor) => match name {
244-
"StrSeq" => {
245-
let inner = super::str_seq::Inner {
246-
dtb: self.dtb,
247-
cursor,
248-
};
249-
visitor.visit_borrowed_bytes(unsafe {
250-
core::slice::from_raw_parts(
251-
&inner as *const _ as *const u8,
252-
core::mem::size_of_val(&inner),
253-
)
254-
})
255-
}
256-
"Reg" => {
257-
let inner = super::reg::Inner {
258-
dtb: self.dtb,
259-
reg: self.reg,
260-
cursor,
261-
};
262-
visitor.visit_borrowed_bytes(unsafe {
263-
core::slice::from_raw_parts(
264-
&inner as *const _ as *const u8,
265-
core::mem::size_of_val(&inner),
266-
)
267-
})
268-
}
269-
_ => visitor.visit_newtype_struct(self),
270-
},
271-
ValueCursor::Body(_) => visitor.visit_newtype_struct(self),
272-
}
242+
unreachable!("unknown newtype struct");
273243
}
274244

275245
fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>

src/de_mut/reg.rs

Lines changed: 12 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::{PropCursor, RefDtb, StructureBlock, BLOCK_LEN};
1+
use super::{PropCursor, RefDtb, StructureBlock, ValueCursor, ValueDeserializer, BLOCK_LEN};
22
use core::{fmt::Debug, marker::PhantomData, mem::MaybeUninit, ops::Range};
33
use serde::{de, Deserialize};
44

@@ -40,58 +40,24 @@ impl<'de> Deserialize<'de> for Reg<'_> {
4040
where
4141
D: serde::Deserializer<'de>,
4242
{
43-
struct Visitor<'de, 'b> {
44-
marker: PhantomData<Reg<'b>>,
45-
lifetime: PhantomData<&'de ()>,
46-
}
47-
impl<'de, 'b> de::Visitor<'de> for Visitor<'de, 'b> {
48-
type Value = Reg<'b>;
49-
50-
fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
51-
write!(formatter, "struct Reg")
52-
}
43+
let value_deserialzer = super::ValueDeserializer::deserialize(deserializer)?;
5344

54-
fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
55-
where
56-
E: de::Error,
57-
{
58-
// 结构体转为内存切片,然后拷贝过来
59-
if v.len() == core::mem::size_of::<Self::Value>() {
60-
Ok(Self::Value::from_raw_parts(v.as_ptr()))
61-
} else {
62-
Err(E::invalid_length(
63-
v.len(),
64-
&"`Reg` is copied with wrong size.",
65-
))
45+
let inner = Inner {
46+
dtb: value_deserialzer.dtb,
47+
reg: value_deserialzer.reg,
48+
cursor: match value_deserialzer.cursor {
49+
ValueCursor::Prop(_, cursor) => cursor,
50+
_ => {
51+
unreachable!("Reg Deserialize should only be called by prop cursor")
6652
}
67-
}
68-
}
69-
70-
serde::Deserializer::deserialize_newtype_struct(
71-
deserializer,
72-
"Reg",
73-
Visitor {
74-
marker: PhantomData,
75-
lifetime: PhantomData,
7653
},
77-
)
54+
};
55+
56+
Ok(Self(inner))
7857
}
7958
}
8059

8160
impl Reg<'_> {
82-
fn from_raw_parts(ptr: *const u8) -> Self {
83-
// 直接从指针拷贝
84-
unsafe {
85-
let mut res = MaybeUninit::<Self>::uninit();
86-
core::ptr::copy_nonoverlapping(
87-
ptr,
88-
res.as_mut_ptr() as *mut _,
89-
core::mem::size_of::<Self>(),
90-
);
91-
res.assume_init()
92-
}
93-
}
94-
9561
pub fn iter(&self) -> RegIter {
9662
RegIter {
9763
data: self.0.cursor.data_on(self.0.dtb),

src/de_mut/str_seq.rs

Lines changed: 22 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
use super::{PropCursor, RefDtb};
2-
use core::{fmt::Debug, marker::PhantomData, mem::MaybeUninit};
3-
use serde::{de, Deserialize};
1+
use super::{PropCursor, RefDtb, ValueCursor, ValueDeserializer};
2+
use core::{fmt::Debug, mem::MaybeUninit};
3+
use serde::Deserialize;
44

55
/// 一组 '\0' 分隔字符串的映射。
66
///
@@ -31,70 +31,23 @@ impl<'de> Deserialize<'de> for StrSeq<'_> {
3131
where
3232
D: serde::Deserializer<'de>,
3333
{
34-
struct Visitor<'de, 'b> {
35-
marker: PhantomData<StrSeq<'b>>,
36-
lifetime: PhantomData<&'de ()>,
37-
}
38-
impl<'de, 'b> de::Visitor<'de> for Visitor<'de, 'b> {
39-
type Value = StrSeq<'b>;
40-
41-
fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
42-
write!(formatter, "struct StrSeq")
43-
}
34+
let value_deserialzer = super::ValueDeserializer::deserialize(deserializer)?;
4435

45-
fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
46-
where
47-
E: de::Error,
48-
{
49-
// 结构体转为内存切片,然后拷贝过来
50-
if v.len() == core::mem::size_of::<Self::Value>() {
51-
Ok(Self::Value::from_raw_parts(v.as_ptr()))
52-
} else {
53-
Err(E::invalid_length(
54-
v.len(),
55-
&"`StrSeq` is copied with wrong size.",
56-
))
36+
let inner = Inner {
37+
dtb: value_deserialzer.dtb,
38+
cursor: match value_deserialzer.cursor {
39+
ValueCursor::Prop(_, cursor) => cursor,
40+
_ => {
41+
unreachable!("Reg Deserialize should only be called by prop cursor")
5742
}
58-
}
59-
}
60-
61-
serde::Deserializer::deserialize_newtype_struct(
62-
deserializer,
63-
"StrSeq",
64-
Visitor {
65-
marker: PhantomData,
66-
lifetime: PhantomData,
6743
},
68-
)
44+
};
45+
46+
Ok(Self(inner))
6947
}
7048
}
7149

7250
impl StrSeq<'_> {
73-
fn from_raw_parts(ptr: *const u8) -> Self {
74-
// 直接从指针拷贝
75-
let res = unsafe {
76-
let mut res = MaybeUninit::<Self>::uninit();
77-
core::ptr::copy_nonoverlapping(
78-
ptr,
79-
res.as_mut_ptr() as *mut _,
80-
core::mem::size_of::<Self>(),
81-
);
82-
res.assume_init()
83-
};
84-
// 初始化
85-
res.0.cursor.operate_on(res.0.dtb, |data| {
86-
let mut i = data.len() - 1;
87-
for j in (0..data.len() - 1).rev() {
88-
if data[j] == b'\0' {
89-
data[i] = (i - j - 1) as _;
90-
i = j;
91-
}
92-
}
93-
data[i] = i as u8;
94-
});
95-
res
96-
}
97-
9851
/// 构造一个可访问每个字符串的迭代器。
9952
pub fn iter(&self) -> StrSeqIter {
10053
StrSeqIter {
@@ -125,27 +78,15 @@ impl<'de> Iterator for StrSeqIter<'de> {
12578
if self.data.is_empty() {
12679
None
12780
} else {
128-
let len = *self.data.last().unwrap() as usize;
129-
let (a, b) = self.data.split_at(self.data.len() - len - 1);
130-
self.data = a;
131-
Some(unsafe { core::str::from_utf8_unchecked(&b[..len]) })
81+
let pos = self
82+
.data
83+
.iter()
84+
.position(|&x| x == b'\0')
85+
.unwrap_or_else(|| self.data.len());
86+
let (a, b) = self.data.split_at(pos + 1);
87+
self.data = b;
88+
// Remove \0 at end
89+
Some(unsafe { core::str::from_utf8_unchecked(&a[..a.len() - 1]) })
13290
}
13391
}
13492
}
135-
136-
impl Drop for StrSeq<'_> {
137-
fn drop(&mut self) {
138-
self.0.cursor.operate_on(self.0.dtb, |data| {
139-
let mut idx = data.len() - 1;
140-
loop {
141-
let len = data[idx] as usize;
142-
data[idx] = 0;
143-
if idx > len {
144-
idx -= len + 1;
145-
} else {
146-
break;
147-
}
148-
}
149-
})
150-
}
151-
}

0 commit comments

Comments
 (0)