From 1b5daf5981cabbf8bad25305db3de19e13ed6655 Mon Sep 17 00:00:00 2001 From: Lord-McSweeney Date: Mon, 1 Jul 2024 16:43:47 +0300 Subject: [PATCH] avm2: Initialize global scope object earlier and remove `set_instance_class` --- core/src/avm2/globals.rs | 9 +++++---- core/src/avm2/globals/global_scope.rs | 10 +++++++--- core/src/avm2/object.rs | 5 ----- core/src/avm2/object/script_object.rs | 5 ----- core/src/avm2/script.rs | 7 ++++++- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/core/src/avm2/globals.rs b/core/src/avm2/globals.rs index 6c0f74e44..8cb90df86 100644 --- a/core/src/avm2/globals.rs +++ b/core/src/avm2/globals.rs @@ -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); diff --git a/core/src/avm2/globals/global_scope.rs b/core/src/avm2/globals/global_scope.rs index 4d6f9d8f3..68b1c9fa0 100644 --- a/core/src/avm2/globals/global_scope.rs +++ b/core/src/avm2/globals/global_scope.rs @@ -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, "", mc), Method::from_builtin(class_init, "", mc), - activation.avm2().classes().class.inner_class_definition(), + class_classdef, mc, ); diff --git a/core/src/avm2/object.rs b/core/src/avm2/object.rs index cc8288e18..992776dc4 100644 --- a/core/src/avm2/object.rs +++ b/core/src/avm2/object.rs @@ -1107,11 +1107,6 @@ pub trait TObject<'gc>: 'gc + Collect + Debug + Into> + 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); diff --git a/core/src/avm2/object/script_object.rs b/core/src/avm2/object/script_object.rs index 7a2f34146..07ad163ef 100644 --- a/core/src/avm2/object/script_object.rs +++ b/core/src/avm2/object/script_object.rs @@ -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); } diff --git a/core/src/avm2/script.rs b/core/src/avm2/script.rs index 904021b83..7d6e1e764 100644 --- a/core/src/avm2/script.rs +++ b/core/src/avm2/script.rs @@ -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))?;