swf: Store register count from DefineFunction2
Also update avm1::Function to use register_count.
This commit is contained in:
parent
ad17166c63
commit
e315fcb6b3
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue