aboutsummaryrefslogtreecommitdiff
path: root/src/serialized_file.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/serialized_file.rs')
-rw-r--r--src/serialized_file.rs22
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)?;