Skip to content

Commit a74f0d2

Browse files
committed
feat: rename prop_iter node_iter to nodes and props
fix: remove copy_from_raw_parts when convert from struct to node Signed-off-by: Woshiluo Luo <woshiluo.luo@outlook.com>
1 parent 6dace65 commit a74f0d2

File tree

3 files changed

+32
-34
lines changed

3 files changed

+32
-34
lines changed

examples/qemu-virt.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,14 +132,14 @@ fn main() -> Result<(), Error> {
132132
);
133133
}
134134

135-
for current_node in t.soc.node_iter().unwrap() {
135+
for current_node in t.soc.nodes().unwrap() {
136136
if current_node.get_split_name().0 == "virtio_mmio" {
137137
let mmio = current_node.deserialize::<VirtIoMmio>();
138138
println!("{:?} {:?}", current_node.get_split_name(), mmio.reg);
139139
}
140140
}
141-
for current_node in t.soc.prop_iter().unwrap() {
142-
println!("{}", current_node.get_name());
141+
for current_prop in t.soc.props().unwrap() {
142+
println!("{}", current_prop.get_name());
143143
}
144144

145145
// 解析过程中,设备树的内容被修改了。

src/de_mut/node.rs

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
use super::{BodyCursor, Cursor, PropCursor, RefDtb, RegConfig, StructDeserializer};
1+
use super::{
2+
BodyCursor, BorrowedValueDeserializer, Cursor, PropCursor, RefDtb, RegConfig,
3+
StructDeserializer,
4+
};
25
use core::marker::PhantomData;
36
use serde::{de, Deserialize};
47

@@ -44,8 +47,10 @@ pub struct PropItem<'de> {
4447
}
4548

4649
impl<'de> Node<'de> {
47-
pub unsafe fn covnert_from_struct_deseriallizer_pointer(ptr: *const u8) -> Self {
48-
let struct_deseriallizer = unsafe { &*(ptr as *const StructDeserializer) };
50+
unsafe fn covnert_from_struct_deseriallizer_pointer(
51+
ptr: *const &StructDeserializer<'de>,
52+
) -> Self {
53+
let struct_deseriallizer = &*(ptr);
4954
println!("get node from {:?}", struct_deseriallizer.cursor);
5055
let dtb = struct_deseriallizer.dtb;
5156
let mut cursor = struct_deseriallizer.cursor;
@@ -83,7 +88,7 @@ impl<'de> Node<'de> {
8388
}
8489
}
8590
/// 获得节点迭代器。
86-
pub const fn node_iter<'b>(&'b self) -> Option<NodeIter<'de, 'b>> {
91+
pub const fn nodes<'b>(&'b self) -> Option<NodeIter<'de, 'b>> {
8792
match self.nodes_start {
8893
None => None,
8994
Some(node_cursor) => Some(NodeIter {
@@ -95,7 +100,7 @@ impl<'de> Node<'de> {
95100
}
96101

97102
/// 获得属性迭代器。
98-
pub const fn prop_iter<'b>(&'b self) -> Option<PropIter<'de, 'b>> {
103+
pub const fn props<'b>(&'b self) -> Option<PropIter<'de, 'b>> {
99104
match self.nodes_start {
100105
None => None,
101106
Some(node_cursor) => Some(PropIter {
@@ -165,24 +170,19 @@ impl<'de, 'b> Deserialize<'de> for Node<'b> {
165170
type Value = Node<'b>;
166171

167172
fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
168-
write!(formatter, "struct StrSeq")
173+
write!(formatter, "struct Node")
169174
}
170175

171-
fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
176+
fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
172177
where
173-
E: de::Error,
178+
D: de::Deserializer<'de>,
174179
{
175-
// 结构体转为内存切片,然后拷贝过来
176-
if v.len() == core::mem::size_of::<StructDeserializer>() {
177-
Ok(unsafe {
178-
Self::Value::covnert_from_struct_deseriallizer_pointer(v.as_ptr())
179-
})
180-
} else {
181-
Err(E::invalid_length(
182-
v.len(),
183-
&"`Node` is copied with wrong size.",
184-
))
185-
}
180+
Ok(unsafe {
181+
Node::covnert_from_struct_deseriallizer_pointer(core::ptr::addr_of!(
182+
deserializer
183+
)
184+
as *const &StructDeserializer)
185+
})
186186
}
187187
}
188188

@@ -230,4 +230,12 @@ impl<'de> PropItem<'de> {
230230
pub fn get_name(&self) -> &str {
231231
self.name
232232
}
233+
pub fn deserialize<T: Deserialize<'de>>(&self) -> T {
234+
T::deserialize(&mut BorrowedValueDeserializer {
235+
dtb: self.dtb,
236+
reg: self.reg,
237+
cursor: self.prop,
238+
})
239+
.unwrap()
240+
}
233241
}

src/de_mut/struct.rs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -157,23 +157,13 @@ impl<'de, 'b> de::Deserializer<'de> for &'b mut StructDeserializer<'de> {
157157

158158
fn deserialize_newtype_struct<V>(
159159
self,
160-
name: &'static str,
160+
_name: &'static str,
161161
visitor: V,
162162
) -> Result<V::Value, Self::Error>
163163
where
164164
V: de::Visitor<'de>,
165165
{
166-
if name == "Node" {
167-
visitor.visit_borrowed_bytes(unsafe {
168-
// TODO: try remove copy from parts
169-
core::slice::from_raw_parts(
170-
self as *const _ as *const u8,
171-
core::mem::size_of::<StructDeserializer<'_>>(),
172-
)
173-
})
174-
} else {
175-
visitor.visit_newtype_struct(self)
176-
}
166+
visitor.visit_newtype_struct(self)
177167
}
178168

179169
fn deserialize_seq<V>(self, _visitor: V) -> Result<V::Value, Self::Error>

0 commit comments

Comments
 (0)