avm2: Implement StrictArray conversion for FLV script data

This commit is contained in:
Lord-McSweeney 2023-11-26 20:23:00 -05:00 committed by kmeisthax
parent ab02e89b3b
commit 0a4d1449fc
1 changed files with 19 additions and 2 deletions

View File

@ -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<FlvValue>,
) -> Avm2Value<'gc> {
let storage = ArrayStorage::from_storage(
values
.iter()
.map(|v| Some(v.clone().to_avm2_value(activation)))
.collect::<Vec<Option<Avm2Value<'gc>>>>(),
);
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()
}