From 0a4d1449fcc442bb01204ad4fe2dfeac3da8e65e Mon Sep 17 00:00:00 2001 From: Lord-McSweeney Date: Sun, 26 Nov 2023 20:23:00 -0500 Subject: [PATCH] avm2: Implement StrictArray conversion for FLV script data --- core/src/avm2/flv.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/core/src/avm2/flv.rs b/core/src/avm2/flv.rs index 988436dc2..485160d22 100644 --- a/core/src/avm2/flv.rs +++ b/core/src/avm2/flv.rs @@ -1,4 +1,4 @@ -use crate::avm2::{Activation, TObject as _, Value as Avm2Value}; +use crate::avm2::{Activation, ArrayObject, ArrayStorage, TObject as _, Value as Avm2Value}; use crate::string::AvmString; use flv_rs::{Value as FlvValue, Variable as FlvVariable}; @@ -29,6 +29,22 @@ fn avm2_object_from_flv_variables<'gc>( info_object.into() } +fn avm2_array_from_flv_values<'gc>( + activation: &mut Activation<'_, 'gc>, + values: Vec, +) -> Avm2Value<'gc> { + let storage = ArrayStorage::from_storage( + values + .iter() + .map(|v| Some(v.clone().to_avm2_value(activation))) + .collect::>>>(), + ); + + ArrayObject::from_storage(activation, storage) + .unwrap() + .into() +} + pub trait FlvValueAvm2Ext<'gc> { fn to_avm2_value(self, activation: &mut Activation<'_, 'gc>) -> Avm2Value<'gc>; } @@ -36,7 +52,8 @@ pub trait FlvValueAvm2Ext<'gc> { impl<'gc> FlvValueAvm2Ext<'gc> for FlvValue<'_> { fn to_avm2_value(self, activation: &mut Activation<'_, 'gc>) -> Avm2Value<'gc> { match self { - FlvValue::EcmaArray(values) => avm2_object_from_flv_variables(activation, values), + FlvValue::EcmaArray(variables) => avm2_object_from_flv_variables(activation, variables), + FlvValue::StrictArray(values) => avm2_array_from_flv_values(activation, values), FlvValue::String(string_data) | FlvValue::LongString(string_data) => { AvmString::new_utf8_bytes(activation.context.gc_context, string_data).into() }