core: Add Log backend, for capturing trace output specific to a movie

This commit is contained in:
Nathan Adams 2020-09-05 18:19:03 +02:00 committed by Mike Welsh
parent 091f04096d
commit de009c7673
11 changed files with 69 additions and 4 deletions

View File

@ -2056,6 +2056,7 @@ impl<'a, 'gc, 'gc_context> Activation<'a, 'gc, 'gc_context> {
} else { } else {
val.coerce_to_string(self)? val.coerce_to_string(self)?
}; };
self.context.log.avm_trace(&out);
log::info!(target: "avm_trace", "{}", out); log::info!(target: "avm_trace", "{}", out);
Ok(FrameControl::Continue) Ok(FrameControl::Continue)
} }

View File

@ -847,6 +847,7 @@ mod tests {
use crate::backend::audio::NullAudioBackend; use crate::backend::audio::NullAudioBackend;
use crate::backend::input::NullInputBackend; use crate::backend::input::NullInputBackend;
use crate::backend::locale::NullLocaleBackend; use crate::backend::locale::NullLocaleBackend;
use crate::backend::log::NullLogBackend;
use crate::backend::navigator::NullNavigatorBackend; use crate::backend::navigator::NullNavigatorBackend;
use crate::backend::render::NullRenderer; use crate::backend::render::NullRenderer;
use crate::backend::storage::MemoryStorageBackend; use crate::backend::storage::MemoryStorageBackend;
@ -897,6 +898,7 @@ mod tests {
navigator: &mut NullNavigatorBackend::new(), navigator: &mut NullNavigatorBackend::new(),
renderer: &mut NullRenderer::new(), renderer: &mut NullRenderer::new(),
locale: &mut NullLocaleBackend::new(), locale: &mut NullLocaleBackend::new(),
log: &mut NullLogBackend::new(),
system_prototypes: avm1.prototypes().clone(), system_prototypes: avm1.prototypes().clone(),
mouse_hovered_object: None, mouse_hovered_object: None,
mouse_position: &(Twips::new(0), Twips::new(0)), mouse_position: &(Twips::new(0), Twips::new(0)),

View File

@ -6,6 +6,7 @@ use crate::avm2::Avm2;
use crate::backend::audio::NullAudioBackend; use crate::backend::audio::NullAudioBackend;
use crate::backend::input::NullInputBackend; use crate::backend::input::NullInputBackend;
use crate::backend::locale::NullLocaleBackend; use crate::backend::locale::NullLocaleBackend;
use crate::backend::log::NullLogBackend;
use crate::backend::navigator::NullNavigatorBackend; use crate::backend::navigator::NullNavigatorBackend;
use crate::backend::render::NullRenderer; use crate::backend::render::NullRenderer;
use crate::backend::storage::MemoryStorageBackend; use crate::backend::storage::MemoryStorageBackend;
@ -58,6 +59,7 @@ where
navigator: &mut NullNavigatorBackend::new(), navigator: &mut NullNavigatorBackend::new(),
renderer: &mut NullRenderer::new(), renderer: &mut NullRenderer::new(),
locale: &mut NullLocaleBackend::new(), locale: &mut NullLocaleBackend::new(),
log: &mut NullLogBackend::new(),
system_prototypes: avm1.prototypes().clone(), system_prototypes: avm1.prototypes().clone(),
mouse_hovered_object: None, mouse_hovered_object: None,
mouse_position: &(Twips::new(0), Twips::new(0)), mouse_position: &(Twips::new(0), Twips::new(0)),

View File

@ -1,6 +1,7 @@
pub mod audio; pub mod audio;
pub mod input; pub mod input;
pub mod locale; pub mod locale;
pub mod log;
pub mod navigator; pub mod navigator;
pub mod render; pub mod render;
pub mod storage; pub mod storage;

22
core/src/backend/log.rs Normal file
View File

@ -0,0 +1,22 @@
pub trait LogBackend {
fn avm_trace(&self, message: &str);
}
/// Logging backend that does nothing.
pub struct NullLogBackend {}
impl NullLogBackend {
pub fn new() -> Self {
Self {}
}
}
impl LogBackend for NullLogBackend {
fn avm_trace(&self, _message: &str) {}
}
impl Default for NullLogBackend {
fn default() -> Self {
NullLogBackend::new()
}
}

View File

@ -6,6 +6,7 @@ use crate::avm1::{Avm1, Object, Timers, Value};
use crate::avm2::Avm2; use crate::avm2::Avm2;
use crate::backend::input::InputBackend; use crate::backend::input::InputBackend;
use crate::backend::locale::LocaleBackend; use crate::backend::locale::LocaleBackend;
use crate::backend::log::LogBackend;
use crate::backend::storage::StorageBackend; use crate::backend::storage::StorageBackend;
use crate::backend::{audio::AudioBackend, navigator::NavigatorBackend, render::RenderBackend}; use crate::backend::{audio::AudioBackend, navigator::NavigatorBackend, render::RenderBackend};
use crate::display_object::EditText; use crate::display_object::EditText;
@ -72,6 +73,9 @@ pub struct UpdateContext<'a, 'gc, 'gc_context> {
/// The locale backend, used for localisation and personalisation /// The locale backend, used for localisation and personalisation
pub locale: &'a mut dyn LocaleBackend, pub locale: &'a mut dyn LocaleBackend,
/// The logging backend, used for trace output capturing
pub log: &'a mut dyn LogBackend,
/// The RNG, used by the AVM `RandomNumber` opcode, `Math.random(),` and `random()`. /// The RNG, used by the AVM `RandomNumber` opcode, `Math.random(),` and `random()`.
pub rng: &'a mut SmallRng, pub rng: &'a mut SmallRng,
@ -185,6 +189,7 @@ impl<'a, 'gc, 'gc_context> UpdateContext<'a, 'gc, 'gc_context> {
navigator: self.navigator, navigator: self.navigator,
renderer: self.renderer, renderer: self.renderer,
locale: self.locale, locale: self.locale,
log: self.log,
input: self.input, input: self.input,
storage: self.storage, storage: self.storage,
rng: self.rng, rng: self.rng,

View File

@ -8,7 +8,9 @@ use crate::backend::input::{InputBackend, MouseCursor};
use crate::backend::locale::LocaleBackend; use crate::backend::locale::LocaleBackend;
use crate::backend::navigator::{NavigatorBackend, RequestOptions}; use crate::backend::navigator::{NavigatorBackend, RequestOptions};
use crate::backend::storage::StorageBackend; use crate::backend::storage::StorageBackend;
use crate::backend::{audio::AudioBackend, render::Letterbox, render::RenderBackend}; use crate::backend::{
audio::AudioBackend, log::LogBackend, render::Letterbox, render::RenderBackend,
};
use crate::context::{ActionQueue, ActionType, RenderContext, UpdateContext}; use crate::context::{ActionQueue, ActionType, RenderContext, UpdateContext};
use crate::display_object::{EditText, MorphShape, MovieClip}; use crate::display_object::{EditText, MorphShape, MovieClip};
use crate::events::{ButtonKeyCode, ClipEvent, ClipEventResult, KeyCode, PlayerEvent}; use crate::events::{ButtonKeyCode, ClipEvent, ClipEventResult, KeyCode, PlayerEvent};
@ -123,6 +125,7 @@ type Renderer = Box<dyn RenderBackend>;
type Input = Box<dyn InputBackend>; type Input = Box<dyn InputBackend>;
type Storage = Box<dyn StorageBackend>; type Storage = Box<dyn StorageBackend>;
type Locale = Box<dyn LocaleBackend>; type Locale = Box<dyn LocaleBackend>;
type Log = Box<dyn LogBackend>;
pub struct Player { pub struct Player {
/// The version of the player we're emulating. /// The version of the player we're emulating.
@ -147,6 +150,7 @@ pub struct Player {
pub navigator: Navigator, pub navigator: Navigator,
input: Input, input: Input,
locale: Locale, locale: Locale,
log: Log,
transform_stack: TransformStack, transform_stack: TransformStack,
view_matrix: Matrix, view_matrix: Matrix,
inverse_view_matrix: Matrix, inverse_view_matrix: Matrix,
@ -197,6 +201,7 @@ impl Player {
input: Input, input: Input,
storage: Storage, storage: Storage,
locale: Locale, locale: Locale,
log: Log,
) -> Result<Arc<Mutex<Self>>, Error> { ) -> Result<Arc<Mutex<Self>>, Error> {
let fake_movie = Arc::new(SwfMovie::empty(NEWEST_PLAYER_VERSION)); let fake_movie = Arc::new(SwfMovie::empty(NEWEST_PLAYER_VERSION));
let movie_width = 550; let movie_width = 550;
@ -261,6 +266,7 @@ impl Player {
navigator, navigator,
input, input,
locale, locale,
log,
self_reference: None, self_reference: None,
system: SystemProperties::default(), system: SystemProperties::default(),
instance_counter: 0, instance_counter: 0,
@ -1022,6 +1028,7 @@ impl Player {
instance_counter, instance_counter,
storage, storage,
locale, locale,
logging,
needs_render, needs_render,
) = ( ) = (
self.player_version, self.player_version,
@ -1040,6 +1047,7 @@ impl Player {
&mut self.instance_counter, &mut self.instance_counter,
self.storage.deref_mut(), self.storage.deref_mut(),
self.locale.deref_mut(), self.locale.deref_mut(),
self.log.deref_mut(),
&mut self.needs_render, &mut self.needs_render,
); );
@ -1084,6 +1092,7 @@ impl Player {
instance_counter, instance_counter,
storage, storage,
locale, locale,
log: logging,
shared_objects, shared_objects,
unbound_text_fields, unbound_text_fields,
timers, timers,

View File

@ -5,6 +5,7 @@
use approx::assert_abs_diff_eq; use approx::assert_abs_diff_eq;
use log::{Metadata, Record}; use log::{Metadata, Record};
use ruffle_core::backend::locale::NullLocaleBackend; use ruffle_core::backend::locale::NullLocaleBackend;
use ruffle_core::backend::log::NullLogBackend;
use ruffle_core::backend::navigator::{NullExecutor, NullNavigatorBackend}; use ruffle_core::backend::navigator::{NullExecutor, NullNavigatorBackend};
use ruffle_core::backend::storage::MemoryStorageBackend; use ruffle_core::backend::storage::MemoryStorageBackend;
use ruffle_core::backend::{ use ruffle_core::backend::{
@ -521,6 +522,7 @@ fn run_swf(
Box::new(NullInputBackend::new()), Box::new(NullInputBackend::new()),
Box::new(MemoryStorageBackend::default()), Box::new(MemoryStorageBackend::default()),
Box::new(NullLocaleBackend::new()), Box::new(NullLocaleBackend::new()),
Box::new(NullLogBackend::new()),
)?; )?;
player.lock().unwrap().set_root_movie(Arc::new(movie)); player.lock().unwrap().set_root_movie(Arc::new(movie));

View File

@ -22,6 +22,7 @@ use std::sync::Arc;
use std::time::Instant; use std::time::Instant;
use crate::storage::DiskStorageBackend; use crate::storage::DiskStorageBackend;
use ruffle_core::backend::log::NullLogBackend;
use ruffle_core::tag_utils::SwfMovie; use ruffle_core::tag_utils::SwfMovie;
use std::rc::Rc; use std::rc::Rc;
use winit::dpi::{LogicalSize, PhysicalPosition}; use winit::dpi::{LogicalSize, PhysicalPosition};
@ -168,7 +169,15 @@ fn run_player(
input_path.file_name().unwrap_or_default().as_ref(), input_path.file_name().unwrap_or_default().as_ref(),
)); ));
let locale = Box::new(locale::DesktopLocaleBackend::new()); let locale = Box::new(locale::DesktopLocaleBackend::new());
let player = Player::new(renderer, audio, navigator, input, storage, locale)?; let player = Player::new(
renderer,
audio,
navigator,
input,
storage,
locale,
Box::new(NullLogBackend::new()),
)?;
player.lock().unwrap().set_root_movie(Arc::new(movie)); player.lock().unwrap().set_root_movie(Arc::new(movie));
player.lock().unwrap().set_is_playing(true); // Desktop player will auto-play. player.lock().unwrap().set_is_playing(true); // Desktop player will auto-play.

View File

@ -5,6 +5,7 @@ use indicatif::{ProgressBar, ProgressStyle};
use ruffle_core::backend::audio::NullAudioBackend; use ruffle_core::backend::audio::NullAudioBackend;
use ruffle_core::backend::input::NullInputBackend; use ruffle_core::backend::input::NullInputBackend;
use ruffle_core::backend::locale::NullLocaleBackend; use ruffle_core::backend::locale::NullLocaleBackend;
use ruffle_core::backend::log::NullLogBackend;
use ruffle_core::backend::navigator::NullNavigatorBackend; use ruffle_core::backend::navigator::NullNavigatorBackend;
use ruffle_core::backend::storage::MemoryStorageBackend; use ruffle_core::backend::storage::MemoryStorageBackend;
use ruffle_core::tag_utils::SwfMovie; use ruffle_core::tag_utils::SwfMovie;
@ -89,6 +90,7 @@ fn take_screenshot(
Box::new(NullInputBackend::new()), Box::new(NullInputBackend::new()),
Box::new(MemoryStorageBackend::default()), Box::new(MemoryStorageBackend::default()),
Box::new(NullLocaleBackend::new()), Box::new(NullLocaleBackend::new()),
Box::new(NullLogBackend::new()),
)?; )?;
player player

View File

@ -14,6 +14,7 @@ use crate::{
}; };
use generational_arena::{Arena, Index}; use generational_arena::{Arena, Index};
use js_sys::{Array, Function, Object, Uint8Array}; use js_sys::{Array, Function, Object, Uint8Array};
use ruffle_core::backend::log::NullLogBackend;
use ruffle_core::backend::render::RenderBackend; use ruffle_core::backend::render::RenderBackend;
use ruffle_core::backend::storage::MemoryStorageBackend; use ruffle_core::backend::storage::MemoryStorageBackend;
use ruffle_core::backend::storage::StorageBackend; use ruffle_core::backend::storage::StorageBackend;
@ -231,8 +232,17 @@ impl Ruffle {
}) })
.unwrap_or_else(|| Box::new(MemoryStorageBackend::default())); .unwrap_or_else(|| Box::new(MemoryStorageBackend::default()));
let core = let log = Box::new(NullLogBackend::new());
ruffle_core::Player::new(renderer, audio, navigator, input, local_storage, locale)?;
let core = ruffle_core::Player::new(
renderer,
audio,
navigator,
input,
local_storage,
locale,
log,
)?;
// Create instance. // Create instance.
let instance = RuffleInstance { let instance = RuffleInstance {