diff --git a/core/src/avm1/script_object.rs b/core/src/avm1/script_object.rs index 4cccd34bd..f0f83e918 100644 --- a/core/src/avm1/script_object.rs +++ b/core/src/avm1/script_object.rs @@ -760,9 +760,11 @@ mod tests { player: None, load_manager: &mut LoadManager::new(), system: &mut SystemProperties::default(), + instance_counter: &mut 0, }; root.post_instantiation(&mut avm, &mut context, root, None, false); + root.set_name(context.gc_context, ""); let object = ScriptObject::object(gc_context, Some(avm.prototypes().object)).into(); diff --git a/core/src/avm1/test_utils.rs b/core/src/avm1/test_utils.rs index fef6644cf..5a2cf16a8 100644 --- a/core/src/avm1/test_utils.rs +++ b/core/src/avm1/test_utils.rs @@ -59,8 +59,10 @@ where player: None, load_manager: &mut LoadManager::new(), system: &mut SystemProperties::default(), + instance_counter: &mut 0, }; root.post_instantiation(&mut avm, &mut context, root, None, false); + root.set_name(context.gc_context, ""); let globals = avm.global_object_cell(); avm.insert_stack_frame(GcCell::allocate( diff --git a/core/src/context.rs b/core/src/context.rs index 2893c93cc..acc483cd6 100644 --- a/core/src/context.rs +++ b/core/src/context.rs @@ -100,6 +100,9 @@ pub struct UpdateContext<'a, 'gc, 'gc_context> { /// The system properties pub system: &'a mut SystemProperties, + + /// The current instance ID. Used to generate default `instanceN` names. + pub instance_counter: &'a mut i32, } /// A queued ActionScript call. diff --git a/core/src/display_object.rs b/core/src/display_object.rs index 234f48152..1998f2633 100644 --- a/core/src/display_object.rs +++ b/core/src/display_object.rs @@ -889,6 +889,15 @@ pub trait TDisplayObject<'gc>: 'gc + Collect + Debug + Into> }) .expect("All objects must have root") } + + /// Assigns a default instance name `instanceN` to this object. + fn set_default_instance_name(&mut self, context: &mut UpdateContext<'_, 'gc, '_>) { + if self.name().is_empty() { + let name = format!("instance{}", *context.instance_counter); + self.set_name(context.gc_context, &name); + *context.instance_counter = context.instance_counter.wrapping_add(1); + } + } } pub enum DisplayObjectPtr {} diff --git a/core/src/display_object/button.rs b/core/src/display_object/button.rs index a19462525..4199705f6 100644 --- a/core/src/display_object/button.rs +++ b/core/src/display_object/button.rs @@ -124,6 +124,8 @@ impl<'gc> TDisplayObject<'gc> for Button<'gc> { _init_object: Option>, _instantiated_from_avm: bool, ) { + self.set_default_instance_name(context); + let mut mc = self.0.write(context.gc_context); if mc.object.is_none() { let object = StageObject::for_display_object( diff --git a/core/src/display_object/edit_text.rs b/core/src/display_object/edit_text.rs index e35dc017e..00e0e3231 100644 --- a/core/src/display_object/edit_text.rs +++ b/core/src/display_object/edit_text.rs @@ -435,6 +435,8 @@ impl<'gc> TDisplayObject<'gc> for EditText<'gc> { _init_object: Option>, _instantiated_from_avm: bool, ) { + self.set_default_instance_name(context); + let mut text = self.0.write(context.gc_context); if text.object.is_none() { let object = StageObject::for_display_object( diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index 47a5f70dd..868e235a2 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -722,6 +722,8 @@ impl<'gc> TDisplayObject<'gc> for MovieClip<'gc> { init_object: Option>, instantiated_from_avm: bool, ) { + self.set_default_instance_name(context); + if self.0.read().object.is_none() { // If we are running within the AVM, this must be an immediate action. // If we are not, then this must be queued to be ran first-thing diff --git a/core/src/player.rs b/core/src/player.rs index 4a63690a7..7562ea406 100644 --- a/core/src/player.rs +++ b/core/src/player.rs @@ -139,6 +139,9 @@ pub struct Player { system: SystemProperties, + /// The current instance ID. Used to generate default `instanceN` names. + instance_counter: i32, + /// Self-reference to ourselves. /// /// This is a weak reference that is upgraded and handed out in various @@ -238,6 +241,7 @@ impl Player { input, self_reference: None, system: SystemProperties::default(), + instance_counter: 0, }; player.mutate_with_update_context(|avm, context| { @@ -245,6 +249,7 @@ impl Player { MovieClip::from_movie(context.gc_context, movie.clone()).into(); root.set_depth(context.gc_context, 0); root.post_instantiation(avm, context, root, None, false); + root.set_name(context.gc_context, ""); context.levels.insert(0, root); if let Ok(object) = root.object().as_object() { @@ -846,6 +851,7 @@ impl Player { stage_height, player, system_properties, + instance_counter, ) = ( self.player_version, self.global_time, @@ -861,6 +867,7 @@ impl Player { Twips::from_pixels(self.movie_height.into()), self.self_reference.clone(), &mut self.system, + &mut self.instance_counter, ); self.gc_arena.mutate(|gc_context, gc_root| { @@ -891,6 +898,7 @@ impl Player { player, load_manager, system: system_properties, + instance_counter, }; let ret = f(avm, &mut update_context);