avm2: Reimplement as_class_object() in terms of other methods

This commit is contained in:
Adrian Wielgosik 2021-09-18 12:28:23 +02:00 committed by Adrian Wielgosik
parent e02feb919a
commit 3e1764aa1e
5 changed files with 10 additions and 26 deletions

View File

@ -1094,8 +1094,13 @@ pub trait TObject<'gc>: 'gc + Collect + Debug + Into<Object<'gc>> + Clone + Copy
class.inner_class_definition()
}
/// Get this object's class object, if it has one.
fn as_class_object(&self) -> Option<Object<'gc>>;
/// Get this object's class object, if it has one - unless it's a class itself.
fn as_class_object(&self) -> Option<Object<'gc>> {
match self.as_class_object_really() {
Some(_class) => None,
None => self.instance_of()
}
}
fn instance_of(&self) -> Option<Object<'gc>>;

View File

@ -494,10 +494,6 @@ impl<'gc> TObject<'gc> for ClassObject<'gc> {
.resolve_any_class_trait(local_name))
}
fn as_class_object(&self) -> Option<Object<'gc>> {
None //AS3 does not have metaclasses
}
fn as_class_object_really(&self) -> Option<ClassObject<'gc>> {
Some(*self)
}

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_object(&self) -> Option<Object<'gc>> {
self.0.read().$field.as_class_object()
}
fn instance_of(&self) -> Option<Object<'gc>> {
self.0.read().$field.instance_of()
}

View File

@ -299,10 +299,6 @@ impl<'gc> TObject<'gc> for ScriptObject<'gc> {
self.0.write(mc).install_const(name, id, value, is_final)
}
fn as_class_object(&self) -> Option<Object<'gc>> {
self.0.read().as_class_object()
}
fn instance_of(&self) -> Option<Object<'gc>> {
self.0.read().instance_of()
}
@ -366,7 +362,7 @@ impl<'gc> ScriptObjectData<'gc> {
Some(
activation
.subclass_object()
.or_else(|| self.as_class_object())
.or_else(|| self.instance_of())
.unwrap_or(receiver),
),
)
@ -382,7 +378,7 @@ impl<'gc> ScriptObjectData<'gc> {
value: Value<'gc>,
activation: &mut Activation<'_, 'gc, '_>,
) -> Result<ReturnValue<'gc>, Error> {
let class = self.as_class_object();
let class = self.instance_of();
let slot_id = if let Some(prop) = self.values.get(name) {
if let Some(slot_id) = prop.slot_id() {
Some(slot_id)
@ -420,7 +416,7 @@ impl<'gc> ScriptObjectData<'gc> {
value: Value<'gc>,
activation: &mut Activation<'_, 'gc, '_>,
) -> Result<ReturnValue<'gc>, Error> {
let class = self.as_class_object();
let class = self.instance_of();
if let Some(prop) = self.values.get_mut(name) {
if let Some(slot_id) = prop.slot_id() {
self.init_slot(slot_id, value, activation.context.gc_context)?;
@ -824,11 +820,6 @@ impl<'gc> ScriptObjectData<'gc> {
}
}
/// Get the class object for this object, if it has one.
pub fn as_class_object(&self) -> Option<Object<'gc>> {
self.instance_of
}
/// Get the class object for this object, if it has one.
pub fn instance_of(&self) -> Option<Object<'gc>> {
self.instance_of

View File

@ -285,10 +285,6 @@ impl<'gc> TObject<'gc> for StageObject<'gc> {
None
}
fn as_class_object(&self) -> Option<Object<'gc>> {
self.0.read().base.as_class_object()
}
fn instance_of(&self) -> Option<Object<'gc>> {
self.0.read().base.instance_of()
}