diff options
Diffstat (limited to 'src/serialized_file.rs')
-rw-r--r-- | src/serialized_file.rs | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/src/serialized_file.rs b/src/serialized_file.rs index f32b3a3..4b348e0 100644 --- a/src/serialized_file.rs +++ b/src/serialized_file.rs @@ -17,6 +17,8 @@ pub struct TypeTreeNode { pub index: i32, pub flags: i32, pub ref_type_hash: u64, + + pub children: Vec<TypeTreeNode>, } #[derive(Debug)] @@ -26,7 +28,7 @@ pub struct SeralizedType { pub script_type_index: i16, pub script_id: u128, - pub type_tree: Vec<TypeTreeNode>, + pub type_tree: Option<TypeTreeNode>, pub type_deps: Vec<u32>, } @@ -115,7 +117,7 @@ pub fn read_serialized_file(mut file: impl Read + Seek) -> Result<SerializedFile trace!("script_id={script_id}"); let mut type_deps = Vec::new(); - let mut type_tree = Vec::new(); + let mut type_tree = None; if has_type_trees { let num_nodes = file.read_u32(e)?; let size = file.read_u32(e)?; @@ -143,8 +145,9 @@ pub fn read_serialized_file(mut file: impl Read + Seek) -> Result<SerializedFile ) }; + let mut parents: Vec<TypeTreeNode> = vec![]; for _ in 0..num_nodes { - type_tree.push(TypeTreeNode { + let node = TypeTreeNode { version: node_data.read_u16(e)?, level: node_data.read_u8()?, type_flags: node_data.read_u8()?, @@ -154,8 +157,19 @@ pub fn read_serialized_file(mut file: impl Read + Seek) -> Result<SerializedFile index: node_data.read_i32(e)?, flags: node_data.read_i32(e)?, ref_type_hash: node_data.read_u64(e)?, - }); + children: vec![], + }; + while parents.len() > node.level as usize { + let n = parents.pop().unwrap(); + parents.last_mut().unwrap().children.push(n) + } + parents.push(node); + } + while parents.len() > 1 { + let n = parents.pop().unwrap(); + parents.last_mut().unwrap().children.push(n) } + type_tree = parents.pop(); if format >= 21 { let num_deps = file.read_u32(e)?; |