avm2: Reimplement as_class() in terms of other methods
This commit is contained in:
parent
4380978b2a
commit
e02feb919a
|
@ -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>>;
|
||||
|
|
|
@ -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};
|
||||
|
|
|
@ -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};
|
||||
|
|
|
@ -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};
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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};
|
||||
|
|
|
@ -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};
|
||||
|
|
|
@ -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};
|
||||
|
|
|
@ -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};
|
||||
|
|
|
@ -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};
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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};
|
||||
|
|
|
@ -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};
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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};
|
||||
|
|
|
@ -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};
|
||||
|
|
Loading…
Reference in New Issue