swf: Store register count from DefineFunction2

Also update avm1::Function to use register_count.
This commit is contained in:
Mike Welsh 2019-10-15 17:09:14 -07:00
parent ad17166c63
commit e315fcb6b3
4 changed files with 6 additions and 9 deletions

View File

@ -112,7 +112,7 @@ impl<'gc> Avm1Function<'gc> {
swf_version, swf_version,
data: actions, data: actions,
name, name,
register_count: swf_function.params.capacity() as u8, register_count: swf_function.register_count,
preload_parent: swf_function.preload_parent, preload_parent: swf_function.preload_parent,
preload_root: swf_function.preload_root, preload_root: swf_function.preload_root,
suppress_super: swf_function.suppress_super, suppress_super: swf_function.suppress_super,

View File

@ -325,9 +325,9 @@ impl<'a> Reader<'a> {
fn read_define_function_2(&mut self, action_length: &mut usize) -> Result<Action<'a>> { fn read_define_function_2(&mut self, action_length: &mut usize) -> Result<Action<'a>> {
let name = self.read_c_string()?; let name = self.read_c_string()?;
let num_params = self.read_u16()?; 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 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 { for _ in 0..num_params {
let register = self.read_u8()?; let register = self.read_u8()?;
params.push(FunctionParam { params.push(FunctionParam {
@ -341,6 +341,7 @@ impl<'a> Reader<'a> {
Ok(Action::DefineFunction2(Function { Ok(Action::DefineFunction2(Function {
name, name,
params, params,
register_count,
preload_global: flags & 0b1_00000000 != 0, preload_global: flags & 0b1_00000000 != 0,
preload_parent: flags & 0b10000000 != 0, preload_parent: flags & 0b10000000 != 0,
preload_root: flags & 0b1000000 != 0, preload_root: flags & 0b1000000 != 0,

View File

@ -153,6 +153,7 @@ pub enum SendVarsMethod {
#[derive(Clone, Debug, PartialEq)] #[derive(Clone, Debug, PartialEq)]
pub struct Function<'a> { pub struct Function<'a> {
pub name: &'a str, pub name: &'a str,
pub register_count: u8,
pub params: Vec<FunctionParam<'a>>, pub params: Vec<FunctionParam<'a>>,
pub preload_parent: bool, pub preload_parent: bool,
pub preload_root: bool, pub preload_root: bool,

View File

@ -77,15 +77,10 @@ impl<W: Write> Writer<W> {
.map(|p| p.name.len() + 2) .map(|p| p.name.len() + 2)
.sum::<usize>() .sum::<usize>()
+ 4; + 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_action_header(OpCode::DefineFunction2, len)?;
self.write_c_string(&function.name)?; self.write_c_string(&function.name)?;
self.write_u16(function.params.len() as u16)?; 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 { let flags = if function.preload_global {
0b1_00000000 0b1_00000000
} else { } else {