diff --git a/core/src/avm2.rs b/core/src/avm2.rs index 322c049ee..270223170 100644 --- a/core/src/avm2.rs +++ b/core/src/avm2.rs @@ -99,6 +99,7 @@ pub struct Avm2<'gc> { system_classes: Option>, pub public_namespace: Namespace<'gc>, + pub internal_namespace: Namespace<'gc>, pub as3_namespace: Namespace<'gc>, pub vector_public_namespace: Namespace<'gc>, pub vector_internal_namespace: Namespace<'gc>, @@ -157,6 +158,7 @@ impl<'gc> Avm2<'gc> { system_classes: None, public_namespace: Namespace::package("", context), + internal_namespace: Namespace::internal("", context), as3_namespace: Namespace::package("http://adobe.com/AS3/2006/builtin", context), vector_public_namespace: Namespace::package("__AS3__.vec", context), vector_internal_namespace: Namespace::internal("__AS3__.vec", context), diff --git a/core/src/avm2/globals/object.rs b/core/src/avm2/globals/object.rs index b21379285..5b6e8f16f 100644 --- a/core/src/avm2/globals/object.rs +++ b/core/src/avm2/globals/object.rs @@ -271,6 +271,15 @@ pub fn set_property_is_enumerable<'gc>( Ok(Value::Undefined) } +/// Undocumented `Object.init`, which is a no-op +pub fn init<'gc>( + _activation: &mut Activation<'_, 'gc>, + _this: Option>, + _args: &[Value<'gc>], +) -> Result, Error<'gc>> { + Ok(Value::Undefined) +} + /// Construct `Object`'s class. pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Class<'gc>> { let gc_context = activation.context.gc_context; @@ -291,7 +300,7 @@ pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Cl write.define_class_trait(Trait::from_const( QName::new(activation.avm2().public_namespace, "length"), Multiname::new(activation.avm2().public_namespace, "int"), - None, + Some(1.into()), )); // Fixed traits (in AS3 namespace) @@ -306,5 +315,12 @@ pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Cl AS3_INSTANCE_METHODS, ); + const INTERNAL_INIT_METHOD: &[(&str, NativeMethodImpl)] = &[("init", init)]; + write.define_builtin_class_methods( + gc_context, + activation.avm2().internal_namespace, + INTERNAL_INIT_METHOD, + ); + object_class } diff --git a/tests/tests/swfs/avm2/static_length/output.txt b/tests/tests/swfs/avm2/static_length/output.txt index 7fd6c3a78..6f8a61c4b 100644 --- a/tests/tests/swfs/avm2/static_length/output.txt +++ b/tests/tests/swfs/avm2/static_length/output.txt @@ -1,3 +1,4 @@ +Object.length is: 1 RegExp.length is: 1 String.length is: 1 XMLList.length is: 1 diff --git a/tests/tests/swfs/avm2/static_length/test.as b/tests/tests/swfs/avm2/static_length/test.as index ef5196bbc..444804880 100644 --- a/tests/tests/swfs/avm2/static_length/test.as +++ b/tests/tests/swfs/avm2/static_length/test.as @@ -8,6 +8,7 @@ package +trace("Object.length is: " + Object.length); trace("RegExp.length is: " + RegExp.length); trace("String.length is: " + String.length); trace("XMLList.length is: " + XMLList.length); diff --git a/tests/tests/swfs/avm2/static_length/test.swf b/tests/tests/swfs/avm2/static_length/test.swf index 8690fc3f4..3be966d3a 100644 Binary files a/tests/tests/swfs/avm2/static_length/test.swf and b/tests/tests/swfs/avm2/static_length/test.swf differ