Skip to content

Commit 6d152e0

Browse files
authored
Merge pull request #9 from woshiluo/builtin
Refactor to minimize newtype struct & unsafe
2 parents 1ca431a + 097e294 commit 6d152e0

File tree

11 files changed

+216
-306
lines changed

11 files changed

+216
-306
lines changed

examples/qemu-virt.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ fn main() -> Result<(), Error> {
103103

104104
{
105105
// 解析!
106-
let t: Tree = from_raw_mut(&dtb).unwrap();
106+
let root: Node = from_raw_mut(&dtb).unwrap();
107+
let t: Tree = root.deserialize();
107108

108109
println!("model = {:?}", t.model);
109110
println!("compatible = {:?}", t.compatible);
@@ -133,7 +134,7 @@ fn main() -> Result<(), Error> {
133134
}
134135

135136
println!("{:?}", t.soc);
136-
for current_node in t.soc.nodes().unwrap() {
137+
for current_node in t.soc.nodes() {
137138
if current_node.get_parsed_name().0 == "virtio_mmio" {
138139
let mmio = current_node.deserialize::<VirtIoMmio>();
139140
println!("{:?} {:?}", current_node.get_parsed_name(), mmio.reg);
@@ -142,7 +143,7 @@ fn main() -> Result<(), Error> {
142143

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

src/de.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use serde::de;
3131
/// # Example
3232
///
3333
/// ```
34-
/// # static RAW_DEVICE_TREE: &'static [u8] = include_bytes!("../examples/hifive-unmatched-a00.dtb");
34+
/// # const RAW_DEVICE_TREE: &'static [u8] = include_bytes!("../examples/hifive-unmatched-a00.dtb");
3535
/// # const BUFFER_SIZE: usize = RAW_DEVICE_TREE.len();
3636
/// # #[repr(align(4))]
3737
/// # struct AlignedBuffer {
@@ -521,7 +521,7 @@ mod tests {
521521
#[cfg(any(feature = "std", feature = "alloc"))]
522522
#[test]
523523
fn error_invalid_magic() {
524-
static DEVICE_TREE: &[u8] = &[0x11, 0x22, 0x33, 0x44]; // not device tree blob format
524+
const DEVICE_TREE: &[u8] = &[0x11, 0x22, 0x33, 0x44]; // not device tree blob format
525525
const DEVICE_TREE_LEN: usize = DEVICE_TREE.len();
526526
#[repr(align(8))]
527527
struct AlignedBuffer {

src/de_mut/cursor.rs

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -129,16 +129,18 @@ impl TitleCursor {
129129
/// 切分节点名。
130130
pub fn split_on<'de>(&self, dtb: RefDtb<'de>) -> (&'de str, BodyCursor) {
131131
let mut index = self.0 + 1;
132+
let mut len = 0;
132133

133134
let structure = &dtb.borrow().structure;
134-
let ptr = structure[index..].as_ptr() as *const u8;
135135
while let Some(block) = structure.get(index) {
136136
index += 1;
137137
if block.is_end_of_str() {
138138
let end = block.str_end();
139-
let s = unsafe { core::slice::from_raw_parts(ptr, end.offset_from(ptr) as _) };
140-
let s = unsafe { core::str::from_utf8_unchecked(s) };
139+
len += end;
140+
let s = structure[self.0 + 1].lead_str(len);
141141
return (s, AnyCursor(index, PhantomData));
142+
} else {
143+
len += 4;
142144
}
143145
}
144146
todo!()
@@ -158,12 +160,7 @@ impl TitleCursor {
158160
body.skip_str_on(dtb);
159161
body.escape_from(dtb);
160162
if let Cursor::Title(c) = body.move_on(dtb) {
161-
let s = unsafe {
162-
core::slice::from_raw_parts(
163-
structure[c.0 + 1..].as_ptr() as *const u8,
164-
name_bytes.len() + 1,
165-
)
166-
};
163+
let s = structure[c.0 + 1].lead_slice(name_bytes.len() + 1);
167164
if let [name @ .., b'@'] = s {
168165
if name == name_bytes {
169166
body.0 += 1 + name_skip;
@@ -213,15 +210,15 @@ impl PropCursor {
213210

214211
pub fn data_on<'a>(&self, dtb: RefDtb<'a>) -> &'a [u8] {
215212
if let [_, len_data, _, data @ ..] = &dtb.borrow().structure[self.0..] {
216-
unsafe { core::slice::from_raw_parts(data.as_ptr() as _, len_data.as_usize()) }
213+
data[0].lead_slice(len_data.as_usize())
217214
} else {
218215
todo!()
219216
}
220217
}
221218

222219
pub fn map_on<T>(&self, dtb: RefDtb<'_>, f: impl FnOnce(&[u8]) -> T) -> T {
223220
if let [_, len_data, _, data @ ..] = &dtb.borrow().structure[self.0..] {
224-
f(unsafe { core::slice::from_raw_parts(data.as_ptr() as _, len_data.as_usize()) })
221+
f(data[0].lead_slice(len_data.as_usize()))
225222
} else {
226223
todo!()
227224
}
@@ -246,16 +243,6 @@ impl PropCursor {
246243
))
247244
}
248245
}
249-
250-
pub fn operate_on(&self, dtb: RefDtb<'_>, f: impl FnOnce(&mut [u8])) {
251-
if let [_, len_data, _, data @ ..] = &mut dtb.borrow_mut().structure[self.0..] {
252-
f(unsafe {
253-
core::slice::from_raw_parts_mut(data.as_mut_ptr() as _, len_data.as_usize())
254-
});
255-
} else {
256-
todo!()
257-
}
258-
}
259246
}
260247

261248
#[derive(Debug)]

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>

0 commit comments

Comments
 (0)