swf: Add support for the `TypeName` multiname type.

This commit is contained in:
David Wendt 2020-09-29 22:04:26 -04:00 committed by kmeisthax
parent 8b665b590d
commit 47e3b2229a
4 changed files with 31 additions and 0 deletions

View File

@ -340,6 +340,7 @@ impl<'gc> Multiname<'gc> {
name: Some(name), name: Some(name),
} }
} }
AbcMultiname::TypeName { .. } => return Err("TypeName not implemented".into()),
}) })
} }

View File

@ -171,6 +171,20 @@ impl<'a> Reader<'a> {
0x1c => Multiname::MultinameLA { 0x1c => Multiname::MultinameLA {
namespace_set: self.read_index()?, namespace_set: self.read_index()?,
}, },
0x1d => {
let base_type = self.read_index()?;
let count = self.read_u30()?;
let mut parameters = Vec::new();
for _ in 0..count {
parameters.push(self.read_index()?);
}
Multiname::TypeName {
base_type,
parameters,
}
}
_ => return Err(Error::invalid_data("Invalid multiname kind")), _ => return Err(Error::invalid_data("Invalid multiname kind")),
}) })
} }

View File

@ -82,6 +82,10 @@ pub enum Multiname {
MultinameLA { MultinameLA {
namespace_set: Index<NamespaceSet>, namespace_set: Index<NamespaceSet>,
}, },
TypeName {
base_type: Index<Multiname>,
parameters: Vec<Index<Multiname>>,
},
} }
#[derive(Clone, Debug, PartialEq)] #[derive(Clone, Debug, PartialEq)]

View File

@ -311,6 +311,18 @@ impl<W: Write> Writer<W> {
self.write_u8(0x1c)?; self.write_u8(0x1c)?;
self.write_index(namespace_set)?; self.write_index(namespace_set)?;
} }
Multiname::TypeName {
ref base_type,
ref parameters,
} => {
self.write_u8(0x1d)?;
self.write_index(&base_type)?;
self.write_u30(parameters.len() as u32)?;
for param in parameters {
self.write_index(&param)?;
}
}
} }
Ok(()) Ok(())
} }