Fixes to make tests compile again

This commit is contained in:
David Wendt 2019-10-03 22:42:32 -04:00 committed by Mike Welsh
parent 5873eefb06
commit 588b2bb061
4 changed files with 40 additions and 1 deletions

View File

@ -883,6 +883,11 @@ impl<'gc> Avm1<'gc> {
Value::Object(self.globals) Value::Object(self.globals)
} }
/// Obtain a reference to `_global`.
pub fn global_object_cell(&self) -> GcCell<'gc, Object<'gc>> {
self.globals
}
fn action_get_variable( fn action_get_variable(
&mut self, &mut self,
context: &mut ActionContext<'_, 'gc, '_>, context: &mut ActionContext<'_, 'gc, '_>,

View File

@ -88,6 +88,32 @@ impl<'gc> Activation<'gc> {
} }
} }
/// Construct an empty stack frame with no code.
///
/// This is primarily intended for testing purposes: the activation given
/// will prevent the AVM from panicking without a current activation.
/// We construct a single scope chain from a global object, and that's about
/// it.
pub fn from_nothing(swf_version: u8, globals: GcCell<'gc, Object<'gc>>, mc: MutationContext<'gc, '_>) -> Activation<'gc> {
let global_scope = GcCell::allocate(mc, Scope::from_global_object(globals));
let child_scope = GcCell::allocate(mc, Scope::new_local_scope(global_scope, mc));
Activation {
swf_version: swf_version,
data: SwfSlice {
data: Arc::new(Vec::new()),
start: 0,
end: 0
},
pc: 0,
scope: child_scope,
this: globals,
arguments: None,
is_function: false,
local_registers: None
}
}
/// Create a new activation to run a block of code with a given scope. /// Create a new activation to run a block of code with a given scope.
pub fn to_rescope(&self, code: SwfSlice, scope: GcCell<'gc, Scope<'gc>>) -> Self { pub fn to_rescope(&self, code: SwfSlice, scope: GcCell<'gc, Scope<'gc>>) -> Self {
Activation { Activation {

View File

@ -83,6 +83,7 @@ pub fn create<'gc>(gc_context: MutationContext<'gc, '_>) -> GcCell<'gc, Object<'
mod tests { mod tests {
use super::*; use super::*;
use crate::avm1::Error; use crate::avm1::Error;
use crate::avm1::activation::Activation;
use crate::backend::audio::NullAudioBackend; use crate::backend::audio::NullAudioBackend;
use crate::backend::navigator::NullNavigatorBackend; use crate::backend::navigator::NullNavigatorBackend;
use crate::display_object::DisplayObject; use crate::display_object::DisplayObject;
@ -129,6 +130,9 @@ mod tests {
navigator: &mut NullNavigatorBackend::new(), navigator: &mut NullNavigatorBackend::new(),
}; };
let globals = avm.global_object_cell();
avm.insert_stack_frame(Activation::from_nothing(swf_version, globals, gc_context));
test(&mut avm, &mut context) test(&mut avm, &mut context)
}) })
} }

View File

@ -329,6 +329,7 @@ mod tests {
use crate::backend::navigator::NullNavigatorBackend; use crate::backend::navigator::NullNavigatorBackend;
use crate::display_object::DisplayObject; use crate::display_object::DisplayObject;
use crate::movie_clip::MovieClip; use crate::movie_clip::MovieClip;
use crate::avm1::activation::Activation;
use gc_arena::rootless_arena; use gc_arena::rootless_arena;
use rand::{rngs::SmallRng, SeedableRng}; use rand::{rngs::SmallRng, SeedableRng};
@ -341,7 +342,7 @@ mod tests {
) -> R, ) -> R,
{ {
rootless_arena(|gc_context| { rootless_arena(|gc_context| {
let mut avm = Avm1::new(gc_context, swf_version); let mut avm = Avm1::new(gc_context);
let movie_clip: Box<dyn DisplayObject> = Box::new(MovieClip::new(gc_context)); let movie_clip: Box<dyn DisplayObject> = Box::new(MovieClip::new(gc_context));
let root = GcCell::allocate(gc_context, movie_clip); let root = GcCell::allocate(gc_context, movie_clip);
let mut context = ActionContext { let mut context = ActionContext {
@ -358,6 +359,9 @@ mod tests {
}; };
let object = GcCell::allocate(gc_context, Object::object(gc_context)); let object = GcCell::allocate(gc_context, Object::object(gc_context));
let globals = avm.global_object_cell();
avm.insert_stack_frame(Activation::from_nothing(swf_version, globals, gc_context));
test(&mut avm, &mut context, object) test(&mut avm, &mut context, object)
}) })
} }