diff --git a/core/src/avm2.rs b/core/src/avm2.rs index b671880a8..8daa4381f 100644 --- a/core/src/avm2.rs +++ b/core/src/avm2.rs @@ -56,7 +56,7 @@ pub use crate::avm2::domain::Domain; pub use crate::avm2::error::Error; pub use crate::avm2::globals::flash::ui::context_menu::make_context_menu_state; pub use crate::avm2::multiname::Multiname; -pub use crate::avm2::namespace::Namespace; +pub use crate::avm2::namespace::{Namespace, NamespaceData}; pub use crate::avm2::object::{ ArrayObject, ClassObject, EventObject, Object, ScriptObject, SoundChannelObject, StageObject, TObject, @@ -87,6 +87,13 @@ pub struct Avm2<'gc> { /// System classes. system_classes: Option>, + pub public_namespace: Namespace<'gc>, + pub as3_namespace: Namespace<'gc>, + pub vector_public_namespace: Namespace<'gc>, + pub vector_internal_namespace: Namespace<'gc>, + pub proxy_namespace: Namespace<'gc>, + pub ruffle_private_namespace: Namespace<'gc>, + #[collect(require_static)] native_method_table: &'static [Option<(&'static str, NativeMethodImpl)>], @@ -121,6 +128,17 @@ impl<'gc> Avm2<'gc> { call_stack: GcCell::allocate(mc, CallStack::new()), globals, system_classes: None, + + public_namespace: Namespace::package("", mc), + as3_namespace: Namespace::package("http://adobe.com/AS3/2006/builtin", mc), + vector_public_namespace: Namespace::package("__AS3__.vec", mc), + vector_internal_namespace: Namespace::internal("__AS3__.vec", mc), + proxy_namespace: Namespace::package( + "http://www.adobe.com/2006/actionscript/flash/proxy", + mc, + ), + ruffle_private_namespace: Namespace::private("", mc), + native_method_table: Default::default(), native_instance_allocator_table: Default::default(), native_instance_init_table: Default::default(), diff --git a/core/src/avm2/activation.rs b/core/src/avm2/activation.rs index 6f2e4fc94..c37b67350 100644 --- a/core/src/avm2/activation.rs +++ b/core/src/avm2/activation.rs @@ -492,18 +492,14 @@ impl<'a, 'gc> Activation<'a, 'gc> { unreachable!(); }; - let mut args_object = ArrayObject::from_storage(&mut activation, args_array)?; + let args_object = ArrayObject::from_storage(&mut activation, args_array)?; if method .method() .flags .contains(AbcMethodFlags::NEED_ARGUMENTS) { - args_object.set_property( - &Multiname::public("callee"), - callee.into(), - &mut activation, - )?; + args_object.set_string_property_local("callee", callee.into(), &mut activation)?; } *activation @@ -647,11 +643,6 @@ impl<'a, 'gc> Activation<'a, 'gc> { self.context.avm2 } - /// Set the return value. - pub fn set_return_value(&mut self, value: Value<'gc>) { - self.return_value = Some(value); - } - /// Get the class that defined the currently-executing method, if it /// exists. /// @@ -781,7 +772,9 @@ impl<'a, 'gc> Activation<'a, 'gc> { method: Gc<'gc, BytecodeMethod<'gc>>, index: Index, ) -> Result, Error<'gc>> { - Namespace::from_abc_namespace(method.translation_unit(), index, self.context.gc_context) + method + .translation_unit() + .pool_namespace(index, self.context.gc_context) } /// Retrieve a multiname from the current constant pool. @@ -1667,7 +1660,7 @@ impl<'a, 'gc> Activation<'a, 'gc> { } let name = name_value.coerce_to_string(self)?; - let multiname = Multiname::public(name); + let multiname = Multiname::new(self.avm2().public_namespace, name); let has_prop = obj.has_property_via_in(self, &multiname)?; self.push_stack(has_prop); @@ -1897,11 +1890,7 @@ impl<'a, 'gc> Activation<'a, 'gc> { let value = self.pop_stack(); let name = self.pop_stack(); - object.set_property( - &Multiname::public(name.coerce_to_string(self)?), - value, - self, - )?; + object.set_public_property(name.coerce_to_string(self)?, value, self)?; } self.push_stack(object); diff --git a/core/src/avm2/amf.rs b/core/src/avm2/amf.rs index e55a929e5..b3c11dbf3 100644 --- a/core/src/avm2/amf.rs +++ b/core/src/avm2/amf.rs @@ -2,7 +2,6 @@ use crate::avm2::bytearray::ByteArrayStorage; use crate::avm2::object::{ByteArrayObject, TObject}; use crate::avm2::ArrayObject; use crate::avm2::ArrayStorage; -use crate::avm2::Multiname; use crate::avm2::{Activation, Error, Object, Value}; use crate::string::AvmString; use enumset::EnumSet; @@ -101,7 +100,7 @@ pub fn recursive_serialize<'gc>( let name = obj .get_enumerant_name(index, activation)? .coerce_to_string(activation)?; - let value = obj.get_property(&Multiname::public(name), activation)?; + let value = obj.get_public_property(name, activation)?; if let Some(value) = serialize_value(activation, value, amf_version) { elements.push(Element::new(name.to_utf8_lossy(), value)); @@ -138,11 +137,8 @@ pub fn deserialize_value<'gc>( let mut array = ArrayObject::from_storage(activation, storage)?; // Now let's add each element as a property for element in elements { - array.set_property( - &Multiname::public(AvmString::new_utf8( - activation.context.gc_context, - element.name(), - )), + array.set_public_property( + AvmString::new_utf8(activation.context.gc_context, element.name()), deserialize_value(activation, element.value())?, activation, )?; @@ -172,11 +168,8 @@ pub fn deserialize_value<'gc>( .construct(activation, &[])?; for entry in elements { let value = deserialize_value(activation, entry.value())?; - obj.set_property( - &Multiname::public(AvmString::new_utf8( - activation.context.gc_context, - entry.name(), - )), + obj.set_public_property( + AvmString::new_utf8(activation.context.gc_context, entry.name()), value, activation, )?; @@ -227,11 +220,8 @@ pub fn deserialize_lso<'gc>( .construct(activation, &[])?; for child in &lso.body { - obj.set_property( - &Multiname::public(AvmString::new_utf8( - activation.context.gc_context, - &child.name, - )), + obj.set_public_property( + AvmString::new_utf8(activation.context.gc_context, &child.name), deserialize_value(activation, child.value())?, activation, )?; diff --git a/core/src/avm2/class.rs b/core/src/avm2/class.rs index 32c9847e9..aae9340fb 100644 --- a/core/src/avm2/class.rs +++ b/core/src/avm2/class.rs @@ -260,11 +260,7 @@ impl<'gc> Class<'gc> { }; let protected_namespace = if let Some(ns) = &abc_instance.protected_namespace { - Some(Namespace::from_abc_namespace( - unit, - *ns, - activation.context.gc_context, - )?) + Some(unit.pool_namespace(*ns, activation.context.gc_context)?) } else { None }; @@ -472,7 +468,7 @@ impl<'gc> Class<'gc> { Ok(GcCell::allocate( activation.context.gc_context, Self { - name: QName::dynamic_name(name), + name: QName::new(activation.avm2().public_namespace, name), params: Vec::new(), super_class: None, attributes: ClassAttributes::empty(), @@ -526,52 +522,55 @@ impl<'gc> Class<'gc> { } #[inline(never)] - pub fn define_public_constant_string_class_traits( + pub fn define_constant_number_class_traits( &mut self, - items: &[(&'static str, &'static str)], + namespace: Namespace<'gc>, + items: &[(&'static str, f64)], + activation: &mut Activation<'_, 'gc>, ) { for &(name, value) in items { self.define_class_trait(Trait::from_const( - QName::new(Namespace::public(), name), - Multiname::public("String"), + QName::new(namespace, name), + Multiname::new(activation.avm2().public_namespace, "Number"), Some(value.into()), )); } } #[inline(never)] - pub fn define_public_constant_number_class_traits(&mut self, items: &[(&'static str, f64)]) { + pub fn define_constant_uint_class_traits( + &mut self, + namespace: Namespace<'gc>, + items: &[(&'static str, u32)], + activation: &mut Activation<'_, 'gc>, + ) { for &(name, value) in items { self.define_class_trait(Trait::from_const( - QName::new(Namespace::public(), name), - Multiname::public("Number"), + QName::new(namespace, name), + Multiname::new(activation.avm2().public_namespace, "uint"), Some(value.into()), )); } } #[inline(never)] - pub fn define_public_constant_uint_class_traits(&mut self, items: &[(&'static str, u32)]) { + pub fn define_constant_int_class_traits( + &mut self, + namespace: Namespace<'gc>, + items: &[(&'static str, i32)], + activation: &mut Activation<'_, 'gc>, + ) { for &(name, value) in items { self.define_class_trait(Trait::from_const( - QName::new(Namespace::public(), name), - Multiname::public("uint"), + QName::new(namespace, name), + Multiname::new(activation.avm2().public_namespace, "int"), Some(value.into()), )); } } #[inline(never)] - pub fn define_public_constant_int_class_traits(&mut self, items: &[(&'static str, i32)]) { - for &(name, value) in items { - self.define_class_trait(Trait::from_const( - QName::new(Namespace::public(), name), - Multiname::public("int"), - Some(value.into()), - )); - } - } - #[inline(never)] - pub fn define_public_builtin_class_properties( + pub fn define_builtin_class_properties( &mut self, mc: MutationContext<'gc, '_>, + namespace: Namespace<'gc>, items: &[( &'static str, Option, @@ -581,88 +580,51 @@ impl<'gc> Class<'gc> { for &(name, getter, setter) in items { if let Some(getter) = getter { self.define_class_trait(Trait::from_getter( - QName::new(Namespace::public(), name), + QName::new(namespace, name), Method::from_builtin(getter, name, mc), )); } if let Some(setter) = setter { self.define_class_trait(Trait::from_setter( - QName::new(Namespace::public(), name), + QName::new(namespace, name), Method::from_builtin(setter, name, mc), )); } } } #[inline(never)] - pub fn define_public_builtin_instance_methods( + pub fn define_builtin_instance_methods( &mut self, mc: MutationContext<'gc, '_>, + namespace: Namespace<'gc>, items: &[(&'static str, NativeMethodImpl)], ) { for &(name, value) in items { self.define_instance_trait(Trait::from_method( - QName::new(Namespace::public(), name), + QName::new(namespace, name), Method::from_builtin(value, name, mc), )); } } #[inline(never)] - pub fn define_as3_builtin_class_methods( + pub fn define_builtin_class_methods( &mut self, mc: MutationContext<'gc, '_>, + namespace: Namespace<'gc>, items: &[(&'static str, NativeMethodImpl)], ) { for &(name, value) in items { self.define_class_trait(Trait::from_method( - QName::new(Namespace::as3_namespace(), name), + QName::new(namespace, name), Method::from_builtin(value, name, mc), )); } } #[inline(never)] - pub fn define_as3_builtin_instance_methods( - &mut self, - mc: MutationContext<'gc, '_>, - items: &[(&'static str, NativeMethodImpl)], - ) { - for &(name, value) in items { - self.define_instance_trait(Trait::from_method( - QName::new(Namespace::as3_namespace(), name), - Method::from_builtin(value, name, mc), - )); - } - } - #[inline(never)] - pub fn define_ns_builtin_instance_methods( - &mut self, - mc: MutationContext<'gc, '_>, - ns: &'static str, - items: &[(&'static str, NativeMethodImpl)], - ) { - for &(name, value) in items { - self.define_instance_trait(Trait::from_method( - QName::new(Namespace::Namespace(ns.into()), name), - Method::from_builtin(value, name, mc), - )); - } - } - #[inline(never)] - pub fn define_public_builtin_class_methods( - &mut self, - mc: MutationContext<'gc, '_>, - items: &[(&'static str, NativeMethodImpl)], - ) { - for &(name, value) in items { - self.define_class_trait(Trait::from_method( - QName::new(Namespace::public(), name), - Method::from_builtin(value, name, mc), - )); - } - } - #[inline(never)] - pub fn define_public_builtin_instance_properties( + pub fn define_builtin_instance_properties( &mut self, mc: MutationContext<'gc, '_>, + namespace: Namespace<'gc>, items: &[( &'static str, Option, @@ -672,74 +634,34 @@ impl<'gc> Class<'gc> { for &(name, getter, setter) in items { if let Some(getter) = getter { self.define_instance_trait(Trait::from_getter( - QName::new(Namespace::public(), name), + QName::new(namespace, name), Method::from_builtin(getter, name, mc), )); } if let Some(setter) = setter { self.define_instance_trait(Trait::from_setter( - QName::new(Namespace::public(), name), + QName::new(namespace, name), Method::from_builtin(setter, name, mc), )); } } } #[inline(never)] - pub fn define_public_slot_number_instance_traits( + pub fn define_slot_number_instance_traits( &mut self, + namespace: Namespace<'gc>, items: &[(&'static str, Option)], + activation: &mut Activation<'_, 'gc>, ) { for &(name, value) in items { self.define_instance_trait(Trait::from_slot( - QName::new(Namespace::public(), name), - Multiname::public("Number"), + QName::new(namespace, name), + Multiname::new(activation.avm2().public_namespace, "Number"), value.map(|v| v.into()), )); } } - #[inline(never)] - pub fn define_public_slot_instance_traits( - &mut self, - items: &[(&'static str, &'static str, &'static str)], - ) { - for &(name, type_ns, type_name) in items { - self.define_instance_trait(Trait::from_slot( - QName::new(Namespace::public(), name), - Multiname::new(Namespace::Namespace(type_ns.into()), type_name), - None, - )); - } - } - - #[inline(never)] - pub fn define_public_slot_instance_traits_type_multiname( - &mut self, - items: &[(&'static str, Multiname<'gc>)], - ) { - for (name, type_name) in items { - self.define_instance_trait(Trait::from_slot( - QName::new(Namespace::public(), *name), - type_name.clone(), - None, - )); - } - } - - #[inline(never)] - pub fn define_private_slot_instance_traits( - &mut self, - items: &[(&'static str, &'static str, &'static str, &'static str)], - ) { - for &(ns, name, type_ns, type_name) in items { - self.define_instance_trait(Trait::from_slot( - QName::new(Namespace::Private(ns.into()), name), - Multiname::new(Namespace::Namespace(type_ns.into()), type_name), - None, - )); - } - } - /// Define a trait on the class. /// /// Class traits will be accessible as properties on the class object. diff --git a/core/src/avm2/events.rs b/core/src/avm2/events.rs index 3b0270ded..1ac0906d5 100644 --- a/core/src/avm2/events.rs +++ b/core/src/avm2/events.rs @@ -5,7 +5,6 @@ use crate::avm2::object::{Object, TObject}; use crate::avm2::value::Value; use crate::avm2::Error; use crate::avm2::Multiname; -use crate::avm2::Namespace; use crate::display_object::TDisplayObject; use crate::string::AvmString; use fnv::FnvHashMap; @@ -342,8 +341,6 @@ impl<'gc> Hash for EventHandler<'gc> { } } -pub const NS_EVENT_DISPATCHER: &str = "https://ruffle.rs/AS3/impl/EventDispatcher/"; - /// Retrieve the parent of a given `EventDispatcher`. /// /// `EventDispatcher` does not provide a generic way for it's subclasses to @@ -381,7 +378,7 @@ pub fn dispatch_event_to_target<'gc>( ); let dispatch_list = dispatcher .get_property( - &Multiname::new(Namespace::private(NS_EVENT_DISPATCHER), "dispatch_list"), + &Multiname::new(activation.avm2().ruffle_private_namespace, "dispatch_list"), activation, )? .as_object(); @@ -438,7 +435,7 @@ pub fn dispatch_event<'gc>( ) -> Result> { let target = this .get_property( - &Multiname::new(Namespace::private(NS_EVENT_DISPATCHER), "target"), + &Multiname::new(activation.avm2().ruffle_private_namespace, "target"), activation, )? .as_object() diff --git a/core/src/avm2/globals.rs b/core/src/avm2/globals.rs index 2e36163a9..f523a3434 100644 --- a/core/src/avm2/globals.rs +++ b/core/src/avm2/globals.rs @@ -39,11 +39,6 @@ mod vector; mod xml; mod xml_list; -pub(crate) const NS_RUFFLE_INTERNAL: &str = "https://ruffle.rs/AS3/impl/"; -pub(crate) const NS_VECTOR: &str = "__AS3__.vec"; - -pub use flash::utils::NS_FLASH_PROXY; - /// This structure represents all system builtin classes. #[derive(Clone, Collect)] #[collect(no_drop)] @@ -217,7 +212,10 @@ fn function<'gc>( let (_, mut global, mut domain) = script.init(); let mc = activation.context.gc_context; let scope = activation.create_scopechain(); - let qname = QName::new(Namespace::package(package), name); + let qname = QName::new( + Namespace::package(package, activation.context.gc_context), + name, + ); let method = Method::from_builtin(nf, name, mc); let as3fn = FunctionObject::from_method(activation, method, scope, None, None).into(); domain.export_definition(qname, script, mc)?; @@ -250,9 +248,9 @@ fn dynamic_class<'gc>( /// This function returns the class object and class prototype as a class, which /// may be stored in `SystemClasses` fn class<'gc>( - activation: &mut Activation<'_, 'gc>, class_def: GcCell<'gc, Class<'gc>>, script: Script<'gc>, + activation: &mut Activation<'_, 'gc>, ) -> Result, Error<'gc>> { let (_, mut global, mut domain) = script.init(); @@ -299,7 +297,7 @@ fn class<'gc>( macro_rules! avm2_system_class { ($field:ident, $activation:ident, $class:expr, $script:expr) => { - let class_object = class($activation, $class, $script)?; + let class_object = class($class, $script, $activation)?; let sc = $activation.avm2().system_classes.as_mut().unwrap(); sc.$field = class_object; @@ -341,20 +339,20 @@ pub fn load_player_globals<'gc>( // // Hence, this ridiculously complicated dance of classdef, type allocation, // and partial initialization. - let object_classdef = object::create_class(mc); + let object_classdef = object::create_class(activation); let object_class = ClassObject::from_class_partial(activation, object_classdef, None)?; let object_proto = ScriptObject::custom_object(mc, Some(object_class), None); - let fn_classdef = function::create_class(mc); + let fn_classdef = function::create_class(activation); let fn_class = ClassObject::from_class_partial(activation, fn_classdef, Some(object_class))?; let fn_proto = ScriptObject::custom_object(mc, Some(fn_class), Some(object_proto)); - let class_classdef = class::create_class(mc); + let class_classdef = class::create_class(activation); let class_class = ClassObject::from_class_partial(activation, class_classdef, Some(object_class))?; let class_proto = ScriptObject::custom_object(mc, Some(object_class), Some(object_proto)); - let global_classdef = global_scope::create_class(mc); + let global_classdef = global_scope::create_class(activation); let global_class = ClassObject::from_class_partial(activation, global_classdef, Some(object_class))?; let global_proto = ScriptObject::custom_object(mc, Some(object_class), Some(object_proto)); @@ -405,14 +403,24 @@ pub fn load_player_globals<'gc>( // After this point, it is safe to initialize any other classes. // Make sure to initialize superclasses *before* their subclasses! - avm2_system_class!(string, activation, string::create_class(mc), script); - avm2_system_class!(boolean, activation, boolean::create_class(mc), script); - avm2_system_class!(number, activation, number::create_class(mc), script); - avm2_system_class!(int, activation, int::create_class(mc), script); - avm2_system_class!(uint, activation, uint::create_class(mc), script); - avm2_system_class!(namespace, activation, namespace::create_class(mc), script); - avm2_system_class!(qname, activation, qname::create_class(mc), script); - avm2_system_class!(array, activation, array::create_class(mc), script); + avm2_system_class!(string, activation, string::create_class(activation), script); + avm2_system_class!( + boolean, + activation, + boolean::create_class(activation), + script + ); + avm2_system_class!(number, activation, number::create_class(activation), script); + avm2_system_class!(int, activation, int::create_class(activation), script); + avm2_system_class!(uint, activation, uint::create_class(activation), script); + avm2_system_class!( + namespace, + activation, + namespace::create_class(activation), + script + ); + avm2_system_class!(qname, activation, qname::create_class(activation), script); + avm2_system_class!(array, activation, array::create_class(activation), script); function(activation, "", "trace", toplevel::trace, script)?; function( @@ -456,105 +464,105 @@ pub fn load_player_globals<'gc>( function(activation, "", "parseFloat", toplevel::parse_float, script)?; function(activation, "", "escape", toplevel::escape, script)?; - avm2_system_class!(regexp, activation, regexp::create_class(mc), script); - avm2_system_class!(vector, activation, vector::create_class(mc), script); + avm2_system_class!(regexp, activation, regexp::create_class(activation), script); + avm2_system_class!(vector, activation, vector::create_class(activation), script); - avm2_system_class!(date, activation, date::create_class(mc), script); + avm2_system_class!(date, activation, date::create_class(activation), script); // package `flash.system` avm2_system_class!( application_domain, activation, - flash::system::application_domain::create_class(mc), + flash::system::application_domain::create_class(activation), script ); class( - activation, - flash::events::ieventdispatcher::create_interface(mc), + flash::events::ieventdispatcher::create_interface(activation), script, + activation, )?; avm2_system_class!( eventdispatcher, activation, - flash::events::eventdispatcher::create_class(mc), + flash::events::eventdispatcher::create_class(activation), script ); // package `flash.display` class( - activation, - flash::display::ibitmapdrawable::create_interface(mc), + flash::display::ibitmapdrawable::create_interface(activation), script, + activation, )?; avm2_system_class!( display_object, activation, - flash::display::displayobject::create_class(mc), + flash::display::displayobject::create_class(activation), script ); avm2_system_class!( shape, activation, - flash::display::shape::create_class(mc), + flash::display::shape::create_class(activation), script ); class( - activation, - flash::display::interactiveobject::create_class(mc), + flash::display::interactiveobject::create_class(activation), script, + activation, )?; avm2_system_class!( simplebutton, activation, - flash::display::simplebutton::create_class(mc), + flash::display::simplebutton::create_class(activation), script ); class( - activation, - flash::display::displayobjectcontainer::create_class(mc), + flash::display::displayobjectcontainer::create_class(activation), script, + activation, )?; avm2_system_class!( sprite, activation, - flash::display::sprite::create_class(mc), + flash::display::sprite::create_class(activation), script ); avm2_system_class!( movieclip, activation, - flash::display::movieclip::create_class(mc), + flash::display::movieclip::create_class(activation), script ); avm2_system_class!( graphics, activation, - flash::display::graphics::create_class(mc), + flash::display::graphics::create_class(activation), script ); avm2_system_class!( loaderinfo, activation, - flash::display::loaderinfo::create_class(mc), + flash::display::loaderinfo::create_class(activation), script ); avm2_system_class!( stage, activation, - flash::display::stage::create_class(mc), + flash::display::stage::create_class(activation), script ); avm2_system_class!( bitmap, activation, - flash::display::bitmap::create_class(mc), + flash::display::bitmap::create_class(activation), script ); avm2_system_class!( bitmapdata, activation, - flash::display::bitmapdata::create_class(mc), + flash::display::bitmapdata::create_class(activation), script ); @@ -564,25 +572,29 @@ pub fn load_player_globals<'gc>( avm2_system_class!( video, activation, - flash::media::video::create_class(mc), - script - ); - class(activation, flash::media::sound::create_class(mc), script)?; - avm2_system_class!( - soundtransform, - activation, - flash::media::soundtransform::create_class(mc), + flash::media::video::create_class(activation), script ); class( - activation, - flash::media::soundmixer::create_class(mc), + flash::media::sound::create_class(activation), script, + activation, + )?; + avm2_system_class!( + soundtransform, + activation, + flash::media::soundtransform::create_class(activation), + script + ); + class( + flash::media::soundmixer::create_class(activation), + script, + activation, )?; avm2_system_class!( soundchannel, activation, - flash::media::soundchannel::create_class(mc), + flash::media::soundchannel::create_class(activation), script ); @@ -590,16 +602,20 @@ pub fn load_player_globals<'gc>( avm2_system_class!( textfield, activation, - flash::text::textfield::create_class(mc), + flash::text::textfield::create_class(activation), script ); avm2_system_class!( textformat, activation, - flash::text::textformat::create_class(mc), + flash::text::textformat::create_class(activation), script ); - class(activation, flash::text::font::create_class(mc), script)?; + class( + flash::text::font::create_class(activation), + script, + activation, + )?; // Inside this call, the macro `avm2_system_classes_playerglobal` // triggers classloading. Therefore, we run `load_playerglobal` @@ -652,7 +668,7 @@ fn load_playerglobal<'gc>( macro_rules! avm2_system_classes_playerglobal { ($activation:expr, $script:expr, [$(($package:expr, $class_name:expr, $field:ident)),* $(,)?]) => { $( - let name = Multiname::new(Namespace::package($package), $class_name); + let name = Multiname::new(Namespace::package($package, activation.context.gc_context), $class_name); let class_object = activation.resolve_class(&name)?; let sc = $activation.avm2().system_classes.as_mut().unwrap(); sc.$field = class_object; diff --git a/core/src/avm2/globals/array.rs b/core/src/avm2/globals/array.rs index a02f8feb3..8ae037f1b 100644 --- a/core/src/avm2/globals/array.rs +++ b/core/src/avm2/globals/array.rs @@ -8,11 +8,10 @@ use crate::avm2::object::{array_allocator, ArrayObject, Object, TObject}; use crate::avm2::value::Value; use crate::avm2::Error; use crate::avm2::Multiname; -use crate::avm2::Namespace; use crate::avm2::QName; use crate::string::AvmString; use bitflags::bitflags; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; use std::cmp::{min, Ordering}; use std::mem::swap; @@ -135,11 +134,8 @@ pub fn resolve_array_hole<'gc>( } if let Some(proto) = this.proto() { - proto.get_property( - &Multiname::public(AvmString::new_utf8( - activation.context.gc_context, - i.to_string(), - )), + proto.get_public_property( + AvmString::new_utf8(activation.context.gc_context, i.to_string()), activation, ) } else { @@ -213,7 +209,7 @@ pub fn to_locale_string<'gc>( ) -> Result, Error<'gc>> { join_inner(act, this, &[",".into()], |v, activation| { if let Ok(o) = v.coerce_to_object(activation) { - o.call_property(&Multiname::public("toLocaleString"), &[], activation) + o.call_public_property("toLocaleString", &[], activation) } else { Ok(v) } @@ -270,7 +266,7 @@ impl<'gc> ArrayIter<'gc> { end_index: u32, ) -> Result> { let length = array_object - .get_property(&Multiname::public("length"), activation)? + .get_public_property("length", activation)? .coerce_to_u32(activation)?; Ok(Self { @@ -295,11 +291,8 @@ impl<'gc> ArrayIter<'gc> { Some( self.array_object - .get_property( - &Multiname::public(AvmString::new_utf8( - activation.context.gc_context, - i.to_string(), - )), + .get_public_property( + AvmString::new_utf8(activation.context.gc_context, i.to_string()), activation, ) .map(|val| (i, val)), @@ -324,11 +317,8 @@ impl<'gc> ArrayIter<'gc> { Some( self.array_object - .get_property( - &Multiname::public(AvmString::new_utf8( - activation.context.gc_context, - i.to_string(), - )), + .get_public_property( + AvmString::new_utf8(activation.context.gc_context, i.to_string()), activation, ) .map(|val| (i, val)), @@ -1145,12 +1135,10 @@ pub fn sort_on<'gc>( // it's treated as if the field's value was undefined. // TODO: verify this and fix it let a_object = a.coerce_to_object(activation)?; - let a_field = - a_object.get_property(&Multiname::public(*field_name), activation)?; + let a_field = a_object.get_public_property(*field_name, activation)?; let b_object = b.coerce_to_object(activation)?; - let b_field = - b_object.get_property(&Multiname::public(*field_name), activation)?; + let b_field = b_object.get_public_property(*field_name, activation)?; let ord = if options.contains(SortOptions::NUMERIC) { compare_numeric(activation, a_field, b_field)? @@ -1183,10 +1171,11 @@ pub fn sort_on<'gc>( } /// Construct `Array`'s class. -pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( - QName::new(Namespace::public(), "Array"), - Some(Multiname::public("Object")), + QName::new(activation.avm2().public_namespace, "Array"), + Some(Multiname::new(activation.avm2().public_namespace, "Object")), Method::from_builtin(instance_init, "", mc), Method::from_builtin(class_init, "", mc), mc, @@ -1202,14 +1191,22 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> ("toLocaleString", to_locale_string), ("valueOf", value_of), ]; - write.define_public_builtin_instance_methods(mc, PUBLIC_INSTANCE_METHODS); + write.define_builtin_instance_methods( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_METHODS, + ); const PUBLIC_INSTANCE_PROPERTIES: &[( &str, Option, Option, )] = &[("length", Some(length), Some(set_length))]; - write.define_public_builtin_instance_properties(mc, PUBLIC_INSTANCE_PROPERTIES); + write.define_builtin_instance_properties( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_PROPERTIES, + ); const AS3_INSTANCE_METHODS: &[(&str, NativeMethodImpl)] = &[ ("concat", concat), @@ -1231,7 +1228,11 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> ("sort", sort), ("sortOn", sort_on), ]; - write.define_as3_builtin_instance_methods(mc, AS3_INSTANCE_METHODS); + write.define_builtin_instance_methods( + mc, + activation.avm2().as3_namespace, + AS3_INSTANCE_METHODS, + ); const CONSTANTS: &[(&str, u32)] = &[ ( @@ -1246,7 +1247,11 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> ), ("UNIQUESORT", SortOptions::UNIQUE_SORT.bits() as u32), ]; - write.define_public_constant_uint_class_traits(CONSTANTS); + write.define_constant_uint_class_traits( + activation.avm2().public_namespace, + CONSTANTS, + activation, + ); class } diff --git a/core/src/avm2/globals/boolean.rs b/core/src/avm2/globals/boolean.rs index 9bfdce44d..3bca1cf4e 100644 --- a/core/src/avm2/globals/boolean.rs +++ b/core/src/avm2/globals/boolean.rs @@ -7,9 +7,8 @@ use crate::avm2::object::{primitive_allocator, FunctionObject, Object, TObject}; use crate::avm2::value::Value; use crate::avm2::Error; use crate::avm2::Multiname; -use crate::avm2::Namespace; use crate::avm2::QName; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; /// Implements `Boolean`'s instance initializer. fn instance_init<'gc>( @@ -58,8 +57,8 @@ fn class_init<'gc>( let this_class = this.as_class_object().unwrap(); let boolean_proto = this_class.prototype(); - boolean_proto.set_property_local( - &Multiname::public("toString"), + boolean_proto.set_string_property_local( + "toString", FunctionObject::from_method( activation, Method::from_builtin(to_string, "toString", gc_context), @@ -70,8 +69,8 @@ fn class_init<'gc>( .into(), activation, )?; - boolean_proto.set_property_local( - &Multiname::public("valueOf"), + boolean_proto.set_string_property_local( + "valueOf", FunctionObject::from_method( activation, Method::from_builtin(value_of, "valueOf", gc_context), @@ -124,10 +123,11 @@ fn value_of<'gc>( } /// Construct `Boolean`'s class. -pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( - QName::new(Namespace::public(), "Boolean"), - Some(Multiname::public("Object")), + QName::new(activation.avm2().public_namespace, "Boolean"), + Some(Multiname::new(activation.avm2().public_namespace, "Object")), Method::from_builtin(instance_init, "", mc), Method::from_builtin(class_init, "", mc), mc, @@ -144,7 +144,11 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> const AS3_INSTANCE_METHODS: &[(&str, NativeMethodImpl)] = &[("toString", to_string), ("valueOf", value_of)]; - write.define_as3_builtin_instance_methods(mc, AS3_INSTANCE_METHODS); + write.define_builtin_instance_methods( + mc, + activation.avm2().as3_namespace, + AS3_INSTANCE_METHODS, + ); class } diff --git a/core/src/avm2/globals/class.rs b/core/src/avm2/globals/class.rs index 8f51e8337..45c5d28e1 100644 --- a/core/src/avm2/globals/class.rs +++ b/core/src/avm2/globals/class.rs @@ -7,9 +7,8 @@ use crate::avm2::object::{Object, TObject}; use crate::avm2::value::Value; use crate::avm2::Error; use crate::avm2::Multiname; -use crate::avm2::Namespace; use crate::avm2::QName; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; /// Implements `Class`'s instance initializer. /// @@ -46,10 +45,11 @@ fn prototype<'gc>( } /// Construct `Class`'s class. -pub fn create_class<'gc>(gc_context: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let gc_context = activation.context.gc_context; let class_class = Class::new( - QName::new(Namespace::public(), "Class"), - Some(Multiname::public("Object")), + QName::new(activation.avm2().public_namespace, "Class"), + Some(Multiname::new(activation.avm2().public_namespace, "Object")), Method::from_builtin(instance_init, "", gc_context), Method::from_builtin(class_init, "", gc_context), gc_context, @@ -62,7 +62,11 @@ pub fn create_class<'gc>(gc_context: MutationContext<'gc, '_>) -> GcCell<'gc, Cl Option, Option, )] = &[("prototype", Some(prototype), None)]; - write.define_public_builtin_instance_properties(gc_context, PUBLIC_INSTANCE_PROPERTIES); + write.define_builtin_instance_properties( + gc_context, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_PROPERTIES, + ); class_class } diff --git a/core/src/avm2/globals/date.rs b/core/src/avm2/globals/date.rs index b0f9be68d..879be248f 100644 --- a/core/src/avm2/globals/date.rs +++ b/core/src/avm2/globals/date.rs @@ -7,12 +7,11 @@ use crate::avm2::object::{date_allocator, DateObject, FunctionObject, Object, TO use crate::avm2::value::Value; use crate::avm2::Error; use crate::avm2::Multiname; -use crate::avm2::Namespace; use crate::avm2::QName; use crate::locale::{get_current_date_time, get_timezone}; use crate::string::{utils as string_utils, AvmString, WStr}; use chrono::{DateTime, Datelike, Duration, FixedOffset, LocalResult, TimeZone, Timelike, Utc}; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; use num_traits::ToPrimitive; // All of these methods will be defined as both @@ -302,8 +301,8 @@ pub fn class_init<'gc>( let date_proto = this_class.prototype(); for (name, method) in PUBLIC_INSTANCE_AND_PROTO_METHODS { - date_proto.set_property_local( - &Multiname::public(*name), + date_proto.set_string_property_local( + *name, FunctionObject::from_method( activation, Method::from_builtin(*method, name, gc_context), @@ -1326,10 +1325,11 @@ pub fn parse<'gc>( } /// Construct `Date`'s class. -pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( - QName::new(Namespace::public(), "Date"), - Some(Multiname::public("Object")), + QName::new(activation.avm2().public_namespace, "Date"), + Some(Multiname::new(activation.avm2().public_namespace, "Object")), Method::from_builtin(instance_init, "", mc), Method::from_builtin(class_init, "", mc), mc, @@ -1366,13 +1366,24 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> ("dayUTC", Some(day_utc), None), ("timezoneOffset", Some(timezone_offset), None), ]; - write.define_public_builtin_instance_properties(mc, PUBLIC_INSTANCE_PROPERTIES); - - write.define_as3_builtin_instance_methods(mc, PUBLIC_INSTANCE_AND_PROTO_METHODS); + write.define_builtin_instance_properties( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_PROPERTIES, + ); + write.define_builtin_instance_methods( + mc, + activation.avm2().as3_namespace, + PUBLIC_INSTANCE_AND_PROTO_METHODS, + ); const PUBLIC_CLASS_METHODS: &[(&str, NativeMethodImpl)] = &[("UTC", utc), ("parse", parse)]; - write.define_as3_builtin_class_methods(mc, PUBLIC_CLASS_METHODS); + write.define_builtin_class_methods( + mc, + activation.avm2().public_namespace, + PUBLIC_CLASS_METHODS, + ); class } diff --git a/core/src/avm2/globals/flash/display/bitmap.rs b/core/src/avm2/globals/flash/display/bitmap.rs index 682e42223..4d314936b 100644 --- a/core/src/avm2/globals/flash/display/bitmap.rs +++ b/core/src/avm2/globals/flash/display/bitmap.rs @@ -15,7 +15,7 @@ use crate::bitmap::bitmap_data::BitmapData; use crate::character::Character; use crate::display_object::{Bitmap, TDisplayObject}; use crate::{avm2_stub_getter, avm2_stub_setter}; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; /// Implements `flash.display.Bitmap`'s instance constructor. pub fn instance_init<'gc>( @@ -94,11 +94,7 @@ pub fn instance_init<'gc>( ); }; - this.set_property( - &Multiname::public("bitmapData"), - bd_object.into(), - activation, - )?; + this.set_public_property("bitmapData", bd_object.into(), activation)?; bitmap.set_smoothing(activation.context.gc_context, smoothing); } else { @@ -229,11 +225,12 @@ pub fn set_smoothing<'gc>( } /// Construct `Bitmap`'s class. -pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( - QName::new(Namespace::package("flash.display"), "Bitmap"), + QName::new(Namespace::package("flash.display", mc), "Bitmap"), Some(Multiname::new( - Namespace::package("flash.display"), + Namespace::package("flash.display", mc), "DisplayObject", )), Method::from_builtin(instance_init, "", mc), @@ -258,7 +255,11 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> ), ("smoothing", Some(smoothing), Some(set_smoothing)), ]; - write.define_public_builtin_instance_properties(mc, PUBLIC_INSTANCE_PROPERTIES); + write.define_builtin_instance_properties( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_PROPERTIES, + ); class } diff --git a/core/src/avm2/globals/flash/display/bitmapdata.rs b/core/src/avm2/globals/flash/display/bitmapdata.rs index 2febeb454..172c05076 100644 --- a/core/src/avm2/globals/flash/display/bitmapdata.rs +++ b/core/src/avm2/globals/flash/display/bitmapdata.rs @@ -18,7 +18,7 @@ use crate::bitmap::is_size_valid; use crate::character::Character; use crate::display_object::Bitmap; use crate::swf::BlendMode; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; use ruffle_render::filters::{BlurFilter, ColorMatrixFilter, Filter}; use ruffle_render::transform::Transform; use std::str::FromStr; @@ -219,16 +219,16 @@ pub fn copy_pixels<'gc>( .coerce_to_object(activation)?; let src_min_x = source_rect - .get_property(&Multiname::public("x"), activation)? + .get_public_property("x", activation)? .coerce_to_i32(activation)?; let src_min_y = source_rect - .get_property(&Multiname::public("y"), activation)? + .get_public_property("y", activation)? .coerce_to_i32(activation)?; let src_width = source_rect - .get_property(&Multiname::public("width"), activation)? + .get_public_property("width", activation)? .coerce_to_i32(activation)?; let src_height = source_rect - .get_property(&Multiname::public("height"), activation)? + .get_public_property("height", activation)? .coerce_to_i32(activation)?; let dest_point = args @@ -237,10 +237,10 @@ pub fn copy_pixels<'gc>( .coerce_to_object(activation)?; let dest_x = dest_point - .get_property(&Multiname::public("x"), activation)? + .get_public_property("x", activation)? .coerce_to_i32(activation)?; let dest_y = dest_point - .get_property(&Multiname::public("y"), activation)? + .get_public_property("y", activation)? .coerce_to_i32(activation)?; if let Some(src_bitmap) = source_bitmap.as_bitmap_data() { @@ -277,10 +277,10 @@ pub fn copy_pixels<'gc>( .coerce_to_object(activation) { x = alpha_point - .get_property(&Multiname::public("x"), activation)? + .get_public_property("x", activation)? .coerce_to_i32(activation)?; y = alpha_point - .get_property(&Multiname::public("y"), activation)? + .get_public_property("y", activation)? .coerce_to_i32(activation)?; } @@ -333,16 +333,16 @@ pub fn get_pixels<'gc>( .unwrap_or(&Value::Undefined) .coerce_to_object(activation)?; let x = rectangle - .get_property(&Multiname::public("x"), activation)? + .get_public_property("x", activation)? .coerce_to_i32(activation)?; let y = rectangle - .get_property(&Multiname::public("y"), activation)? + .get_public_property("y", activation)? .coerce_to_i32(activation)?; let width = rectangle - .get_property(&Multiname::public("width"), activation)? + .get_public_property("width", activation)? .coerce_to_i32(activation)?; let height = rectangle - .get_property(&Multiname::public("height"), activation)? + .get_public_property("height", activation)? .coerce_to_i32(activation)?; let bytearray = ByteArrayObject::from_storage( activation, @@ -469,16 +469,16 @@ pub fn set_pixels<'gc>( .coerce_to_object(activation)?; if let Some(bitmap_data) = this.and_then(|t| t.as_bitmap_data()) { let x = rectangle - .get_property(&Multiname::public("x"), activation)? + .get_public_property("x", activation)? .coerce_to_u32(activation)?; let y = rectangle - .get_property(&Multiname::public("y"), activation)? + .get_public_property("y", activation)? .coerce_to_u32(activation)?; let width = rectangle - .get_property(&Multiname::public("width"), activation)? + .get_public_property("width", activation)? .coerce_to_u32(activation)?; let height = rectangle - .get_property(&Multiname::public("height"), activation)? + .get_public_property("height", activation)? .coerce_to_u32(activation)?; let ba_read = bytearray @@ -532,10 +532,10 @@ pub fn copy_channel<'gc>( .coerce_to_object(activation)?; let dest_x = dest_point - .get_property(&Multiname::public("x"), activation)? + .get_public_property("x", activation)? .coerce_to_u32(activation)?; let dest_y = dest_point - .get_property(&Multiname::public("y"), activation)? + .get_public_property("y", activation)? .coerce_to_u32(activation)?; let source_channel = args @@ -551,16 +551,16 @@ pub fn copy_channel<'gc>( if let Some(source_bitmap) = source_bitmap.as_bitmap_data() { //TODO: what if source is disposed let src_min_x = source_rect - .get_property(&Multiname::public("x"), activation)? + .get_public_property("x", activation)? .coerce_to_u32(activation)?; let src_min_y = source_rect - .get_property(&Multiname::public("y"), activation)? + .get_public_property("y", activation)? .coerce_to_u32(activation)?; let src_width = source_rect - .get_property(&Multiname::public("width"), activation)? + .get_public_property("width", activation)? .coerce_to_u32(activation)?; let src_height = source_rect - .get_property(&Multiname::public("height"), activation)? + .get_public_property("height", activation)? .coerce_to_u32(activation)?; let src_max_x = src_min_x + src_width; let src_max_y = src_min_y + src_height; @@ -660,16 +660,16 @@ pub fn color_transform<'gc>( // TODO: Re-use `object_to_rectangle` in `movie_clip.rs`. let rectangle = rectangle.coerce_to_object(activation)?; let x = rectangle - .get_property(&Multiname::public("x"), activation)? + .get_public_property("x", activation)? .coerce_to_i32(activation)?; let y = rectangle - .get_property(&Multiname::public("y"), activation)? + .get_public_property("y", activation)? .coerce_to_i32(activation)?; let width = rectangle - .get_property(&Multiname::public("width"), activation)? + .get_public_property("width", activation)? .coerce_to_i32(activation)?; let height = rectangle - .get_property(&Multiname::public("height"), activation)? + .get_public_property("height", activation)? .coerce_to_i32(activation)?; let x_min = x.max(0) as u32; @@ -828,16 +828,16 @@ pub fn fill_rect<'gc>( if let Some(bitmap_data) = this.and_then(|this| this.as_bitmap_data()) { let x = rectangle - .get_property(&Multiname::public("x"), activation)? + .get_public_property("x", activation)? .coerce_to_u32(activation)?; let y = rectangle - .get_property(&Multiname::public("y"), activation)? + .get_public_property("y", activation)? .coerce_to_u32(activation)?; let width = rectangle - .get_property(&Multiname::public("width"), activation)? + .get_public_property("width", activation)? .coerce_to_u32(activation)?; let height = rectangle - .get_property(&Multiname::public("height"), activation)? + .get_public_property("height", activation)? .coerce_to_u32(activation)?; bitmap_data.write(activation.context.gc_context).fill_rect( @@ -942,10 +942,10 @@ pub fn apply_filter<'gc>( })?; let dest_point = ( dest_point - .get_property(&Multiname::public("x"), activation)? + .get_public_property("x", activation)? .coerce_to_u32(activation)?, dest_point - .get_property(&Multiname::public("x"), activation)? + .get_public_property("x", activation)? .coerce_to_u32(activation)?, ); let filter = args[3] @@ -954,46 +954,27 @@ pub fn apply_filter<'gc>( Error::from(format!("TypeError: Error #1034: Type Coercion failed: cannot convert {} to flash.filters.BitmapFilter.", args[1].coerce_to_string(activation).unwrap_or_default())) })?; - let bevel_filter = activation.resolve_class(&Multiname::new( - Namespace::package("flash.filters"), - "BevelFilter", - ))?; - let bitmap_filter = activation.resolve_class(&Multiname::new( - Namespace::package("flash.filters"), - "BitmapFilter", - ))?; - let blur_filter = activation.resolve_class(&Multiname::new( - Namespace::package("flash.filters"), - "BlurFilter", - ))?; - let color_matrix_filter = activation.resolve_class(&Multiname::new( - Namespace::package("flash.filters"), - "ColorMatrixFilter", - ))?; - let convolution_filter = activation.resolve_class(&Multiname::new( - Namespace::package("flash.filters"), - "ConvolutionFilter", - ))?; - let displacement_map_filter = activation.resolve_class(&Multiname::new( - Namespace::package("flash.filters"), - "DisplacementMapFilter", - ))?; - let drop_shadow_filter = activation.resolve_class(&Multiname::new( - Namespace::package("flash.filters"), - "DropShadowFilter", - ))?; - let glow_filter = activation.resolve_class(&Multiname::new( - Namespace::package("flash.filters"), - "GlowFilter", - ))?; - let gradient_bevel_filter = activation.resolve_class(&Multiname::new( - Namespace::package("flash.filters"), - "GradientBevelFilter", - ))?; - let gradient_glow_filter = activation.resolve_class(&Multiname::new( - Namespace::package("flash.filters"), - "GradientGlowFilter", - ))?; + let filters_namespace = Namespace::package("flash.filters", activation.context.gc_context); + let bevel_filter = + activation.resolve_class(&Multiname::new(filters_namespace, "BevelFilter"))?; + let bitmap_filter = + activation.resolve_class(&Multiname::new(filters_namespace, "BitmapFilter"))?; + let blur_filter = + activation.resolve_class(&Multiname::new(filters_namespace, "BlurFilter"))?; + let color_matrix_filter = + activation.resolve_class(&Multiname::new(filters_namespace, "ColorMatrixFilter"))?; + let convolution_filter = + activation.resolve_class(&Multiname::new(filters_namespace, "ConvolutionFilter"))?; + let displacement_map_filter = activation + .resolve_class(&Multiname::new(filters_namespace, "DisplacementMapFilter"))?; + let drop_shadow_filter = + activation.resolve_class(&Multiname::new(filters_namespace, "DropShadowFilter"))?; + let glow_filter = + activation.resolve_class(&Multiname::new(filters_namespace, "GlowFilter"))?; + let gradient_bevel_filter = + activation.resolve_class(&Multiname::new(filters_namespace, "GradientBevelFilter"))?; + let gradient_glow_filter = + activation.resolve_class(&Multiname::new(filters_namespace, "GradientGlowFilter"))?; // let shader_filter = activation.resolve_class(&Multiname::new( // Namespace::package("flash.filters"), // "ShaderFilter", @@ -1001,7 +982,7 @@ pub fn apply_filter<'gc>( let filter = if filter.is_of_type(color_matrix_filter, activation) { let mut matrix = [0.0; 20]; if let Some(object) = filter - .get_property(&Multiname::public("matrix"), activation)? + .get_public_property("matrix", activation)? .as_object() { if let Some(array) = object.as_array_storage() { @@ -1017,13 +998,13 @@ pub fn apply_filter<'gc>( Filter::ColorMatrixFilter(ColorMatrixFilter { matrix }) } else if filter.is_of_type(blur_filter, activation) { let blur_x = filter - .get_property(&Multiname::public("blurX"), activation)? + .get_public_property("blurX", activation)? .coerce_to_number(activation)?; let blur_y = filter - .get_property(&Multiname::public("blurY"), activation)? + .get_public_property("blurY", activation)? .coerce_to_number(activation)?; let quality = filter - .get_property(&Multiname::public("quality"), activation)? + .get_public_property("quality", activation)? .coerce_to_u32(activation)?; Filter::BlurFilter(BlurFilter { blur_x: blur_x as f32, @@ -1207,10 +1188,10 @@ pub fn perlin_noise<'gc>( if let Some(offsets) = offsets.as_array_storage() { if let Some(Value::Object(e)) = offsets.get(i) { let x = e - .get_property(&Multiname::public("x"), activation)? + .get_public_property("x", activation)? .coerce_to_number(activation)?; let y = e - .get_property(&Multiname::public("y"), activation)? + .get_public_property("y", activation)? .coerce_to_number(activation)?; Ok((x, y)) } else { @@ -1245,10 +1226,11 @@ pub fn perlin_noise<'gc>( } /// Construct `BitmapData`'s class. -pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( - QName::new(Namespace::package("flash.display"), "BitmapData"), - Some(Multiname::new(Namespace::package(""), "Object")), + QName::new(Namespace::package("flash.display", mc), "BitmapData"), + Some(Multiname::new(activation.avm2().public_namespace, "Object")), Method::from_builtin(instance_init, "", mc), Method::from_builtin(class_init, "", mc), mc, @@ -1260,7 +1242,7 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> write.set_instance_allocator(bitmapdata_allocator); write.implements(Multiname::new( - Namespace::package("flash.display"), + Namespace::package("flash.display", mc), "IBitmapDrawable", )); @@ -1274,7 +1256,11 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> ("rect", Some(rect), None), ("transparent", Some(transparent), None), ]; - write.define_public_builtin_instance_properties(mc, PUBLIC_INSTANCE_PROPERTIES); + write.define_builtin_instance_properties( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_PROPERTIES, + ); const PUBLIC_INSTANCE_METHODS: &[(&str, NativeMethodImpl)] = &[ ("getPixels", get_pixels), @@ -1299,7 +1285,11 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> ("clone", clone), ("perlinNoise", perlin_noise), ]; - write.define_public_builtin_instance_methods(mc, PUBLIC_INSTANCE_METHODS); + write.define_builtin_instance_methods( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_METHODS, + ); class } diff --git a/core/src/avm2/globals/flash/display/displayobject.rs b/core/src/avm2/globals/flash/display/displayobject.rs index 31d93da3b..08174af16 100644 --- a/core/src/avm2/globals/flash/display/displayobject.rs +++ b/core/src/avm2/globals/flash/display/displayobject.rs @@ -18,7 +18,7 @@ use crate::string::AvmString; use crate::types::{Degrees, Percent}; use crate::vminterface::Instantiator; use crate::{avm2_stub_getter, avm2_stub_setter}; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; use std::str::FromStr; use swf::Twips; use swf::{BlendMode, Rectangle}; @@ -285,8 +285,9 @@ pub fn set_filters<'gc>( if let Some(filters_array) = new_filters.as_array_object() { if let Some(filters_storage) = filters_array.as_array_storage() { - let filter_class = - Multiname::new(Namespace::package("flash.filters"), "BitmapFilter"); + let filters_namespace = + Namespace::package("flash.filters", activation.context.gc_context); + let filter_class = Multiname::new(filters_namespace, "BitmapFilter"); let filter_class_object = activation.resolve_class(&filter_class)?; @@ -769,10 +770,10 @@ pub fn set_transform<'gc>( // FIXME - consider 3D matrix and pixel bounds let matrix = transform - .get_property(&Multiname::public("matrix"), activation)? + .get_public_property("matrix", activation)? .coerce_to_object(activation)?; let color_transform = transform - .get_property(&Multiname::public("colorTransform"), activation)? + .get_public_property("colorTransform", activation)? .coerce_to_object(activation)?; let matrix = @@ -867,7 +868,7 @@ pub fn object_to_rectangle<'gc>( let mut values = [0.0; 4]; for (&name, value) in NAMES.iter().zip(&mut values) { *value = object - .get_property(&Multiname::public(name), activation)? + .get_public_property(name, activation)? .coerce_to_number(activation)?; } let [x, y, width, height] = values; @@ -921,10 +922,10 @@ fn local_to_global<'gc>( .unwrap_or(&Value::Undefined) .coerce_to_object(activation)?; let x = point - .get_property(&Multiname::public("x"), activation)? + .get_public_property("x", activation)? .coerce_to_number(activation)?; let y = point - .get_property(&Multiname::public("y"), activation)? + .get_public_property("y", activation)? .coerce_to_number(activation)?; let (out_x, out_y) = dobj.local_to_global((Twips::from_pixels(x), Twips::from_pixels(y))); @@ -953,10 +954,10 @@ fn global_to_local<'gc>( .unwrap_or(&Value::Undefined) .coerce_to_object(activation)?; let x = point - .get_property(&Multiname::public("x"), activation)? + .get_public_property("x", activation)? .coerce_to_number(activation)?; let y = point - .get_property(&Multiname::public("y"), activation)? + .get_public_property("y", activation)? .coerce_to_number(activation)?; let (out_x, out_y) = dobj.global_to_local((Twips::from_pixels(x), Twips::from_pixels(y))); @@ -1106,11 +1107,12 @@ pub fn set_opaque_background<'gc>( } /// Construct `DisplayObject`'s class. -pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( - QName::new(Namespace::package("flash.display"), "DisplayObject"), + QName::new(Namespace::package("flash.display", mc), "DisplayObject"), Some(Multiname::new( - Namespace::package("flash.events"), + Namespace::package("flash.events", mc), "EventDispatcher", )), Method::from_builtin(instance_init, "", mc), @@ -1128,7 +1130,7 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> )); write.implements(Multiname::new( - Namespace::package("flash.display"), + Namespace::package("flash.display", mc), "IBitmapDrawable", )); @@ -1174,7 +1176,11 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> Some(set_cache_as_bitmap), ), ]; - write.define_public_builtin_instance_properties(mc, PUBLIC_INSTANCE_PROPERTIES); + write.define_builtin_instance_properties( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_PROPERTIES, + ); const PUBLIC_INSTANCE_METHODS: &[(&str, NativeMethodImpl)] = &[ ("hitTestPoint", hit_test_point), @@ -1184,7 +1190,11 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> ("getBounds", get_bounds), ("getRect", get_rect), ]; - write.define_public_builtin_instance_methods(mc, PUBLIC_INSTANCE_METHODS); + write.define_builtin_instance_methods( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_METHODS, + ); class } diff --git a/core/src/avm2/globals/flash/display/displayobjectcontainer.rs b/core/src/avm2/globals/flash/display/displayobjectcontainer.rs index 26a3611ee..e56649d0d 100644 --- a/core/src/avm2/globals/flash/display/displayobjectcontainer.rs +++ b/core/src/avm2/globals/flash/display/displayobjectcontainer.rs @@ -12,7 +12,7 @@ use crate::avm2::{ArrayObject, ArrayStorage, Error}; use crate::context::UpdateContext; use crate::display_object::{DisplayObject, TDisplayObject, TDisplayObjectContainer}; use crate::{avm2_stub_getter, avm2_stub_method, avm2_stub_setter}; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; use std::cmp::min; /// Implements `flash.display.DisplayObjectContainer`'s instance constructor. @@ -640,14 +640,15 @@ pub fn set_tab_children<'gc>( } /// Construct `DisplayObjectContainer`'s class. -pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( QName::new( - Namespace::package("flash.display"), + Namespace::package("flash.display", mc), "DisplayObjectContainer", ), Some(Multiname::new( - Namespace::package("flash.display"), + Namespace::package("flash.display", mc), "InteractiveObject", )), Method::from_builtin( @@ -680,7 +681,11 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> ), ("tabChildren", Some(tab_children), Some(set_tab_children)), ]; - write.define_public_builtin_instance_properties(mc, PUBLIC_INSTANCE_PROPERTIES); + write.define_builtin_instance_properties( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_PROPERTIES, + ); const PUBLIC_INSTANCE_METHODS: &[(&str, NativeMethodImpl)] = &[ ("getChildAt", get_child_at), @@ -702,7 +707,11 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> are_inaccessible_objects_under_point, ), ]; - write.define_public_builtin_instance_methods(mc, PUBLIC_INSTANCE_METHODS); + write.define_builtin_instance_methods( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_METHODS, + ); class } diff --git a/core/src/avm2/globals/flash/display/graphics.rs b/core/src/avm2/globals/flash/display/graphics.rs index ea016a805..90ed27a85 100644 --- a/core/src/avm2/globals/flash/display/graphics.rs +++ b/core/src/avm2/globals/flash/display/graphics.rs @@ -13,7 +13,7 @@ use crate::avm2_stub_method; use crate::display_object::TDisplayObject; use crate::drawing::Drawing; use crate::string::WStr; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; use ruffle_render::shape_utils::DrawCommand; use std::f64::consts::FRAC_1_SQRT_2; use swf::{Color, FillStyle, Fixed8, LineCapStyle, LineJoinStyle, LineStyle, Twips}; @@ -788,10 +788,11 @@ fn draw_ellipse<'gc>( } /// Construct `Graphics`'s class. -pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( - QName::new(Namespace::package("flash.display"), "Graphics"), - Some(Multiname::public("Object")), + QName::new(Namespace::package("flash.display", mc), "Graphics"), + Some(Multiname::new(activation.avm2().public_namespace, "Object")), Method::from_builtin(instance_init, "", mc), Method::from_builtin(class_init, "", mc), mc, @@ -822,7 +823,11 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> ("drawCircle", draw_circle), ("drawEllipse", draw_ellipse), ]; - write.define_public_builtin_instance_methods(mc, PUBLIC_INSTANCE_METHODS); + write.define_builtin_instance_methods( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_METHODS, + ); class } diff --git a/core/src/avm2/globals/flash/display/ibitmapdrawable.rs b/core/src/avm2/globals/flash/display/ibitmapdrawable.rs index b47470e55..b3b8fbd46 100644 --- a/core/src/avm2/globals/flash/display/ibitmapdrawable.rs +++ b/core/src/avm2/globals/flash/display/ibitmapdrawable.rs @@ -8,7 +8,7 @@ use crate::avm2::value::Value; use crate::avm2::Error; use crate::avm2::Namespace; use crate::avm2::QName; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; /// Emulates attempts to execute bodiless methods. pub fn bodiless_method<'gc>( @@ -29,9 +29,10 @@ pub fn class_init<'gc>( } /// Construct `IBitmapDrawable`'s class. -pub fn create_interface<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_interface<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( - QName::new(Namespace::package("flash.display"), "IBitmapDrawable"), + QName::new(Namespace::package("flash.display", mc), "IBitmapDrawable"), None, Method::from_builtin( bodiless_method, diff --git a/core/src/avm2/globals/flash/display/interactiveobject.rs b/core/src/avm2/globals/flash/display/interactiveobject.rs index 0b6e014ec..410ffc4a8 100644 --- a/core/src/avm2/globals/flash/display/interactiveobject.rs +++ b/core/src/avm2/globals/flash/display/interactiveobject.rs @@ -11,7 +11,7 @@ use crate::avm2::Namespace; use crate::avm2::QName; use crate::display_object::{TDisplayObject, TInteractiveObject}; use crate::{avm2_stub_getter, avm2_stub_setter}; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; /// Implements `flash.display.InteractiveObject`'s instance constructor. pub fn instance_init<'gc>( @@ -144,7 +144,10 @@ fn set_context_menu<'gc>( .and_then(|t| t.as_display_object()) .and_then(|dobj| dobj.as_interactive()) { - let cls_name = Multiname::new(Namespace::package("flash.display"), "NativeMenu"); + let cls_name = Multiname::new( + Namespace::package("flash.display", activation.context.gc_context), + "NativeMenu", + ); let cls = activation.resolve_class(&cls_name)?; let value = args .get(0) @@ -222,11 +225,12 @@ pub fn set_focus_rect<'gc>( } /// Construct `InteractiveObject`'s class. -pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( - QName::new(Namespace::package("flash.display"), "InteractiveObject"), + QName::new(Namespace::package("flash.display", mc), "InteractiveObject"), Some(Multiname::new( - Namespace::package("flash.display"), + Namespace::package("flash.display", mc), "DisplayObject", )), Method::from_builtin( @@ -262,7 +266,11 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> ("tabIndex", Some(tab_index), Some(set_tab_index)), ("focusRect", Some(focus_rect), Some(set_focus_rect)), ]; - write.define_public_builtin_instance_properties(mc, PUBLIC_INSTANCE_PROPERTIES); + write.define_builtin_instance_properties( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_PROPERTIES, + ); class } diff --git a/core/src/avm2/globals/flash/display/loader.rs b/core/src/avm2/globals/flash/display/loader.rs index 2a502b5f4..7b0c85086 100644 --- a/core/src/avm2/globals/flash/display/loader.rs +++ b/core/src/avm2/globals/flash/display/loader.rs @@ -5,7 +5,6 @@ use crate::avm2::object::LoaderInfoObject; use crate::avm2::object::TObject; use crate::avm2::value::Value; use crate::avm2::Multiname; -use crate::avm2::Namespace; use crate::avm2::{Error, Object}; use crate::backend::navigator::Request; use crate::display_object::LoaderDisplay; @@ -40,7 +39,10 @@ pub fn init<'gc>( false, )?; this.set_property( - &Multiname::new(Namespace::private(""), "_contentLoaderInfo"), + &Multiname::new( + activation.avm2().ruffle_private_namespace, + "_contentLoaderInfo", + ), loader_info.into(), activation, )?; @@ -61,7 +63,7 @@ pub fn load<'gc>( .and_then(|v| v.coerce_to_object(activation).ok()); let url = url_request - .get_property(&Multiname::public("url"), activation)? + .get_public_property("url", activation)? .coerce_to_string(activation)?; // This is a dummy MovieClip, which will get overwritten in `Loader` @@ -72,7 +74,10 @@ pub fn load<'gc>( let loader_info = this .get_property( - &Multiname::new(Namespace::private(""), "_contentLoaderInfo"), + &Multiname::new( + activation.avm2().ruffle_private_namespace, + "_contentLoaderInfo", + ), activation, )? .as_object() @@ -112,7 +117,10 @@ pub fn load_bytes<'gc>( let loader_info = this .get_property( - &Multiname::new(Namespace::private(""), "_contentLoaderInfo"), + &Multiname::new( + activation.avm2().ruffle_private_namespace, + "_contentLoaderInfo", + ), activation, )? .as_object() diff --git a/core/src/avm2/globals/flash/display/loaderinfo.rs b/core/src/avm2/globals/flash/display/loaderinfo.rs index 08e2a9f04..db2ebb16b 100644 --- a/core/src/avm2/globals/flash/display/loaderinfo.rs +++ b/core/src/avm2/globals/flash/display/loaderinfo.rs @@ -12,7 +12,7 @@ use crate::avm2::QName; use crate::avm2::{AvmString, Error}; use crate::avm2_stub_getter; use crate::display_object::TDisplayObject; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; use swf::{write_swf, Compression}; // FIXME - Throw an actual 'Error' with the proper code @@ -470,7 +470,7 @@ pub fn parameters<'gc>( for (k, v) in parameters.iter() { let avm_k = AvmString::new_utf8(activation.context.gc_context, k); let avm_v = AvmString::new_utf8(activation.context.gc_context, v); - params_obj.set_property(&Multiname::public(avm_k), avm_v.into(), activation)?; + params_obj.set_public_property(avm_k, avm_v.into(), activation)?; } return Ok(params_obj.into()); @@ -505,11 +505,12 @@ pub fn uncaught_error_events<'gc>( } /// Construct `LoaderInfo`'s class. -pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( - QName::new(Namespace::package("flash.display"), "LoaderInfo"), + QName::new(Namespace::package("flash.display", mc), "LoaderInfo"), Some(Multiname::new( - Namespace::package("flash.events"), + Namespace::package("flash.events", mc), "EventDispatcher", )), Method::from_builtin(instance_init, "", mc), @@ -552,7 +553,11 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> ("sharedEvents", Some(shared_events), None), ("uncaughtErrorEvents", Some(uncaught_error_events), None), ]; - write.define_public_builtin_instance_properties(mc, PUBLIC_INSTANCE_PROPERTIES); + write.define_builtin_instance_properties( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_PROPERTIES, + ); class } diff --git a/core/src/avm2/globals/flash/display/movieclip.rs b/core/src/avm2/globals/flash/display/movieclip.rs index 0d5ba5409..3fc32a567 100644 --- a/core/src/avm2/globals/flash/display/movieclip.rs +++ b/core/src/avm2/globals/flash/display/movieclip.rs @@ -12,7 +12,7 @@ use crate::avm2::Namespace; use crate::avm2::QName; use crate::display_object::{MovieClip, Scene, TDisplayObject}; use crate::string::{AvmString, WString}; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; /// Implements `flash.display.MovieClip`'s instance constructor. pub fn instance_init<'gc>( @@ -545,11 +545,12 @@ pub fn next_scene<'gc>( } /// Construct `MovieClip`'s class. -pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( - QName::new(Namespace::package("flash.display"), "MovieClip"), + QName::new(Namespace::package("flash.display", mc), "MovieClip"), Some(Multiname::new( - Namespace::package("flash.display"), + Namespace::package("flash.display", mc), "Sprite", )), Method::from_builtin(instance_init, "", mc), @@ -575,7 +576,11 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> ("isPlaying", Some(is_playing), None), ("totalFrames", Some(total_frames), None), ]; - write.define_public_builtin_instance_properties(mc, PUBLIC_INSTANCE_PROPERTIES); + write.define_builtin_instance_properties( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_PROPERTIES, + ); const PUBLIC_INSTANCE_METHODS: &[(&str, NativeMethodImpl)] = &[ ("addFrameScript", add_frame_script), @@ -588,7 +593,11 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> ("prevScene", prev_scene), ("nextScene", next_scene), ]; - write.define_public_builtin_instance_methods(mc, PUBLIC_INSTANCE_METHODS); + write.define_builtin_instance_methods( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_METHODS, + ); class } diff --git a/core/src/avm2/globals/flash/display/shape.rs b/core/src/avm2/globals/flash/display/shape.rs index 63e1b17c4..de176380d 100644 --- a/core/src/avm2/globals/flash/display/shape.rs +++ b/core/src/avm2/globals/flash/display/shape.rs @@ -2,7 +2,6 @@ use crate::avm2::activation::Activation; use crate::avm2::class::Class; -use crate::avm2::globals::NS_RUFFLE_INTERNAL; use crate::avm2::method::{Method, NativeMethodImpl}; use crate::avm2::object::{Object, StageObject, TObject}; use crate::avm2::traits::Trait; @@ -12,7 +11,7 @@ use crate::avm2::Multiname; use crate::avm2::Namespace; use crate::avm2::QName; use crate::display_object::Graphic; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; /// Implements `flash.display.Shape`'s instance constructor. pub fn instance_init<'gc>( @@ -52,13 +51,13 @@ pub fn graphics<'gc>( if let Some(dobj) = this.as_display_object() { // Lazily initialize the `Graphics` object in a hidden property. let graphics = match this.get_property( - &Multiname::new(Namespace::private(NS_RUFFLE_INTERNAL), "graphics"), + &Multiname::new(activation.avm2().ruffle_private_namespace, "graphics"), activation, )? { Value::Undefined | Value::Null => { let graphics = Value::from(StageObject::graphics(activation, dobj)?); this.set_property( - &Multiname::new(Namespace::private(NS_RUFFLE_INTERNAL), "graphics"), + &Multiname::new(activation.avm2().ruffle_private_namespace, "graphics"), graphics, activation, )?; @@ -74,11 +73,12 @@ pub fn graphics<'gc>( } /// Construct `Shape`'s class. -pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( - QName::new(Namespace::package("flash.display"), "Shape"), + QName::new(Namespace::package("flash.display", mc), "Shape"), Some(Multiname::new( - Namespace::package("flash.display"), + Namespace::package("flash.display", mc), "DisplayObject", )), Method::from_builtin(instance_init, "", mc), @@ -93,12 +93,16 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> Option, Option, )] = &[("graphics", Some(graphics), None)]; - write.define_public_builtin_instance_properties(mc, PUBLIC_INSTANCE_PROPERTIES); + write.define_builtin_instance_properties( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_PROPERTIES, + ); // Slot for lazy-initialized Graphics object. write.define_instance_trait(Trait::from_slot( - QName::new(Namespace::private(NS_RUFFLE_INTERNAL), "graphics"), - Multiname::new(Namespace::package("flash.display"), "Graphics"), + QName::new(activation.avm2().ruffle_private_namespace, "graphics"), + Multiname::new(Namespace::package("flash.display", mc), "Graphics"), None, )); diff --git a/core/src/avm2/globals/flash/display/simplebutton.rs b/core/src/avm2/globals/flash/display/simplebutton.rs index c05770317..091bd103d 100644 --- a/core/src/avm2/globals/flash/display/simplebutton.rs +++ b/core/src/avm2/globals/flash/display/simplebutton.rs @@ -12,7 +12,7 @@ use crate::avm2::Namespace; use crate::avm2::QName; use crate::display_object::{Avm2Button, ButtonTracking, TDisplayObject}; use crate::vminterface::Instantiator; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; use swf::ButtonState; /// Implements `flash.display.SimpleButton`'s instance constructor. @@ -362,11 +362,12 @@ pub fn set_use_hand_cursor<'gc>( } /// Construct `SimpleButton`'s class. -pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( - QName::new(Namespace::package("flash.display"), "SimpleButton"), + QName::new(Namespace::package("flash.display", mc), "SimpleButton"), Some(Multiname::new( - Namespace::package("flash.display"), + Namespace::package("flash.display", mc), "InteractiveObject", )), Method::from_builtin(instance_init, "", mc), @@ -404,7 +405,11 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> Some(set_sound_transform), ), ]; - write.define_public_builtin_instance_properties(mc, PUBLIC_INSTANCE_PROPERTIES); + write.define_builtin_instance_properties( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_PROPERTIES, + ); class } diff --git a/core/src/avm2/globals/flash/display/sprite.rs b/core/src/avm2/globals/flash/display/sprite.rs index 5740c1495..c6fe6777d 100644 --- a/core/src/avm2/globals/flash/display/sprite.rs +++ b/core/src/avm2/globals/flash/display/sprite.rs @@ -2,7 +2,6 @@ use crate::avm2::activation::Activation; use crate::avm2::class::{Class, ClassAttributes}; -use crate::avm2::globals::NS_RUFFLE_INTERNAL; use crate::avm2::method::{Method, NativeMethodImpl}; use crate::avm2::object::{Object, StageObject, TObject}; use crate::avm2::traits::Trait; @@ -13,7 +12,7 @@ use crate::avm2::Namespace; use crate::avm2::QName; use crate::display_object::{MovieClip, SoundTransform, TDisplayObject}; use crate::tag_utils::SwfMovie; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; use ruffle_render::bounding_box::BoundingBox; use std::sync::Arc; use swf::Twips; @@ -78,13 +77,13 @@ pub fn graphics<'gc>( if let Some(dobj) = this.as_display_object() { // Lazily initialize the `Graphics` object in a hidden property. let graphics = match this.get_property( - &Multiname::new(Namespace::private(NS_RUFFLE_INTERNAL), "graphics"), + &Multiname::new(activation.avm2().ruffle_private_namespace, "graphics"), activation, )? { Value::Undefined | Value::Null => { let graphics = Value::from(StageObject::graphics(activation, dobj)?); this.set_property( - &Multiname::new(Namespace::private(NS_RUFFLE_INTERNAL), "graphics"), + &Multiname::new(activation.avm2().ruffle_private_namespace, "graphics"), graphics, activation, )?; @@ -196,19 +195,19 @@ pub fn start_drag<'gc>( let constraint = if let Some(rect) = args.get(1) { let rect = rect.coerce_to_object(activation)?; let x = rect - .get_property(&Multiname::public("x"), activation)? + .get_public_property("x", activation)? .coerce_to_number(activation)?; let y = rect - .get_property(&Multiname::public("y"), activation)? + .get_public_property("y", activation)? .coerce_to_number(activation)?; let width = rect - .get_property(&Multiname::public("width"), activation)? + .get_public_property("width", activation)? .coerce_to_number(activation)?; let height = rect - .get_property(&Multiname::public("height"), activation)? + .get_public_property("height", activation)? .coerce_to_number(activation)?; // Normalize the bounds. @@ -300,11 +299,12 @@ pub fn set_use_hand_cursor<'gc>( } /// Construct `Sprite`'s class. -pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( - QName::new(Namespace::package("flash.display"), "Sprite"), + QName::new(Namespace::package("flash.display", mc), "Sprite"), Some(Multiname::new( - Namespace::package("flash.display"), + Namespace::package("flash.display", mc), "DisplayObjectContainer", )), Method::from_builtin(instance_init, "", mc), @@ -335,16 +335,27 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> Some(set_use_hand_cursor), ), ]; - write.define_public_builtin_instance_properties(mc, PUBLIC_INSTANCE_PROPERTIES); + write.define_builtin_instance_properties( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_PROPERTIES, + ); const PUBLIC_INSTANCE_METHODS: &[(&str, NativeMethodImpl)] = &[("startDrag", start_drag), ("stopDrag", stop_drag)]; - write.define_public_builtin_instance_methods(mc, PUBLIC_INSTANCE_METHODS); + write.define_builtin_instance_methods( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_METHODS, + ); // Slot for lazy-initialized Graphics object. write.define_instance_trait(Trait::from_slot( - QName::new(Namespace::private(NS_RUFFLE_INTERNAL), "graphics"), - Multiname::new(Namespace::package("flash.display"), "Graphics"), + QName::new(activation.avm2().ruffle_private_namespace, "graphics"), + Multiname::new( + Namespace::package("flash.display", activation.context.gc_context), + "Graphics", + ), None, )); diff --git a/core/src/avm2/globals/flash/display/stage.rs b/core/src/avm2/globals/flash/display/stage.rs index 0cfda99a9..34bdb9446 100644 --- a/core/src/avm2/globals/flash/display/stage.rs +++ b/core/src/avm2/globals/flash/display/stage.rs @@ -14,7 +14,7 @@ use crate::avm2::{ArrayObject, ArrayStorage}; use crate::display_object::{StageDisplayState, TDisplayObject}; use crate::string::{AvmString, WString}; use crate::{avm2_stub_getter, avm2_stub_setter}; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; use swf::Color; /// Implements `flash.display.Stage`'s instance constructor. @@ -762,11 +762,12 @@ pub fn set_full_screen_source_rect<'gc>( } /// Construct `Stage`'s class. -pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( - QName::new(Namespace::package("flash.display"), "Stage"), + QName::new(Namespace::package("flash.display", mc), "Stage"), Some(Multiname::new( - Namespace::package("flash.display"), + Namespace::package("flash.display", mc), "DisplayObjectContainer", )), Method::from_builtin(instance_init, "", mc), @@ -820,7 +821,7 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> if let Some(getter) = getter { write.define_instance_trait( Trait::from_getter( - QName::new(Namespace::public(), name), + QName::new(activation.avm2().public_namespace, name), Method::from_builtin(getter, name, mc), ) .with_override(), @@ -829,7 +830,7 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> if let Some(setter) = setter { write.define_instance_trait( Trait::from_setter( - QName::new(Namespace::public(), name), + QName::new(activation.avm2().public_namespace, name), Method::from_builtin(setter, name, mc), ) .with_override(), @@ -876,10 +877,18 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> ("quality", Some(quality), Some(set_quality)), ("stage3Ds", Some(stage3ds), None), ]; - write.define_public_builtin_instance_properties(mc, PUBLIC_INSTANCE_PROPERTIES); + write.define_builtin_instance_properties( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_PROPERTIES, + ); const PUBLIC_INSTANCE_METHODS: &[(&str, NativeMethodImpl)] = &[("invalidate", invalidate)]; - write.define_public_builtin_instance_methods(mc, PUBLIC_INSTANCE_METHODS); + write.define_builtin_instance_methods( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_METHODS, + ); class } diff --git a/core/src/avm2/globals/flash/display/stage_3d.rs b/core/src/avm2/globals/flash/display/stage_3d.rs index 899de9232..862a1a6cd 100644 --- a/core/src/avm2/globals/flash/display/stage_3d.rs +++ b/core/src/avm2/globals/flash/display/stage_3d.rs @@ -1,6 +1,5 @@ use crate::avm2::object::Context3DObject; use crate::avm2::object::TObject; -use crate::avm2::Multiname; use crate::avm2::{Activation, Error, Object, Value}; @@ -26,11 +25,7 @@ pub fn request_context3d_internal<'gc>( // FIXME - fire this at least one frame later, // since some seems to expect this (e.g. the adobe triangle example) - this.call_property( - &Multiname::public("dispatchEvent"), - &[event.into()], - activation, - )?; + this.call_public_property("dispatchEvent", &[event.into()], activation)?; } } Ok(Value::Undefined) diff --git a/core/src/avm2/globals/flash/display3D/context_3d.rs b/core/src/avm2/globals/flash/display3D/context_3d.rs index a64cb3cde..5b2499748 100644 --- a/core/src/avm2/globals/flash/display3D/context_3d.rs +++ b/core/src/avm2/globals/flash/display3D/context_3d.rs @@ -4,7 +4,6 @@ use ruffle_render::backend::Context3DVertexBufferFormat; use ruffle_render::backend::ProgramType; use crate::avm2::Activation; -use crate::avm2::Multiname; use crate::avm2::TObject; use crate::avm2::Value; use crate::avm2::{Error, Object}; @@ -255,14 +254,14 @@ pub fn set_program_constants_from_matrix<'gc>( // See https://github.com/openfl/openfl/blob/971a4c9e43b5472fd84d73920a2b7c1b3d8d9257/src/openfl/display3D/Context3D.hx#L1532-L1550 if user_transposedMatrix { matrix = matrix - .call_property(&Multiname::public("clone"), &[], activation)? + .call_public_property("clone", &[], activation)? .coerce_to_object(activation)?; - matrix.call_property(&Multiname::public("transpose"), &[], activation)?; + matrix.call_public_property("transpose", &[], activation)?; } let matrix_raw_data = matrix - .get_property(&Multiname::public("rawData"), activation)? + .get_public_property("rawData", activation)? .coerce_to_object(activation)?; let matrix_raw_data = matrix_raw_data .as_vector_storage() diff --git a/core/src/avm2/globals/flash/events/eventdispatcher.rs b/core/src/avm2/globals/flash/events/eventdispatcher.rs index ef02959b4..b7035130b 100644 --- a/core/src/avm2/globals/flash/events/eventdispatcher.rs +++ b/core/src/avm2/globals/flash/events/eventdispatcher.rs @@ -2,9 +2,7 @@ use crate::avm2::activation::Activation; use crate::avm2::class::{Class, ClassAttributes}; -use crate::avm2::events::{ - dispatch_event as dispatch_event_internal, parent_of, NS_EVENT_DISPATCHER, -}; +use crate::avm2::events::{dispatch_event as dispatch_event_internal, parent_of}; use crate::avm2::method::{Method, NativeMethodImpl}; use crate::avm2::object::{DispatchObject, Object, TObject}; use crate::avm2::traits::Trait; @@ -13,7 +11,7 @@ use crate::avm2::Multiname; use crate::avm2::Namespace; use crate::avm2::QName; use crate::avm2::{Avm2, Error}; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; /// Implements `flash.events.EventDispatcher`'s instance constructor. pub fn instance_init<'gc>( @@ -27,7 +25,7 @@ pub fn instance_init<'gc>( let target = args.get(0).cloned().unwrap_or(Value::Null); this.init_property( - &Multiname::new(Namespace::private(NS_EVENT_DISPATCHER), "target"), + &Multiname::new(activation.avm2().ruffle_private_namespace, "target"), target, activation, )?; @@ -46,14 +44,14 @@ fn dispatch_list<'gc>( mut this: Object<'gc>, ) -> Result, Error<'gc>> { match this.get_property( - &Multiname::new(Namespace::private(NS_EVENT_DISPATCHER), "dispatch_list"), + &Multiname::new(activation.avm2().ruffle_private_namespace, "dispatch_list"), activation, )? { Value::Object(o) => Ok(o), _ => { let dispatch_list = DispatchObject::empty_list(activation.context.gc_context); this.init_property( - &Multiname::new(Namespace::private(NS_EVENT_DISPATCHER), "dispatch_list"), + &Multiname::new(activation.avm2().ruffle_private_namespace, "dispatch_list"), dispatch_list.into(), activation, )?; @@ -185,7 +183,7 @@ pub fn will_trigger<'gc>( let target = this .get_property( - &Multiname::new(Namespace::private(NS_EVENT_DISPATCHER), "target"), + &Multiname::new(activation.avm2().ruffle_private_namespace, "target"), activation, )? .as_object() @@ -237,7 +235,7 @@ pub fn to_string<'gc>( args: &[Value<'gc>], ) -> Result, Error<'gc>> { let object_proto = activation.avm2().classes().object.prototype(); - let name = Multiname::public("toString"); + let name = Multiname::new(activation.avm2().public_namespace, "toString"); object_proto .get_property(&name, activation)? .as_callable(activation, Some(&name), Some(object_proto))? @@ -245,10 +243,11 @@ pub fn to_string<'gc>( } /// Construct `EventDispatcher`'s class. -pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( - QName::new(Namespace::package("flash.events"), "EventDispatcher"), - Some(Multiname::public("Object")), + QName::new(Namespace::package("flash.events", mc), "EventDispatcher"), + Some(Multiname::new(activation.avm2().public_namespace, "Object")), Method::from_builtin(instance_init, "", mc), Method::from_builtin(class_init, "", mc), mc, @@ -259,7 +258,7 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> write.set_attributes(ClassAttributes::SEALED); write.implements(Multiname::new( - Namespace::package("flash.events"), + Namespace::package("flash.events", mc), "IEventDispatcher", )); @@ -271,16 +270,20 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> ("dispatchEvent", dispatch_event), ("toString", to_string), ]; - write.define_public_builtin_instance_methods(mc, PUBLIC_INSTANCE_METHODS); + write.define_builtin_instance_methods( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_METHODS, + ); write.define_instance_trait(Trait::from_slot( - QName::new(Namespace::private(NS_EVENT_DISPATCHER), "target"), - Multiname::public("Object"), + QName::new(activation.avm2().ruffle_private_namespace, "target"), + Multiname::new(activation.avm2().public_namespace, "Object"), None, )); write.define_instance_trait(Trait::from_slot( - QName::new(Namespace::private(NS_EVENT_DISPATCHER), "dispatch_list"), - Multiname::public("Object"), + QName::new(activation.avm2().ruffle_private_namespace, "dispatch_list"), + Multiname::new(activation.avm2().public_namespace, "Object"), None, )); diff --git a/core/src/avm2/globals/flash/events/ieventdispatcher.rs b/core/src/avm2/globals/flash/events/ieventdispatcher.rs index 77b99325f..7d80f24a0 100644 --- a/core/src/avm2/globals/flash/events/ieventdispatcher.rs +++ b/core/src/avm2/globals/flash/events/ieventdispatcher.rs @@ -8,7 +8,7 @@ use crate::avm2::value::Value; use crate::avm2::Error; use crate::avm2::Namespace; use crate::avm2::QName; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; /// Emulates attempts to execute bodiless methods. pub fn bodiless_method<'gc>( @@ -29,9 +29,10 @@ pub fn class_init<'gc>( } /// Construct `IEventDispatcher`'s class. -pub fn create_interface<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_interface<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( - QName::new(Namespace::package("flash.events"), "IEventDispatcher"), + QName::new(Namespace::package("flash.events", mc), "IEventDispatcher"), None, Method::from_builtin( bodiless_method, @@ -53,7 +54,11 @@ pub fn create_interface<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class< ("removeEventListener", bodiless_method), ("willTrigger", bodiless_method), ]; - write.define_public_builtin_instance_methods(mc, PUBLIC_INSTANCE_METHODS); + write.define_builtin_instance_methods( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_METHODS, + ); class } diff --git a/core/src/avm2/globals/flash/events/mouse_event.rs b/core/src/avm2/globals/flash/events/mouse_event.rs index 88b80b043..5dce94cf0 100644 --- a/core/src/avm2/globals/flash/events/mouse_event.rs +++ b/core/src/avm2/globals/flash/events/mouse_event.rs @@ -2,7 +2,6 @@ use crate::avm2::activation::Activation; use crate::avm2::object::{Object, TObject}; use crate::avm2::value::Value; use crate::avm2::Error; -use crate::avm2::Multiname; use crate::display_object::TDisplayObject; use swf::Twips; @@ -15,7 +14,7 @@ pub fn get_stage_x<'gc>( if let Some(this) = this { if let Some(evt) = this.as_event() { let local_x = this - .get_property(&Multiname::public("localX"), activation)? + .get_public_property("localX", activation)? .coerce_to_number(activation)?; if local_x.is_nan() { @@ -43,7 +42,7 @@ pub fn get_stage_y<'gc>( if let Some(this) = this { if let Some(evt) = this.as_event() { let local_y = this - .get_property(&Multiname::public("localY"), activation)? + .get_public_property("localY", activation)? .coerce_to_number(activation)?; if local_y.is_nan() { diff --git a/core/src/avm2/globals/flash/geom/transform.rs b/core/src/avm2/globals/flash/geom/transform.rs index dc10ae171..4ba958ec9 100644 --- a/core/src/avm2/globals/flash/geom/transform.rs +++ b/core/src/avm2/globals/flash/geom/transform.rs @@ -1,7 +1,7 @@ #![allow(non_snake_case)] use crate::avm2::Multiname; -use crate::avm2::{Activation, Error, Namespace, Object, TObject, Value}; +use crate::avm2::{Activation, Error, Object, TObject, Value}; use crate::avm2_stub_getter; use crate::display_object::TDisplayObject; use crate::prelude::{ColorTransform, DisplayObject, Matrix, Twips}; @@ -14,7 +14,7 @@ fn get_display_object<'gc>( ) -> Result, Error<'gc>> { Ok(this .get_property( - &Multiname::new(Namespace::Private("".into()), "_displayObject"), + &Multiname::new(activation.avm2().ruffle_private_namespace, "_displayObject"), activation, )? .as_object() @@ -29,7 +29,7 @@ pub fn init<'gc>( args: &[Value<'gc>], ) -> Result, Error<'gc>> { this.unwrap().set_property( - &Multiname::new(Namespace::Private("".into()), "_displayObject"), + &Multiname::new(activation.avm2().ruffle_private_namespace, "_displayObject"), args[0], activation, )?; @@ -145,28 +145,28 @@ pub fn object_to_color_transform<'gc>( activation: &mut Activation<'_, 'gc>, ) -> Result> { let red_multiplier = object - .get_property(&Multiname::public("redMultiplier"), activation)? + .get_public_property("redMultiplier", activation)? .coerce_to_number(activation)?; let green_multiplier = object - .get_property(&Multiname::public("greenMultiplier"), activation)? + .get_public_property("greenMultiplier", activation)? .coerce_to_number(activation)?; let blue_multiplier = object - .get_property(&Multiname::public("blueMultiplier"), activation)? + .get_public_property("blueMultiplier", activation)? .coerce_to_number(activation)?; let alpha_multiplier = object - .get_property(&Multiname::public("alphaMultiplier"), activation)? + .get_public_property("alphaMultiplier", activation)? .coerce_to_number(activation)?; let red_offset = object - .get_property(&Multiname::public("redOffset"), activation)? + .get_public_property("redOffset", activation)? .coerce_to_number(activation)?; let green_offset = object - .get_property(&Multiname::public("greenOffset"), activation)? + .get_public_property("greenOffset", activation)? .coerce_to_number(activation)?; let blue_offset = object - .get_property(&Multiname::public("blueOffset"), activation)? + .get_public_property("blueOffset", activation)? .coerce_to_number(activation)?; let alpha_offset = object - .get_property(&Multiname::public("alphaOffset"), activation)? + .get_public_property("alphaOffset", activation)? .coerce_to_number(activation)?; Ok(ColorTransform { r_mult: Fixed8::from_f64(red_multiplier), @@ -224,25 +224,25 @@ pub fn object_to_matrix<'gc>( activation: &mut Activation<'_, 'gc>, ) -> Result> { let a = object - .get_property(&Multiname::public("a"), activation)? + .get_public_property("a", activation)? .coerce_to_number(activation)? as f32; let b = object - .get_property(&Multiname::public("b"), activation)? + .get_public_property("b", activation)? .coerce_to_number(activation)? as f32; let c = object - .get_property(&Multiname::public("c"), activation)? + .get_public_property("c", activation)? .coerce_to_number(activation)? as f32; let d = object - .get_property(&Multiname::public("d"), activation)? + .get_public_property("d", activation)? .coerce_to_number(activation)? as f32; let tx = Twips::from_pixels( object - .get_property(&Multiname::public("tx"), activation)? + .get_public_property("tx", activation)? .coerce_to_number(activation)?, ); let ty = Twips::from_pixels( object - .get_property(&Multiname::public("ty"), activation)? + .get_public_property("ty", activation)? .coerce_to_number(activation)?, ); diff --git a/core/src/avm2/globals/flash/media/sound.rs b/core/src/avm2/globals/flash/media/sound.rs index 47e5025d6..f9b7da859 100644 --- a/core/src/avm2/globals/flash/media/sound.rs +++ b/core/src/avm2/globals/flash/media/sound.rs @@ -13,7 +13,7 @@ use crate::backend::navigator::Request; use crate::character::Character; use crate::display_object::SoundTransform; use crate::{avm2_stub_constructor, avm2_stub_getter, avm2_stub_method}; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; use swf::{SoundEvent, SoundInfo}; /// Implements `flash.media.Sound`'s instance constructor. @@ -221,7 +221,7 @@ pub fn load<'gc>( }; let url = url_request - .get_property(&Multiname::public("url"), activation)? + .get_public_property("url", activation)? .coerce_to_string(activation)?; // TODO: context parameter currently unused. @@ -266,11 +266,12 @@ pub fn load_pcm_from_byte_array<'gc>( } /// Construct `Sound`'s class. -pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( - QName::new(Namespace::package("flash.media"), "Sound"), + QName::new(Namespace::package("flash.media", mc), "Sound"), Some(Multiname::new( - Namespace::package("flash.events"), + Namespace::package("flash.events", mc), "EventDispatcher", )), Method::from_builtin(instance_init, "", mc), @@ -295,7 +296,11 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> ("url", Some(url), None), ("length", Some(length), None), ]; - write.define_public_builtin_instance_properties(mc, PUBLIC_INSTANCE_PROPERTIES); + write.define_builtin_instance_properties( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_PROPERTIES, + ); const PUBLIC_INSTANCE_METHODS: &[(&str, NativeMethodImpl)] = &[ ("play", play), @@ -308,7 +313,11 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> ), ("loadPCMFromByteArray", load_pcm_from_byte_array), ]; - write.define_public_builtin_instance_methods(mc, PUBLIC_INSTANCE_METHODS); + write.define_builtin_instance_methods( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_METHODS, + ); class } diff --git a/core/src/avm2/globals/flash/media/soundchannel.rs b/core/src/avm2/globals/flash/media/soundchannel.rs index ff20e5483..059700c96 100644 --- a/core/src/avm2/globals/flash/media/soundchannel.rs +++ b/core/src/avm2/globals/flash/media/soundchannel.rs @@ -10,7 +10,7 @@ use crate::avm2::Multiname; use crate::avm2::Namespace; use crate::avm2::QName; use crate::display_object::SoundTransform; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; /// Implements `flash.media.SoundChannel`'s instance constructor. pub fn instance_init<'gc>( @@ -131,11 +131,12 @@ pub fn stop<'gc>( } /// Construct `SoundChannel`'s class. -pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( - QName::new(Namespace::package("flash.media"), "SoundChannel"), + QName::new(Namespace::package("flash.media", mc), "SoundChannel"), Some(Multiname::new( - Namespace::package("flash.events"), + Namespace::package("flash.events", mc), "EventDispatcher", )), Method::from_builtin(instance_init, "", mc), @@ -162,10 +163,18 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> Some(set_sound_transform), ), ]; - write.define_public_builtin_instance_properties(mc, PUBLIC_INSTANCE_PROPERTIES); + write.define_builtin_instance_properties( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_PROPERTIES, + ); const PUBLIC_INSTANCE_METHODS: &[(&str, NativeMethodImpl)] = &[("stop", stop)]; - write.define_public_builtin_instance_methods(mc, PUBLIC_INSTANCE_METHODS); + write.define_builtin_instance_methods( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_METHODS, + ); class } diff --git a/core/src/avm2/globals/flash/media/soundmixer.rs b/core/src/avm2/globals/flash/media/soundmixer.rs index db5140854..d9c72b118 100644 --- a/core/src/avm2/globals/flash/media/soundmixer.rs +++ b/core/src/avm2/globals/flash/media/soundmixer.rs @@ -15,7 +15,7 @@ use crate::avm2::Namespace; use crate::avm2::QName; use crate::avm2_stub_getter; use crate::display_object::SoundTransform; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; /// Implements `flash.media.SoundMixer`'s instance constructor. pub fn instance_init<'gc>( @@ -218,10 +218,11 @@ pub fn compute_spectrum<'gc>( } /// Construct `SoundMixer`'s class. -pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( - QName::new(Namespace::package("flash.media"), "SoundMixer"), - Some(Multiname::public("Object")), + QName::new(Namespace::package("flash.media", mc), "SoundMixer"), + Some(Multiname::new(activation.avm2().public_namespace, "Object")), Method::from_builtin(instance_init, "", mc), Method::from_builtin(class_init, "", mc), mc, @@ -240,14 +241,22 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> ), ("bufferTime", Some(buffer_time), Some(set_buffer_time)), ]; - write.define_public_builtin_class_properties(mc, PUBLIC_CLASS_PROPERTIES); + write.define_builtin_class_properties( + mc, + activation.avm2().public_namespace, + PUBLIC_CLASS_PROPERTIES, + ); const PUBLIC_CLASS_METHODS: &[(&str, NativeMethodImpl)] = &[ ("stopAll", stop_all), ("areSoundsInaccessible", are_sounds_inaccessible), ("computeSpectrum", compute_spectrum), ]; - write.define_public_builtin_class_methods(mc, PUBLIC_CLASS_METHODS); + write.define_builtin_class_methods( + mc, + activation.avm2().public_namespace, + PUBLIC_CLASS_METHODS, + ); class } diff --git a/core/src/avm2/globals/flash/media/soundtransform.rs b/core/src/avm2/globals/flash/media/soundtransform.rs index 9de8ef2bc..b272f14be 100644 --- a/core/src/avm2/globals/flash/media/soundtransform.rs +++ b/core/src/avm2/globals/flash/media/soundtransform.rs @@ -9,7 +9,7 @@ use crate::avm2::Error; use crate::avm2::Multiname; use crate::avm2::Namespace; use crate::avm2::QName; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; /// Implements `flash.media.SoundTransform`'s instance constructor. pub fn instance_init<'gc>( @@ -31,8 +31,8 @@ pub fn instance_init<'gc>( .unwrap_or_else(|| 0.0.into()) .coerce_to_number(activation)?; - this.set_property(&Multiname::public("volume"), volume.into(), activation)?; - this.set_property(&Multiname::public("pan"), pan.into(), activation)?; + this.set_public_property("volume", volume.into(), activation)?; + this.set_public_property("pan", pan.into(), activation)?; } Ok(Value::Undefined) @@ -55,10 +55,10 @@ pub fn pan<'gc>( ) -> Result, Error<'gc>> { if let Some(this) = this { let left_to_right = this - .get_property(&Multiname::public("leftToRight"), activation)? + .get_public_property("leftToRight", activation)? .coerce_to_number(activation)?; let right_to_left = this - .get_property(&Multiname::public("rightToLeft"), activation)? + .get_public_property("rightToLeft", activation)? .coerce_to_number(activation)?; if left_to_right != 0.0 || right_to_left != 0.0 { @@ -66,7 +66,7 @@ pub fn pan<'gc>( } let left_to_left = this - .get_property(&Multiname::public("leftToLeft"), activation)? + .get_public_property("leftToLeft", activation)? .coerce_to_number(activation)?; return Ok((1.0 - left_to_left.powf(2.0).abs()).into()); @@ -88,28 +88,21 @@ pub fn set_pan<'gc>( .unwrap_or(Value::Undefined) .coerce_to_number(activation)?; - this.set_property( - &Multiname::public("leftToLeft"), - (1.0 - pan).sqrt().into(), - activation, - )?; - this.set_property( - &Multiname::public("rightToRight"), - (1.0 + pan).sqrt().into(), - activation, - )?; - this.set_property(&Multiname::public("leftToRight"), (0.0).into(), activation)?; - this.set_property(&Multiname::public("rightToLeft"), (0.0).into(), activation)?; + this.set_public_property("leftToLeft", (1.0 - pan).sqrt().into(), activation)?; + this.set_public_property("rightToRight", (1.0 + pan).sqrt().into(), activation)?; + this.set_public_property("leftToRight", (0.0).into(), activation)?; + this.set_public_property("rightToLeft", (0.0).into(), activation)?; } Ok(Value::Undefined) } /// Construct `SoundTransform`'s class. -pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( - QName::new(Namespace::package("flash.media"), "SoundTransform"), - Some(Multiname::public("Object")), + QName::new(Namespace::package("flash.media", mc), "SoundTransform"), + Some(Multiname::new(activation.avm2().public_namespace, "Object")), Method::from_builtin(instance_init, "", mc), Method::from_builtin(class_init, "", mc), mc, @@ -124,7 +117,11 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> Option, Option, )] = &[("pan", Some(pan), Some(set_pan))]; - write.define_public_builtin_instance_properties(mc, PUBLIC_INSTANCE_PROPERTIES); + write.define_builtin_instance_properties( + mc, + activation.avm2().public_namespace, + PUBLIC_INSTANCE_PROPERTIES, + ); const PUBLIC_INSTANCE_SLOTS: &[(&str, Option)] = &[ ("leftToLeft", None), @@ -133,7 +130,11 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> ("rightToRight", None), ("volume", None), ]; - write.define_public_slot_number_instance_traits(PUBLIC_INSTANCE_SLOTS); + write.define_slot_number_instance_traits( + activation.avm2().public_namespace, + PUBLIC_INSTANCE_SLOTS, + activation, + ); class } diff --git a/core/src/avm2/globals/flash/media/video.rs b/core/src/avm2/globals/flash/media/video.rs index 79fbb5227..27a14090c 100644 --- a/core/src/avm2/globals/flash/media/video.rs +++ b/core/src/avm2/globals/flash/media/video.rs @@ -9,7 +9,7 @@ use crate::avm2::Error; use crate::avm2::Multiname; use crate::avm2::Namespace; use crate::avm2::QName; -use gc_arena::{GcCell, MutationContext}; +use gc_arena::GcCell; /// Implements `flash.media.Video`'s instance constructor. pub fn instance_init<'gc>( @@ -34,11 +34,12 @@ pub fn class_init<'gc>( } /// Construct `Video`'s class. -pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { +pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { + let mc = activation.context.gc_context; let class = Class::new( - QName::new(Namespace::package("flash.media"), "Video"), + QName::new(Namespace::package("flash.media", mc), "Video"), Some(Multiname::new( - Namespace::package("flash.display"), + Namespace::package("flash.display", mc), "DisplayObject", )), Method::from_builtin(instance_init, "