refactor: Stop manually borrowing fields in mutate_with_update_context

This commit is contained in:
Adrian Wielgosik 2021-10-21 18:52:27 +02:00 committed by Mike Welsh
parent 8cc00f32bb
commit 969fab7619
1 changed files with 20 additions and 66 deletions

View File

@ -1439,52 +1439,6 @@ impl Player {
where where
F: for<'a, 'gc> FnOnce(&mut UpdateContext<'a, 'gc, '_>) -> R, F: for<'a, 'gc> FnOnce(&mut UpdateContext<'a, 'gc, '_>) -> R,
{ {
// We have to do this piecewise borrowing of fields before the closure to avoid
// completely borrowing `self`.
let (
player_version,
swf,
renderer,
audio,
navigator,
ui,
rng,
mouse_position,
player,
system_properties,
instance_counter,
storage,
locale,
logging,
video,
needs_render,
max_execution_duration,
current_frame,
time_offset,
frame_rate,
) = (
self.player_version,
&self.swf,
self.renderer.deref_mut(),
self.audio.deref_mut(),
self.navigator.deref_mut(),
self.ui.deref_mut(),
&mut self.rng,
&self.mouse_pos,
self.self_reference.clone(),
&mut self.system,
&mut self.instance_counter,
self.storage.deref_mut(),
self.locale.deref_mut(),
self.log.deref_mut(),
self.video.deref_mut(),
&mut self.needs_render,
self.max_execution_duration,
&mut self.current_frame,
&mut self.time_offset,
&mut self.frame_rate,
);
self.gc_arena.mutate(|gc_context, gc_root| { self.gc_arena.mutate(|gc_context, gc_root| {
let mut root_data = gc_root.0.write(gc_context); let mut root_data = gc_root.0.write(gc_context);
let mouse_hovered_object = root_data.mouse_hovered_object; let mouse_hovered_object = root_data.mouse_hovered_object;
@ -1507,44 +1461,44 @@ impl Player {
) = root_data.update_context_params(); ) = root_data.update_context_params();
let mut update_context = UpdateContext { let mut update_context = UpdateContext {
player_version, player_version: self.player_version,
swf, swf: &self.swf,
library, library,
rng, rng: &mut self.rng,
renderer, renderer: self.renderer.deref_mut(),
audio, audio: self.audio.deref_mut(),
navigator, navigator: self.navigator.deref_mut(),
ui, ui: self.ui.deref_mut(),
action_queue, action_queue,
gc_context, gc_context,
stage, stage,
mouse_over_object: mouse_hovered_object, mouse_over_object: mouse_hovered_object,
mouse_down_object: mouse_pressed_object, mouse_down_object: mouse_pressed_object,
mouse_position, mouse_position: &self.mouse_pos,
drag_object, drag_object,
player, player: self.self_reference.clone(),
load_manager, load_manager,
system: system_properties, system: &mut self.system,
instance_counter, instance_counter: &mut self.instance_counter,
storage, storage: self.storage.deref_mut(),
locale, locale: self.locale.deref_mut(),
log: logging, log: self.log.deref_mut(),
video, video: self.video.deref_mut(),
shared_objects, shared_objects,
unbound_text_fields, unbound_text_fields,
timers, timers,
current_context_menu, current_context_menu,
needs_render, needs_render: &mut self.needs_render,
avm1, avm1,
avm2, avm2,
external_interface, external_interface,
update_start: Instant::now(), update_start: Instant::now(),
max_execution_duration, max_execution_duration: self.max_execution_duration,
focus_tracker, focus_tracker,
times_get_time_called: 0, times_get_time_called: 0,
time_offset, time_offset: &mut self.time_offset,
audio_manager, audio_manager,
frame_rate, frame_rate: &mut self.frame_rate,
}; };
let old_frame_rate = *update_context.frame_rate; let old_frame_rate = *update_context.frame_rate;
@ -1559,7 +1513,7 @@ impl Player {
update_context.audio.set_frame_rate(new_frame_rate); update_context.audio.set_frame_rate(new_frame_rate);
} }
*current_frame = update_context self.current_frame = update_context
.stage .stage
.root_clip() .root_clip()
.as_movie_clip() .as_movie_clip()