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 {
|
||||
val.coerce_to_string(self)?
|
||||
};
|
||||
self.context.log.avm_trace(&out);
|
||||
log::info!(target: "avm_trace", "{}", out);
|
||||
Ok(FrameControl::Continue)
|
||||
}
|
||||
|
|
|
@ -847,6 +847,7 @@ mod tests {
|
|||
use crate::backend::audio::NullAudioBackend;
|
||||
use crate::backend::input::NullInputBackend;
|
||||
use crate::backend::locale::NullLocaleBackend;
|
||||
use crate::backend::log::NullLogBackend;
|
||||
use crate::backend::navigator::NullNavigatorBackend;
|
||||
use crate::backend::render::NullRenderer;
|
||||
use crate::backend::storage::MemoryStorageBackend;
|
||||
|
@ -897,6 +898,7 @@ mod tests {
|
|||
navigator: &mut NullNavigatorBackend::new(),
|
||||
renderer: &mut NullRenderer::new(),
|
||||
locale: &mut NullLocaleBackend::new(),
|
||||
log: &mut NullLogBackend::new(),
|
||||
system_prototypes: avm1.prototypes().clone(),
|
||||
mouse_hovered_object: None,
|
||||
mouse_position: &(Twips::new(0), Twips::new(0)),
|
||||
|
|
|
@ -6,6 +6,7 @@ use crate::avm2::Avm2;
|
|||
use crate::backend::audio::NullAudioBackend;
|
||||
use crate::backend::input::NullInputBackend;
|
||||
use crate::backend::locale::NullLocaleBackend;
|
||||
use crate::backend::log::NullLogBackend;
|
||||
use crate::backend::navigator::NullNavigatorBackend;
|
||||
use crate::backend::render::NullRenderer;
|
||||
use crate::backend::storage::MemoryStorageBackend;
|
||||
|
@ -58,6 +59,7 @@ where
|
|||
navigator: &mut NullNavigatorBackend::new(),
|
||||
renderer: &mut NullRenderer::new(),
|
||||
locale: &mut NullLocaleBackend::new(),
|
||||
log: &mut NullLogBackend::new(),
|
||||
system_prototypes: avm1.prototypes().clone(),
|
||||
mouse_hovered_object: None,
|
||||
mouse_position: &(Twips::new(0), Twips::new(0)),
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
pub mod audio;
|
||||
pub mod input;
|
||||
pub mod locale;
|
||||
pub mod log;
|
||||
pub mod navigator;
|
||||
pub mod render;
|
||||
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::backend::input::InputBackend;
|
||||
use crate::backend::locale::LocaleBackend;
|
||||
use crate::backend::log::LogBackend;
|
||||
use crate::backend::storage::StorageBackend;
|
||||
use crate::backend::{audio::AudioBackend, navigator::NavigatorBackend, render::RenderBackend};
|
||||
use crate::display_object::EditText;
|
||||
|
@ -72,6 +73,9 @@ pub struct UpdateContext<'a, 'gc, 'gc_context> {
|
|||
/// The locale backend, used for localisation and personalisation
|
||||
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()`.
|
||||
pub rng: &'a mut SmallRng,
|
||||
|
||||
|
@ -185,6 +189,7 @@ impl<'a, 'gc, 'gc_context> UpdateContext<'a, 'gc, 'gc_context> {
|
|||
navigator: self.navigator,
|
||||
renderer: self.renderer,
|
||||
locale: self.locale,
|
||||
log: self.log,
|
||||
input: self.input,
|
||||
storage: self.storage,
|
||||
rng: self.rng,
|
||||
|
|
|
@ -8,7 +8,9 @@ use crate::backend::input::{InputBackend, MouseCursor};
|
|||
use crate::backend::locale::LocaleBackend;
|
||||
use crate::backend::navigator::{NavigatorBackend, RequestOptions};
|
||||
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::display_object::{EditText, MorphShape, MovieClip};
|
||||
use crate::events::{ButtonKeyCode, ClipEvent, ClipEventResult, KeyCode, PlayerEvent};
|
||||
|
@ -123,6 +125,7 @@ type Renderer = Box<dyn RenderBackend>;
|
|||
type Input = Box<dyn InputBackend>;
|
||||
type Storage = Box<dyn StorageBackend>;
|
||||
type Locale = Box<dyn LocaleBackend>;
|
||||
type Log = Box<dyn LogBackend>;
|
||||
|
||||
pub struct Player {
|
||||
/// The version of the player we're emulating.
|
||||
|
@ -147,6 +150,7 @@ pub struct Player {
|
|||
pub navigator: Navigator,
|
||||
input: Input,
|
||||
locale: Locale,
|
||||
log: Log,
|
||||
transform_stack: TransformStack,
|
||||
view_matrix: Matrix,
|
||||
inverse_view_matrix: Matrix,
|
||||
|
@ -197,6 +201,7 @@ impl Player {
|
|||
input: Input,
|
||||
storage: Storage,
|
||||
locale: Locale,
|
||||
log: Log,
|
||||
) -> Result<Arc<Mutex<Self>>, Error> {
|
||||
let fake_movie = Arc::new(SwfMovie::empty(NEWEST_PLAYER_VERSION));
|
||||
let movie_width = 550;
|
||||
|
@ -261,6 +266,7 @@ impl Player {
|
|||
navigator,
|
||||
input,
|
||||
locale,
|
||||
log,
|
||||
self_reference: None,
|
||||
system: SystemProperties::default(),
|
||||
instance_counter: 0,
|
||||
|
@ -1022,6 +1028,7 @@ impl Player {
|
|||
instance_counter,
|
||||
storage,
|
||||
locale,
|
||||
logging,
|
||||
needs_render,
|
||||
) = (
|
||||
self.player_version,
|
||||
|
@ -1040,6 +1047,7 @@ impl Player {
|
|||
&mut self.instance_counter,
|
||||
self.storage.deref_mut(),
|
||||
self.locale.deref_mut(),
|
||||
self.log.deref_mut(),
|
||||
&mut self.needs_render,
|
||||
);
|
||||
|
||||
|
@ -1084,6 +1092,7 @@ impl Player {
|
|||
instance_counter,
|
||||
storage,
|
||||
locale,
|
||||
log: logging,
|
||||
shared_objects,
|
||||
unbound_text_fields,
|
||||
timers,
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
use approx::assert_abs_diff_eq;
|
||||
use log::{Metadata, Record};
|
||||
use ruffle_core::backend::locale::NullLocaleBackend;
|
||||
use ruffle_core::backend::log::NullLogBackend;
|
||||
use ruffle_core::backend::navigator::{NullExecutor, NullNavigatorBackend};
|
||||
use ruffle_core::backend::storage::MemoryStorageBackend;
|
||||
use ruffle_core::backend::{
|
||||
|
@ -521,6 +522,7 @@ fn run_swf(
|
|||
Box::new(NullInputBackend::new()),
|
||||
Box::new(MemoryStorageBackend::default()),
|
||||
Box::new(NullLocaleBackend::new()),
|
||||
Box::new(NullLogBackend::new()),
|
||||
)?;
|
||||
player.lock().unwrap().set_root_movie(Arc::new(movie));
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ use std::sync::Arc;
|
|||
use std::time::Instant;
|
||||
|
||||
use crate::storage::DiskStorageBackend;
|
||||
use ruffle_core::backend::log::NullLogBackend;
|
||||
use ruffle_core::tag_utils::SwfMovie;
|
||||
use std::rc::Rc;
|
||||
use winit::dpi::{LogicalSize, PhysicalPosition};
|
||||
|
@ -168,7 +169,15 @@ fn run_player(
|
|||
input_path.file_name().unwrap_or_default().as_ref(),
|
||||
));
|
||||
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_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::input::NullInputBackend;
|
||||
use ruffle_core::backend::locale::NullLocaleBackend;
|
||||
use ruffle_core::backend::log::NullLogBackend;
|
||||
use ruffle_core::backend::navigator::NullNavigatorBackend;
|
||||
use ruffle_core::backend::storage::MemoryStorageBackend;
|
||||
use ruffle_core::tag_utils::SwfMovie;
|
||||
|
@ -89,6 +90,7 @@ fn take_screenshot(
|
|||
Box::new(NullInputBackend::new()),
|
||||
Box::new(MemoryStorageBackend::default()),
|
||||
Box::new(NullLocaleBackend::new()),
|
||||
Box::new(NullLogBackend::new()),
|
||||
)?;
|
||||
|
||||
player
|
||||
|
|
|
@ -14,6 +14,7 @@ use crate::{
|
|||
};
|
||||
use generational_arena::{Arena, Index};
|
||||
use js_sys::{Array, Function, Object, Uint8Array};
|
||||
use ruffle_core::backend::log::NullLogBackend;
|
||||
use ruffle_core::backend::render::RenderBackend;
|
||||
use ruffle_core::backend::storage::MemoryStorageBackend;
|
||||
use ruffle_core::backend::storage::StorageBackend;
|
||||
|
@ -231,8 +232,17 @@ impl Ruffle {
|
|||
})
|
||||
.unwrap_or_else(|| Box::new(MemoryStorageBackend::default()));
|
||||
|
||||
let core =
|
||||
ruffle_core::Player::new(renderer, audio, navigator, input, local_storage, locale)?;
|
||||
let log = Box::new(NullLogBackend::new());
|
||||
|
||||
let core = ruffle_core::Player::new(
|
||||
renderer,
|
||||
audio,
|
||||
navigator,
|
||||
input,
|
||||
local_storage,
|
||||
locale,
|
||||
log,
|
||||
)?;
|
||||
|
||||
// Create instance.
|
||||
let instance = RuffleInstance {
|
||||
|
|
Loading…
Reference in New Issue