diff --git a/core/src/avm2/globals/array.rs b/core/src/avm2/globals/array.rs index db62b58a1..c79738364 100644 --- a/core/src/avm2/globals/array.rs +++ b/core/src/avm2/globals/array.rs @@ -102,6 +102,19 @@ pub fn instance_init<'gc>( Ok(Value::Undefined) } +pub fn class_call<'gc>( + activation: &mut Activation<'_, 'gc>, + _this: Option>, + args: &[Value<'gc>], +) -> Result, Error<'gc>> { + Ok(activation + .avm2() + .classes() + .array + .construct(activation, args)? + .into()) +} + /// Implements `Array`'s class initializer. pub fn class_init<'gc>( activation: &mut Activation<'_, 'gc>, @@ -1272,6 +1285,7 @@ pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> GcCell<'gc, Cl let mut write = class.write(mc); write.set_instance_allocator(array_allocator); + write.set_call_handler(Method::from_builtin(class_call, "", mc)); const PUBLIC_INSTANCE_PROPERTIES: &[( &str, diff --git a/tests/tests/swfs/avm2/class_call/output.txt b/tests/tests/swfs/avm2/class_call/output.txt index b77b467f6..e61c305dc 100644 --- a/tests/tests/swfs/avm2/class_call/output.txt +++ b/tests/tests/swfs/avm2/class_call/output.txt @@ -21,3 +21,12 @@ string /asdf/gi //RegExp(regexp) /asdf/gi + +//Array().length +0 +//Array(5) +,,,, +//Array("5") +5 +//Array("a", "b", "c") +a,b,c diff --git a/tests/tests/swfs/avm2/class_call/test.as b/tests/tests/swfs/avm2/class_call/test.as index 15a4eee83..acc6df4ca 100644 --- a/tests/tests/swfs/avm2/class_call/test.as +++ b/tests/tests/swfs/avm2/class_call/test.as @@ -51,4 +51,12 @@ trace("//RegExp(regexp)") pat = cls(pat); trace(pat); - +trace() +trace("//Array().length") +trace(Array().length) +trace("//Array(5)") +trace(Array(5)) +trace("//Array(\"5\")") +trace(Array("5")) +trace("//Array(\"a\", \"b\", \"c\")") +trace(Array("a", "b", "c")) diff --git a/tests/tests/swfs/avm2/class_call/test.swf b/tests/tests/swfs/avm2/class_call/test.swf index 1a3c9994b..64384087a 100644 Binary files a/tests/tests/swfs/avm2/class_call/test.swf and b/tests/tests/swfs/avm2/class_call/test.swf differ