From 49d79b8e73423415f38cd3b93191c38420e468a7 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Wed, 17 Mar 2021 18:19:23 -0400 Subject: [PATCH] avm2: Vector indices are stored in a package namespace --- core/src/avm2/names.rs | 8 ++++++++ core/src/avm2/object/vector_object.rs | 12 ++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/core/src/avm2/names.rs b/core/src/avm2/names.rs index 599edc3d5..b7a32b006 100644 --- a/core/src/avm2/names.rs +++ b/core/src/avm2/names.rs @@ -95,6 +95,14 @@ impl<'gc> Namespace<'gc> { self.is_public() || self.is_any() } + pub fn is_package(&self, package_name: impl Into>) -> bool { + if let Self::Package(my_name) = self { + return my_name == &package_name.into(); + } + + false + } + /// Get the string value of this namespace, ignoring its type. /// /// TODO: Is this *actually* the namespace URI? diff --git a/core/src/avm2/object/vector_object.rs b/core/src/avm2/object/vector_object.rs index 65b7f492d..2a489dddf 100644 --- a/core/src/avm2/object/vector_object.rs +++ b/core/src/avm2/object/vector_object.rs @@ -61,7 +61,7 @@ impl<'gc> TObject<'gc> for VectorObject<'gc> { ) -> Result, Error> { let read = self.0.read(); - if name.namespace().is_public() { + if name.namespace().is_package("") { if let Ok(index) = name.local_name().parse::() { return Ok(read .vector @@ -84,7 +84,7 @@ impl<'gc> TObject<'gc> for VectorObject<'gc> { value: Value<'gc>, activation: &mut Activation<'_, 'gc, '_>, ) -> Result<(), Error> { - if name.namespace().is_public() { + if name.namespace().is_package("") { if let Ok(index) = name.local_name().parse::() { let type_of = self.0.read().vector.value_type(); let value = match value.coerce_to_type(activation, type_of)? { @@ -122,7 +122,7 @@ impl<'gc> TObject<'gc> for VectorObject<'gc> { value: Value<'gc>, activation: &mut Activation<'_, 'gc, '_>, ) -> Result<(), Error> { - if name.namespace().is_public() { + if name.namespace().is_package("") { if let Ok(index) = name.local_name().parse::() { let type_of = self.0.read().vector.value_type(); let value = match value.coerce_to_type(activation, type_of)? { @@ -166,7 +166,7 @@ impl<'gc> TObject<'gc> for VectorObject<'gc> { } fn delete_property(&self, gc_context: MutationContext<'gc, '_>, name: &QName<'gc>) -> bool { - if name.namespace().is_public() && name.local_name().parse::().is_ok() { + if name.namespace().is_package("") && name.local_name().parse::().is_ok() { return true; } @@ -174,7 +174,7 @@ impl<'gc> TObject<'gc> for VectorObject<'gc> { } fn has_own_property(self, name: &QName<'gc>) -> Result { - if name.namespace().is_public() { + if name.namespace().is_package("") { if let Ok(index) = name.local_name().parse::() { return Ok(self.0.read().vector.is_in_range(index)); } @@ -186,7 +186,7 @@ impl<'gc> TObject<'gc> for VectorObject<'gc> { fn resolve_any(self, local_name: AvmString<'gc>) -> Result>, Error> { if let Ok(index) = local_name.parse::() { if self.0.read().vector.is_in_range(index) { - return Ok(Some(Namespace::public())); + return Ok(Some(Namespace::package(""))); } }