From e315fcb6b3c6f6a55b10ef6cd270c4ee5f493ccc Mon Sep 17 00:00:00 2001 From: Mike Welsh Date: Tue, 15 Oct 2019 17:09:14 -0700 Subject: [PATCH] swf: Store register count from DefineFunction2 Also update avm1::Function to use register_count. --- core/src/avm1/function.rs | 2 +- swf/src/avm1/read.rs | 5 +++-- swf/src/avm1/types.rs | 1 + swf/src/avm1/write.rs | 7 +------ 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/core/src/avm1/function.rs b/core/src/avm1/function.rs index 6952ce64c..3522eb446 100644 --- a/core/src/avm1/function.rs +++ b/core/src/avm1/function.rs @@ -112,7 +112,7 @@ impl<'gc> Avm1Function<'gc> { swf_version, data: actions, name, - register_count: swf_function.params.capacity() as u8, + register_count: swf_function.register_count, preload_parent: swf_function.preload_parent, preload_root: swf_function.preload_root, suppress_super: swf_function.suppress_super, diff --git a/swf/src/avm1/read.rs b/swf/src/avm1/read.rs index 9b4b6c83a..4a895cf60 100644 --- a/swf/src/avm1/read.rs +++ b/swf/src/avm1/read.rs @@ -325,9 +325,9 @@ impl<'a> Reader<'a> { fn read_define_function_2(&mut self, action_length: &mut usize) -> Result> { let name = self.read_c_string()?; let num_params = self.read_u16()?; - let num_registers = self.read_u8()?; // Number of registers + let register_count = self.read_u8()?; // Number of registers let flags = self.read_u16()?; - let mut params = Vec::with_capacity(num_params as usize + num_registers as usize); + let mut params = Vec::with_capacity(num_params as usize); for _ in 0..num_params { let register = self.read_u8()?; params.push(FunctionParam { @@ -341,6 +341,7 @@ impl<'a> Reader<'a> { Ok(Action::DefineFunction2(Function { name, params, + register_count, preload_global: flags & 0b1_00000000 != 0, preload_parent: flags & 0b10000000 != 0, preload_root: flags & 0b1000000 != 0, diff --git a/swf/src/avm1/types.rs b/swf/src/avm1/types.rs index 21806c904..3d93c09ea 100644 --- a/swf/src/avm1/types.rs +++ b/swf/src/avm1/types.rs @@ -153,6 +153,7 @@ pub enum SendVarsMethod { #[derive(Clone, Debug, PartialEq)] pub struct Function<'a> { pub name: &'a str, + pub register_count: u8, pub params: Vec>, pub preload_parent: bool, pub preload_root: bool, diff --git a/swf/src/avm1/write.rs b/swf/src/avm1/write.rs index ca9daac1e..9b1b75e7e 100644 --- a/swf/src/avm1/write.rs +++ b/swf/src/avm1/write.rs @@ -77,15 +77,10 @@ impl Writer { .map(|p| p.name.len() + 2) .sum::() + 4; - let num_registers = function - .params - .iter() - .map(|p| if p.register_index.is_none() { 1 } else { 0 }) - .sum(); self.write_action_header(OpCode::DefineFunction2, len)?; self.write_c_string(&function.name)?; self.write_u16(function.params.len() as u16)?; - self.write_u8(num_registers)?; + self.write_u8(function.register_count)?; let flags = if function.preload_global { 0b1_00000000 } else {