avm2: Reimplement as_class() in terms of other methods

This commit is contained in:
Adrian Wielgosik 2021-09-18 12:20:59 +02:00 committed by Adrian Wielgosik
parent 4380978b2a
commit e02feb919a
20 changed files with 23 additions and 46 deletions

View File

@ -1083,7 +1083,16 @@ pub trait TObject<'gc>: 'gc + Collect + Debug + Into<Object<'gc>> + Clone + Copy
fn as_ptr(&self) -> *const ObjectPtr;
/// Get this object's `Class`, if it has one.
fn as_class(&self) -> Option<GcCell<'gc, Class<'gc>>>;
fn as_class(&self) -> Option<GcCell<'gc, Class<'gc>>> {
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<Object<'gc>>;

View File

@ -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};

View File

@ -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};

View File

@ -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};

View File

@ -344,6 +344,10 @@ impl<'gc> ClassObject<'gc> {
Ok(())
}
pub fn inner_class_definition(self) -> Option<GcCell<'gc, Class<'gc>>> {
Some(self.0.read().class)
}
pub fn interfaces(self) -> Vec<Object<'gc>> {
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<GcCell<'gc, Class<'gc>>> {
Some(self.0.read().class)
}
fn as_class_object(&self) -> Option<Object<'gc>> {
None //AS3 does not have metaclasses
}

View File

@ -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<GcCell<'gc, Class<'gc>>> {
self.0.read().$field.as_class()
}
fn as_class_object(&self) -> Option<Object<'gc>> {
self.0.read().$field.as_class_object()
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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};

View File

@ -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};

View File

@ -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};

View File

@ -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};

View File

@ -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};

View File

@ -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<GcCell<'gc, Class<'gc>>> {
self.0.read().as_class()
}
fn as_class_object(&self) -> Option<Object<'gc>> {
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<GcCell<'gc, Class<'gc>>> {
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<Object<'gc>> {
self.instance_of

View File

@ -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};

View File

@ -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};

View File

@ -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<GcCell<'gc, Class<'gc>>> {
self.0.read().base.as_class()
}
fn as_class_object(&self) -> Option<Object<'gc>> {
self.0.read().base.as_class_object()
}

View File

@ -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};

View File

@ -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};