diff --git a/core/src/avm2/object.rs b/core/src/avm2/object.rs index f30619cab..1c18969d2 100644 --- a/core/src/avm2/object.rs +++ b/core/src/avm2/object.rs @@ -3,7 +3,7 @@ use crate::avm2::activation::Activation; use crate::avm2::array::ArrayStorage; use crate::avm2::bytearray::ByteArrayStorage; -use crate::avm2::class::{AllocatorFn, Class}; +use crate::avm2::class::Class; use crate::avm2::domain::Domain; use crate::avm2::events::{DispatchList, Event}; use crate::avm2::function::Executable; @@ -1094,11 +1094,6 @@ pub trait TObject<'gc>: 'gc + Collect + Debug + Into> + Clone + Copy None } - /// Get this class's instance allocator. - fn instance_allocator(self) -> Option { - None - } - /// Get this object's `Executable`, if it has one. fn as_executable(&self) -> Option> { None diff --git a/core/src/avm2/object/class_object.rs b/core/src/avm2/object/class_object.rs index 226725a99..526634f84 100644 --- a/core/src/avm2/object/class_object.rs +++ b/core/src/avm2/object/class_object.rs @@ -106,7 +106,11 @@ impl<'gc> ClassObject<'gc> { let instance_allocator = class .read() .instance_allocator() - .or_else(|| superclass_object.and_then(|c| c.instance_allocator())) + .or_else(|| + superclass_object + .and_then(|c| c.as_class_object_really()) + .and_then(|c| c.instance_allocator()) + ) .unwrap_or(scriptobject_allocator); //TODO: Class prototypes are *not* instances of their class and should @@ -191,7 +195,11 @@ impl<'gc> ClassObject<'gc> { let instance_allocator = class .read() .instance_allocator() - .or_else(|| superclass_object.and_then(|c| c.instance_allocator())) + .or_else(|| + superclass_object + .and_then(|c| c.as_class_object_really()) + .and_then(|c| c.instance_allocator()) + ) .unwrap_or(scriptobject_allocator); let constructor = Executable::from_method(class.read().instance_init(), scope, None, mc); @@ -347,6 +355,10 @@ impl<'gc> ClassObject<'gc> { pub fn as_class_params(self) -> Option>> { self.0.read().params } + + fn instance_allocator(self) -> Option { + Some(self.0.read().instance_allocator.0) + } } impl<'gc> TObject<'gc> for ClassObject<'gc> { @@ -451,10 +463,6 @@ impl<'gc> TObject<'gc> for ClassObject<'gc> { .into()) } - fn instance_allocator(self) -> Option { - Some(self.0.read().instance_allocator.0) - } - fn get_scope(self) -> Option>> { self.0.read().scope }