avm2: Class initializers will be called twice when constructing two `ClassObject`s for one `Class`

This commit is contained in:
Lord-McSweeney 2024-06-12 22:22:53 -07:00 committed by Adrian Wielgosik
parent 7e7032d908
commit 1705870951
2 changed files with 9 additions and 29 deletions

View File

@ -151,9 +151,6 @@ pub struct ClassData<'gc> {
/// Must be called once and only once prior to any use of this class.
class_init: Method<'gc>,
/// Whether or not the class initializer has already been called.
class_initializer_called: bool,
/// The customization point for `Class(args...)` without `new`
/// If None, a simple coercion is done.
call_handler: Option<Method<'gc>>,
@ -238,7 +235,6 @@ impl<'gc> Class<'gc> {
instance_traits: Vec::new(),
instance_vtable: VTable::empty(mc),
class_init,
class_initializer_called: false,
call_handler: None,
class_traits: Vec::new(),
traits_loaded: true,
@ -463,7 +459,6 @@ impl<'gc> Class<'gc> {
instance_traits: Vec::new(),
instance_vtable: VTable::empty(activation.context.gc_context),
class_init,
class_initializer_called: false,
call_handler: native_call_handler,
class_traits: Vec::new(),
traits_loaded: false,
@ -718,7 +713,6 @@ impl<'gc> Class<'gc> {
"<Activation object class constructor>",
activation.context.gc_context,
),
class_initializer_called: false,
call_handler: None,
class_traits: Vec::new(),
traits_loaded: true,
@ -1111,16 +1105,6 @@ impl<'gc> Class<'gc> {
self.0.read().call_handler
}
/// Check if the class has already been initialized.
pub fn is_class_initialized(self) -> bool {
self.0.read().class_initializer_called
}
/// Mark the class as initialized.
pub fn mark_class_initialized(self, mc: &Mutation<'gc>) {
self.0.write(mc).class_initializer_called = true;
}
pub fn direct_interfaces(&self) -> Ref<Vec<Class<'gc>>> {
Ref::map(self.0.read(), |c| &c.direct_interfaces)
}

View File

@ -351,7 +351,6 @@ impl<'gc> ClassObject<'gc> {
let scope = self.0.read().class_scope;
let class = self.0.read().class;
if !class.is_class_initialized() {
let class_initializer = class.class_init();
let class_init_fn = FunctionObject::from_method(
activation,
@ -361,10 +360,7 @@ impl<'gc> ClassObject<'gc> {
Some(self),
);
class.mark_class_initialized(activation.context.gc_context);
class_init_fn.call(object.into(), &[], activation)?;
}
Ok(())
}