From 47e3b2229aab6a0b45f97e2a06d4af91b1f1e737 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Tue, 29 Sep 2020 22:04:26 -0400 Subject: [PATCH] swf: Add support for the `TypeName` multiname type. --- core/src/avm2/names.rs | 1 + swf/src/avm2/read.rs | 14 ++++++++++++++ swf/src/avm2/types.rs | 4 ++++ swf/src/avm2/write.rs | 12 ++++++++++++ 4 files changed, 31 insertions(+) diff --git a/core/src/avm2/names.rs b/core/src/avm2/names.rs index 094d20212..3fd029ea2 100644 --- a/core/src/avm2/names.rs +++ b/core/src/avm2/names.rs @@ -340,6 +340,7 @@ impl<'gc> Multiname<'gc> { name: Some(name), } } + AbcMultiname::TypeName { .. } => return Err("TypeName not implemented".into()), }) } diff --git a/swf/src/avm2/read.rs b/swf/src/avm2/read.rs index 55611ebc5..90eb60005 100644 --- a/swf/src/avm2/read.rs +++ b/swf/src/avm2/read.rs @@ -171,6 +171,20 @@ impl<'a> Reader<'a> { 0x1c => Multiname::MultinameLA { 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")), }) } diff --git a/swf/src/avm2/types.rs b/swf/src/avm2/types.rs index c7d1ca959..fe0fcf7ca 100644 --- a/swf/src/avm2/types.rs +++ b/swf/src/avm2/types.rs @@ -82,6 +82,10 @@ pub enum Multiname { MultinameLA { namespace_set: Index, }, + TypeName { + base_type: Index, + parameters: Vec>, + }, } #[derive(Clone, Debug, PartialEq)] diff --git a/swf/src/avm2/write.rs b/swf/src/avm2/write.rs index 3f29b6ae7..ae9942d39 100644 --- a/swf/src/avm2/write.rs +++ b/swf/src/avm2/write.rs @@ -311,6 +311,18 @@ impl Writer { self.write_u8(0x1c)?; 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(¶m)?; + } + } } Ok(()) }