avm2: Initialize global scope object earlier and remove `set_instance_class`

This commit is contained in:
Lord-McSweeney 2024-07-01 16:43:47 +03:00 committed by Lord-McSweeney
parent 0d637d34dd
commit 1b5daf5981
5 changed files with 18 additions and 18 deletions

View File

@ -508,13 +508,16 @@ pub fn load_player_globals<'gc>(
// Function is more of a "normal" class than the other two, so we can create it normally.
let fn_classdef = function::create_class(activation, object_i_class, class_i_class);
// Register the classes in the domain, now
// Do the same for the global class
let global_classdef = global_scope::create_class(activation, object_i_class, class_i_class);
// Register the classes in the domain, now (except for the global class)
domain.export_class(object_i_class.name(), object_i_class, mc);
domain.export_class(class_i_class.name(), class_i_class, mc);
domain.export_class(fn_classdef.name(), fn_classdef, mc);
// Initialize the script
let globals = ScriptObject::custom_object(mc, object_i_class, None, None);
let globals = ScriptObject::custom_object(mc, global_classdef, None, None);
let script = Script::empty_script(mc, globals, domain);
let gs = ScopeChain::new(domain).chain(mc, &[Scope::new(globals)]);
@ -565,11 +568,9 @@ pub fn load_player_globals<'gc>(
fn_class.link_prototype(activation, fn_proto)?;
// Construct the global class.
let global_classdef = global_scope::create_class(activation);
let global_class = ClassObject::from_class(activation, global_classdef, Some(object_class))?;
globals.set_proto(mc, global_class.prototype());
globals.set_instance_class(mc, global_classdef);
globals.set_vtable(mc, global_class.instance_vtable());
activation.context.avm2.toplevel_global_object = Some(globals);

View File

@ -31,14 +31,18 @@ pub fn class_init<'gc>(
}
/// Construct `global`'s class.
pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> Class<'gc> {
pub fn create_class<'gc>(
activation: &mut Activation<'_, 'gc>,
object_classdef: Class<'gc>,
class_classdef: Class<'gc>,
) -> Class<'gc> {
let mc = activation.context.gc_context;
let class = Class::new(
QName::new(activation.avm2().public_namespace_base_version, "global"),
Some(activation.avm2().classes().object.inner_class_definition()),
Some(object_classdef),
Method::from_builtin(instance_init, "<global instance initializer>", mc),
Method::from_builtin(class_init, "<global class initializer>", mc),
activation.avm2().classes().class.inner_class_definition(),
class_classdef,
mc,
);

View File

@ -1107,11 +1107,6 @@ pub trait TObject<'gc>: 'gc + Collect + Debug + Into<Object<'gc>> + Clone + Copy
self.instance_class().name().to_qualified_name(mc)
}
fn set_instance_class(&self, mc: &Mutation<'gc>, instance_class: Class<'gc>) {
let mut base = self.base_mut(mc);
base.set_instance_class(instance_class);
}
// Sets a different vtable for object, without changing instance_of.
fn set_vtable(&self, mc: &Mutation<'gc>, vtable: VTable<'gc>) {
let mut base = self.base_mut(mc);

View File

@ -421,11 +421,6 @@ impl<'gc> ScriptObjectData<'gc> {
self.instance_class().is_sealed()
}
/// Set the class object for this object.
pub fn set_instance_class(&mut self, instance_class: Class<'gc>) {
self.instance_class = instance_class;
}
pub fn set_vtable(&mut self, vtable: VTable<'gc>) {
self.vtable = Some(vtable);
}

View File

@ -255,8 +255,13 @@ impl<'gc> TranslationUnit<'gc> {
drop(read);
let object_class = activation.avm2().classes().object;
let class_classdef = activation.avm2().classes().class.inner_class_definition();
let global_classdef = global_scope::create_class(activation);
let global_classdef = global_scope::create_class(
activation,
object_class.inner_class_definition(),
class_classdef,
);
let global_class =
ClassObject::from_class(activation, global_classdef, Some(object_class))?;