core: Add Log backend, for capturing trace output specific to a movie
This commit is contained in:
parent
091f04096d
commit
de009c7673
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)),
|
||||||
|
|
|
@ -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)),
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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()
|
||||||
|
}
|
||||||
|
}
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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));
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue