avm2: Class initializers will be called twice when constructing two `ClassObject`s for one `Class`
This commit is contained in:
parent
7e7032d908
commit
1705870951
|
@ -151,9 +151,6 @@ pub struct ClassData<'gc> {
|
||||||
/// Must be called once and only once prior to any use of this class.
|
/// Must be called once and only once prior to any use of this class.
|
||||||
class_init: Method<'gc>,
|
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`
|
/// The customization point for `Class(args...)` without `new`
|
||||||
/// If None, a simple coercion is done.
|
/// If None, a simple coercion is done.
|
||||||
call_handler: Option<Method<'gc>>,
|
call_handler: Option<Method<'gc>>,
|
||||||
|
@ -238,7 +235,6 @@ impl<'gc> Class<'gc> {
|
||||||
instance_traits: Vec::new(),
|
instance_traits: Vec::new(),
|
||||||
instance_vtable: VTable::empty(mc),
|
instance_vtable: VTable::empty(mc),
|
||||||
class_init,
|
class_init,
|
||||||
class_initializer_called: false,
|
|
||||||
call_handler: None,
|
call_handler: None,
|
||||||
class_traits: Vec::new(),
|
class_traits: Vec::new(),
|
||||||
traits_loaded: true,
|
traits_loaded: true,
|
||||||
|
@ -463,7 +459,6 @@ impl<'gc> Class<'gc> {
|
||||||
instance_traits: Vec::new(),
|
instance_traits: Vec::new(),
|
||||||
instance_vtable: VTable::empty(activation.context.gc_context),
|
instance_vtable: VTable::empty(activation.context.gc_context),
|
||||||
class_init,
|
class_init,
|
||||||
class_initializer_called: false,
|
|
||||||
call_handler: native_call_handler,
|
call_handler: native_call_handler,
|
||||||
class_traits: Vec::new(),
|
class_traits: Vec::new(),
|
||||||
traits_loaded: false,
|
traits_loaded: false,
|
||||||
|
@ -718,7 +713,6 @@ impl<'gc> Class<'gc> {
|
||||||
"<Activation object class constructor>",
|
"<Activation object class constructor>",
|
||||||
activation.context.gc_context,
|
activation.context.gc_context,
|
||||||
),
|
),
|
||||||
class_initializer_called: false,
|
|
||||||
call_handler: None,
|
call_handler: None,
|
||||||
class_traits: Vec::new(),
|
class_traits: Vec::new(),
|
||||||
traits_loaded: true,
|
traits_loaded: true,
|
||||||
|
@ -1111,16 +1105,6 @@ impl<'gc> Class<'gc> {
|
||||||
self.0.read().call_handler
|
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>>> {
|
pub fn direct_interfaces(&self) -> Ref<Vec<Class<'gc>>> {
|
||||||
Ref::map(self.0.read(), |c| &c.direct_interfaces)
|
Ref::map(self.0.read(), |c| &c.direct_interfaces)
|
||||||
}
|
}
|
||||||
|
|
|
@ -351,20 +351,16 @@ impl<'gc> ClassObject<'gc> {
|
||||||
let scope = self.0.read().class_scope;
|
let scope = self.0.read().class_scope;
|
||||||
let class = self.0.read().class;
|
let class = self.0.read().class;
|
||||||
|
|
||||||
if !class.is_class_initialized() {
|
let class_initializer = class.class_init();
|
||||||
let class_initializer = class.class_init();
|
let class_init_fn = FunctionObject::from_method(
|
||||||
let class_init_fn = FunctionObject::from_method(
|
activation,
|
||||||
activation,
|
class_initializer,
|
||||||
class_initializer,
|
scope,
|
||||||
scope,
|
Some(object),
|
||||||
Some(object),
|
Some(self),
|
||||||
Some(self),
|
);
|
||||||
);
|
|
||||||
|
|
||||||
class.mark_class_initialized(activation.context.gc_context);
|
class_init_fn.call(object.into(), &[], activation)?;
|
||||||
|
|
||||||
class_init_fn.call(object.into(), &[], activation)?;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue