From 09a7bd61b5e6f6da5a74e0f2418eeec44df48389 Mon Sep 17 00:00:00 2001 From: Tom Schuster Date: Wed, 13 Mar 2024 11:13:05 +0100 Subject: [PATCH] avm2: Fix Object.prototype.toString applied to Vector --- core/src/avm2/object.rs | 6 +----- core/src/avm2/object/vector_object.rs | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/core/src/avm2/object.rs b/core/src/avm2/object.rs index d3dd1eb28..bdfe8a3f8 100644 --- a/core/src/avm2/object.rs +++ b/core/src/avm2/object.rs @@ -977,11 +977,7 @@ pub trait TObject<'gc>: 'gc + Collect + Debug + Into> + Clone + Copy .map(|c| c.read().name().local_name()) .unwrap_or_else(|| "Object".into()); - Ok(AvmString::new_utf8( - activation.context.gc_context, - format!("[object {class_name}]"), - ) - .into()) + Ok(AvmString::new_utf8(activation.gc(), format!("[object {class_name}]")).into()) } /// Implement the result of calling `Object.prototype.toLocaleString` on this diff --git a/core/src/avm2/object/vector_object.rs b/core/src/avm2/object/vector_object.rs index a7b143462..27c3d50c9 100644 --- a/core/src/avm2/object/vector_object.rs +++ b/core/src/avm2/object/vector_object.rs @@ -3,6 +3,7 @@ use crate::avm2::activation::Activation; use crate::avm2::object::script_object::ScriptObjectData; use crate::avm2::object::{ClassObject, Object, ObjectPtr, TObject}; +use crate::avm2::string::AvmString; use crate::avm2::value::Value; use crate::avm2::vector::VectorStorage; use crate::avm2::Error; @@ -250,8 +251,19 @@ impl<'gc> TObject<'gc> for VectorObject<'gc> { } } - fn to_string(&self, _activation: &mut Activation<'_, 'gc>) -> Result, Error<'gc>> { - Ok(Value::Object(Object::from(*self))) + // Implements the special `Object.prototype.toString` behavior for Vector. + fn to_string(&self, activation: &mut Activation<'_, 'gc>) -> Result, Error<'gc>> { + let inner_name = if let Some(class_object) = self.0.read().vector.value_type() { + class_object + .inner_class_definition() + .read() + .name() + .to_qualified_name(activation.gc()) + } else { + AvmString::new_utf8(activation.gc(), "*") + }; + + Ok(AvmString::new_utf8(activation.gc(), format!("[object Vector.<{inner_name}>]")).into()) } fn value_of(&self, _mc: &Mutation<'gc>) -> Result, Error<'gc>> {