From e02feb919a91a3166922d82fb3743890b345c172 Mon Sep 17 00:00:00 2001 From: Adrian Wielgosik Date: Sat, 18 Sep 2021 12:20:59 +0200 Subject: [PATCH] avm2: Reimplement as_class() in terms of other methods --- core/src/avm2/object.rs | 11 ++++++++- core/src/avm2/object/array_object.rs | 1 - core/src/avm2/object/bitmapdata_object.rs | 1 - core/src/avm2/object/bytearray_object.rs | 1 - core/src/avm2/object/class_object.rs | 8 +++---- core/src/avm2/object/custom_object.rs | 4 ---- core/src/avm2/object/dispatch_object.rs | 1 - core/src/avm2/object/domain_object.rs | 1 - core/src/avm2/object/event_object.rs | 1 - core/src/avm2/object/function_object.rs | 1 - core/src/avm2/object/loaderinfo_object.rs | 1 - core/src/avm2/object/namespace_object.rs | 1 - core/src/avm2/object/primitive_object.rs | 1 - core/src/avm2/object/regexp_object.rs | 1 - core/src/avm2/object/script_object.rs | 26 +++++++-------------- core/src/avm2/object/sound_object.rs | 1 - core/src/avm2/object/soundchannel_object.rs | 1 - core/src/avm2/object/stage_object.rs | 5 ---- core/src/avm2/object/vector_object.rs | 1 - core/src/avm2/object/xml_object.rs | 1 - 20 files changed, 23 insertions(+), 46 deletions(-) diff --git a/core/src/avm2/object.rs b/core/src/avm2/object.rs index 1c18969d2..c490dea4e 100644 --- a/core/src/avm2/object.rs +++ b/core/src/avm2/object.rs @@ -1083,7 +1083,16 @@ pub trait TObject<'gc>: 'gc + Collect + Debug + Into> + Clone + Copy fn as_ptr(&self) -> *const ObjectPtr; /// Get this object's `Class`, if it has one. - fn as_class(&self) -> Option>>; + fn as_class(&self) -> Option>> { + let class = match self.as_class_object_really() { + Some(class) => class, + None => match self.instance_of() { + Some(cls) => cls.as_class_object_really().unwrap(), + None => return None, + } + }; + class.inner_class_definition() + } /// Get this object's class object, if it has one. fn as_class_object(&self) -> Option>; diff --git a/core/src/avm2/object/array_object.rs b/core/src/avm2/object/array_object.rs index c6871d9be..7e081f674 100644 --- a/core/src/avm2/object/array_object.rs +++ b/core/src/avm2/object/array_object.rs @@ -2,7 +2,6 @@ use crate::avm2::activation::Activation; use crate::avm2::array::ArrayStorage; -use crate::avm2::class::Class; use crate::avm2::names::{Namespace, QName}; use crate::avm2::object::script_object::ScriptObjectData; use crate::avm2::object::{Object, ObjectPtr, TObject}; diff --git a/core/src/avm2/object/bitmapdata_object.rs b/core/src/avm2/object/bitmapdata_object.rs index 972d5c6c4..eadb2ec17 100644 --- a/core/src/avm2/object/bitmapdata_object.rs +++ b/core/src/avm2/object/bitmapdata_object.rs @@ -1,7 +1,6 @@ //! Object representation for BitmapData use crate::avm2::activation::Activation; -use crate::avm2::class::Class; use crate::avm2::names::{Namespace, QName}; use crate::avm2::object::script_object::ScriptObjectData; use crate::avm2::object::{Object, ObjectPtr, TObject}; diff --git a/core/src/avm2/object/bytearray_object.rs b/core/src/avm2/object/bytearray_object.rs index 47f6e06d8..bee7b6e7b 100644 --- a/core/src/avm2/object/bytearray_object.rs +++ b/core/src/avm2/object/bytearray_object.rs @@ -1,6 +1,5 @@ use crate::avm2::activation::Activation; use crate::avm2::bytearray::ByteArrayStorage; -use crate::avm2::class::Class; use crate::avm2::names::{Namespace, QName}; use crate::avm2::object::script_object::ScriptObjectData; use crate::avm2::object::{Object, ObjectPtr, TObject}; diff --git a/core/src/avm2/object/class_object.rs b/core/src/avm2/object/class_object.rs index 526634f84..d7680940b 100644 --- a/core/src/avm2/object/class_object.rs +++ b/core/src/avm2/object/class_object.rs @@ -344,6 +344,10 @@ impl<'gc> ClassObject<'gc> { Ok(()) } + pub fn inner_class_definition(self) -> Option>> { + Some(self.0.read().class) + } + pub fn interfaces(self) -> Vec> { self.0.read().interfaces.clone() } @@ -490,10 +494,6 @@ impl<'gc> TObject<'gc> for ClassObject<'gc> { .resolve_any_class_trait(local_name)) } - fn as_class(&self) -> Option>> { - Some(self.0.read().class) - } - fn as_class_object(&self) -> Option> { None //AS3 does not have metaclasses } diff --git a/core/src/avm2/object/custom_object.rs b/core/src/avm2/object/custom_object.rs index 293d07376..125ac5303 100644 --- a/core/src/avm2/object/custom_object.rs +++ b/core/src/avm2/object/custom_object.rs @@ -110,10 +110,6 @@ macro_rules! impl_avm2_custom_object_instance { self.0.read().$field.resolve_any_trait(local_name) } - fn as_class(&self) -> Option>> { - self.0.read().$field.as_class() - } - fn as_class_object(&self) -> Option> { self.0.read().$field.as_class_object() } diff --git a/core/src/avm2/object/dispatch_object.rs b/core/src/avm2/object/dispatch_object.rs index 2fe58b88f..b58864894 100644 --- a/core/src/avm2/object/dispatch_object.rs +++ b/core/src/avm2/object/dispatch_object.rs @@ -1,7 +1,6 @@ //! Dispatch list object representation use crate::avm2::activation::Activation; -use crate::avm2::class::Class; use crate::avm2::events::DispatchList; use crate::avm2::names::{Namespace, QName}; use crate::avm2::object::script_object::ScriptObjectData; diff --git a/core/src/avm2/object/domain_object.rs b/core/src/avm2/object/domain_object.rs index 276a1f66d..dae26b17d 100644 --- a/core/src/avm2/object/domain_object.rs +++ b/core/src/avm2/object/domain_object.rs @@ -1,7 +1,6 @@ //! Application Domain objects for scripts use crate::avm2::activation::Activation; -use crate::avm2::class::Class; use crate::avm2::domain::Domain; use crate::avm2::names::{Namespace, QName}; use crate::avm2::object::script_object::ScriptObjectData; diff --git a/core/src/avm2/object/event_object.rs b/core/src/avm2/object/event_object.rs index def858e7d..f16826390 100644 --- a/core/src/avm2/object/event_object.rs +++ b/core/src/avm2/object/event_object.rs @@ -1,7 +1,6 @@ //! Object representation for events use crate::avm2::activation::Activation; -use crate::avm2::class::Class; use crate::avm2::events::Event; use crate::avm2::names::{Namespace, QName}; use crate::avm2::object::script_object::ScriptObjectData; diff --git a/core/src/avm2/object/function_object.rs b/core/src/avm2/object/function_object.rs index 34726475f..971b0bb7d 100644 --- a/core/src/avm2/object/function_object.rs +++ b/core/src/avm2/object/function_object.rs @@ -1,7 +1,6 @@ //! Function object impl use crate::avm2::activation::Activation; -use crate::avm2::class::Class; use crate::avm2::function::Executable; use crate::avm2::method::Method; use crate::avm2::names::{Namespace, QName}; diff --git a/core/src/avm2/object/loaderinfo_object.rs b/core/src/avm2/object/loaderinfo_object.rs index 8c7878faf..38d57ce87 100644 --- a/core/src/avm2/object/loaderinfo_object.rs +++ b/core/src/avm2/object/loaderinfo_object.rs @@ -1,7 +1,6 @@ //! Loader-info object use crate::avm2::activation::Activation; -use crate::avm2::class::Class; use crate::avm2::names::{Namespace, QName}; use crate::avm2::object::script_object::ScriptObjectData; use crate::avm2::object::{Object, ObjectPtr, TObject}; diff --git a/core/src/avm2/object/namespace_object.rs b/core/src/avm2/object/namespace_object.rs index a12a1e59f..5640399cc 100644 --- a/core/src/avm2/object/namespace_object.rs +++ b/core/src/avm2/object/namespace_object.rs @@ -1,7 +1,6 @@ //! Boxed namespaces use crate::avm2::activation::Activation; -use crate::avm2::class::Class; use crate::avm2::names::{Namespace, QName}; use crate::avm2::object::script_object::ScriptObjectData; use crate::avm2::object::{Object, ObjectPtr, TObject}; diff --git a/core/src/avm2/object/primitive_object.rs b/core/src/avm2/object/primitive_object.rs index 4f61cef4f..6b665daff 100644 --- a/core/src/avm2/object/primitive_object.rs +++ b/core/src/avm2/object/primitive_object.rs @@ -3,7 +3,6 @@ use std::cell::{Ref, RefMut}; use crate::avm2::activation::Activation; -use crate::avm2::class::Class; use crate::avm2::names::{Namespace, QName}; use crate::avm2::object::script_object::ScriptObjectData; use crate::avm2::object::{Object, ObjectPtr, TObject}; diff --git a/core/src/avm2/object/regexp_object.rs b/core/src/avm2/object/regexp_object.rs index 5005302ec..95be7f3bc 100644 --- a/core/src/avm2/object/regexp_object.rs +++ b/core/src/avm2/object/regexp_object.rs @@ -1,7 +1,6 @@ //! Object representation for regexp use crate::avm2::activation::Activation; -use crate::avm2::class::Class; use crate::avm2::names::{Namespace, QName}; use crate::avm2::object::script_object::ScriptObjectData; use crate::avm2::object::{Object, ObjectPtr, TObject}; diff --git a/core/src/avm2/object/script_object.rs b/core/src/avm2/object/script_object.rs index 643a95502..1e2314763 100644 --- a/core/src/avm2/object/script_object.rs +++ b/core/src/avm2/object/script_object.rs @@ -1,7 +1,6 @@ //! Default AVM2 object impl use crate::avm2::activation::Activation; -use crate::avm2::class::Class; use crate::avm2::names::{Namespace, QName}; use crate::avm2::object::{Object, ObjectPtr, TObject}; use crate::avm2::property::Property; @@ -300,10 +299,6 @@ impl<'gc> TObject<'gc> for ScriptObject<'gc> { self.0.write(mc).install_const(name, id, value, is_final) } - fn as_class(&self) -> Option>> { - self.0.read().as_class() - } - fn as_class_object(&self) -> Option> { self.0.read().as_class_object() } @@ -769,13 +764,15 @@ impl<'gc> ScriptObjectData<'gc> { name: QName<'gc>, value: Value<'gc>, ) -> Result<(), Error> { - if let Some(class) = self.as_class() { - if class.read().is_sealed() { - return Err(format!( - "Objects of type {:?} are not dynamic", - class.read().name().local_name() - ) - .into()); + if let Some(class) = self.instance_of() { + if let Some(class) = class.as_class() { + if class.read().is_sealed() { + return Err(format!( + "Objects of type {:?} are not dynamic", + class.read().name().local_name() + ) + .into()); + } } } @@ -827,11 +824,6 @@ impl<'gc> ScriptObjectData<'gc> { } } - /// Get the class for this object, if it has one. - pub fn as_class(&self) -> Option>> { - self.instance_of.and_then(|class| class.as_class()) - } - /// Get the class object for this object, if it has one. pub fn as_class_object(&self) -> Option> { self.instance_of diff --git a/core/src/avm2/object/sound_object.rs b/core/src/avm2/object/sound_object.rs index 65ce4e51e..1756d886e 100644 --- a/core/src/avm2/object/sound_object.rs +++ b/core/src/avm2/object/sound_object.rs @@ -1,7 +1,6 @@ //! Object representation for sounds use crate::avm2::activation::Activation; -use crate::avm2::class::Class; use crate::avm2::names::{Namespace, QName}; use crate::avm2::object::script_object::ScriptObjectData; use crate::avm2::object::{Object, ObjectPtr, TObject}; diff --git a/core/src/avm2/object/soundchannel_object.rs b/core/src/avm2/object/soundchannel_object.rs index 79ab7fbac..ec79fd09b 100644 --- a/core/src/avm2/object/soundchannel_object.rs +++ b/core/src/avm2/object/soundchannel_object.rs @@ -1,7 +1,6 @@ //! Object representation for sounds use crate::avm2::activation::Activation; -use crate::avm2::class::Class; use crate::avm2::names::{Namespace, QName}; use crate::avm2::object::script_object::ScriptObjectData; use crate::avm2::object::{Object, ObjectPtr, TObject}; diff --git a/core/src/avm2/object/stage_object.rs b/core/src/avm2/object/stage_object.rs index d96acd4d6..74e0aa06f 100644 --- a/core/src/avm2/object/stage_object.rs +++ b/core/src/avm2/object/stage_object.rs @@ -1,7 +1,6 @@ //! AVM2 object impl for the display hierarchy. use crate::avm2::activation::Activation; -use crate::avm2::class::Class; use crate::avm2::function::Executable; use crate::avm2::names::{Namespace, QName}; use crate::avm2::object::script_object::ScriptObjectData; @@ -286,10 +285,6 @@ impl<'gc> TObject<'gc> for StageObject<'gc> { None } - fn as_class(&self) -> Option>> { - self.0.read().base.as_class() - } - fn as_class_object(&self) -> Option> { self.0.read().base.as_class_object() } diff --git a/core/src/avm2/object/vector_object.rs b/core/src/avm2/object/vector_object.rs index 5ffa2d9e2..ea19b1e22 100644 --- a/core/src/avm2/object/vector_object.rs +++ b/core/src/avm2/object/vector_object.rs @@ -1,7 +1,6 @@ //! Vector storage object use crate::avm2::activation::Activation; -use crate::avm2::class::Class; use crate::avm2::names::{Namespace, QName}; use crate::avm2::object::script_object::ScriptObjectData; use crate::avm2::object::{Object, ObjectPtr, TObject}; diff --git a/core/src/avm2/object/xml_object.rs b/core/src/avm2/object/xml_object.rs index 1abe24501..eac473551 100644 --- a/core/src/avm2/object/xml_object.rs +++ b/core/src/avm2/object/xml_object.rs @@ -1,7 +1,6 @@ //! Object representation for XML objects use crate::avm2::activation::Activation; -use crate::avm2::class::Class; use crate::avm2::names::{Namespace, QName}; use crate::avm2::object::script_object::ScriptObjectData; use crate::avm2::object::{Object, ObjectPtr, TObject};