Skip to content

Commit f9e8ec1

Browse files
committed
fix: panic when parse name without unit-address
Signed-off-by: Woshiluo Luo <woshiluo.luo@outlook.com>
1 parent a74f0d2 commit f9e8ec1

File tree

2 files changed

+19
-13
lines changed

2 files changed

+19
-13
lines changed

examples/qemu-virt.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,9 @@ fn main() -> Result<(), Error> {
133133
}
134134

135135
for current_node in t.soc.nodes().unwrap() {
136-
if current_node.get_split_name().0 == "virtio_mmio" {
136+
if current_node.get_parsed_name().0 == "virtio_mmio" {
137137
let mmio = current_node.deserialize::<VirtIoMmio>();
138-
println!("{:?} {:?}", current_node.get_split_name(), mmio.reg);
138+
println!("{:?} {:?}", current_node.get_parsed_name(), mmio.reg);
139139
}
140140
}
141141
for current_prop in t.soc.props().unwrap() {

src/de_mut/node.rs

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ impl<'de> Node<'de> {
5656
let mut cursor = struct_deseriallizer.cursor;
5757
let mut prop: Option<BodyCursor> = None;
5858
let mut node: Option<BodyCursor> = None;
59+
// TODO: 这里采用朴素的方式遍历块,可能会和 GroupCursor 带来的缓存冲突。
60+
// 可能需要一个更优雅的缓存方案或者放弃缓存。
5961
loop {
6062
match cursor.move_on(dtb) {
6163
Cursor::Title(c) => {
@@ -208,17 +210,21 @@ impl<'de> NodeItem<'de> {
208210
.unwrap()
209211
}
210212

211-
pub fn get_split_name(&self) -> (&str, &str) {
212-
let pre_len = self
213-
.name
214-
.as_bytes()
215-
.iter()
216-
.take_while(|b| **b != b'@')
217-
.count();
218-
let mut res = self.name.split_at(pre_len);
219-
// Remove @ prefix
220-
res.1 = res.1.split_at(1).1;
221-
res
213+
pub fn get_parsed_name(&self) -> (&str, Option<&str>) {
214+
if let Some(_) = self.name.find("@") {
215+
let pre_len = self
216+
.name
217+
.as_bytes()
218+
.iter()
219+
.take_while(|b| **b != b'@')
220+
.count();
221+
let (node_name, raw_unit_address) = self.name.split_at(pre_len);
222+
// Remove @ prefix
223+
let unit_address = raw_unit_address.split_at(1).1;
224+
(node_name, Some(unit_address))
225+
} else {
226+
(self.name, None)
227+
}
222228
}
223229

224230
pub fn get_full_name(&self) -> &str {

0 commit comments

Comments
 (0)