Skip to content

Commit b400449

Browse files
avm2: Factor out array index parsing logic into a function
1 parent 1a04a29 commit b400449

File tree

2 files changed

+16
-11
lines changed

2 files changed

+16
-11
lines changed

core/src/avm2/amf.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -313,16 +313,16 @@ pub fn deserialize_value_impl<'gc>(
313313

314314
// Now let's add each element as a property
315315
for element in elements {
316-
let name = element.name();
316+
let name = ruffle_wstr::from_utf8(element.name());
317317
let value = deserialize_value_impl(activation, element.value(), object_map)?;
318318

319-
// If the name of the element was numerical, we set an element on
320-
// the array instead of setting a dynamic property.
321-
if let Ok(index) = name.parse::<usize>() {
319+
// If the name of the element was a valid array index, we set an
320+
// element on the array instead of setting a dynamic property.
321+
if let Some(index) = ArrayObject::as_array_index(&name) {
322322
array.set_element(activation.gc(), index, value);
323323
} else {
324324
array.set_dynamic_property(
325-
AvmString::new_utf8(activation.gc(), name),
325+
AvmString::new(activation.gc(), name),
326326
value,
327327
activation.gc(),
328328
);

core/src/avm2/object/array_object.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::avm2::object::{ClassObject, Object, ObjectPtr, TObject};
77
use crate::avm2::value::Value;
88
use crate::avm2::Error;
99
use crate::avm2::Multiname;
10-
use crate::string::AvmString;
10+
use crate::string::{AvmString, WStr};
1111
use crate::utils::HasPrefixField;
1212
use core::fmt;
1313
use gc_arena::barrier::unlock;
@@ -84,6 +84,11 @@ impl<'gc> ArrayObject<'gc> {
8484
))
8585
}
8686

87+
pub fn as_array_index(local_name: &WStr) -> Option<usize> {
88+
// TODO match avmplus
89+
local_name.parse::<usize>().ok()
90+
}
91+
8792
pub fn set_element(self, mc: &Mutation<'gc>, index: usize, value: Value<'gc>) {
8893
unlock!(Gc::write(mc, self.0), ArrayObjectData, array)
8994
.borrow_mut()
@@ -115,7 +120,7 @@ impl<'gc> TObject<'gc> for ArrayObject<'gc> {
115120
) -> Result<Value<'gc>, Error<'gc>> {
116121
if name.valid_dynamic_name() {
117122
if let Some(name) = name.local_name() {
118-
if let Ok(index) = name.parse::<usize>() {
123+
if let Some(index) = ArrayObject::as_array_index(&name) {
119124
if let Some(result) = self.get_index_property(index) {
120125
return Ok(result);
121126
}
@@ -151,7 +156,7 @@ impl<'gc> TObject<'gc> for ArrayObject<'gc> {
151156

152157
if name.valid_dynamic_name() {
153158
if let Some(name) = name.local_name() {
154-
if let Ok(index) = name.parse::<usize>() {
159+
if let Some(index) = ArrayObject::as_array_index(&name) {
155160
self.set_element(mc, index, value);
156161

157162
return Ok(());
@@ -172,7 +177,7 @@ impl<'gc> TObject<'gc> for ArrayObject<'gc> {
172177

173178
if name.valid_dynamic_name() {
174179
if let Some(name) = name.local_name() {
175-
if let Ok(index) = name.parse::<usize>() {
180+
if let Some(index) = ArrayObject::as_array_index(&name) {
176181
self.set_element(mc, index, value);
177182

178183
return Ok(());
@@ -192,7 +197,7 @@ impl<'gc> TObject<'gc> for ArrayObject<'gc> {
192197

193198
if name.valid_dynamic_name() {
194199
if let Some(name) = name.local_name() {
195-
if let Ok(index) = name.parse::<usize>() {
200+
if let Some(index) = ArrayObject::as_array_index(&name) {
196201
unlock!(Gc::write(mc, self.0), ArrayObjectData, array)
197202
.borrow_mut()
198203
.delete(index);
@@ -208,7 +213,7 @@ impl<'gc> TObject<'gc> for ArrayObject<'gc> {
208213
fn has_own_property(self, name: &Multiname<'gc>) -> bool {
209214
if name.valid_dynamic_name() {
210215
if let Some(name) = name.local_name() {
211-
if let Ok(index) = name.parse::<usize>() {
216+
if let Some(index) = ArrayObject::as_array_index(&name) {
212217
return self.0.array.borrow().get(index).is_some();
213218
}
214219
}

0 commit comments

Comments
 (0)