From 128416cccdc34dd7d0b01d35e1f91336a5724423 Mon Sep 17 00:00:00 2001 From: Adrian Wielgosik Date: Tue, 13 Jun 2023 20:22:39 +0200 Subject: [PATCH] avm2: Support Array(...) without new --- core/src/avm2/globals/array.rs | 14 ++++++++++++++ tests/tests/swfs/avm2/class_call/output.txt | 9 +++++++++ tests/tests/swfs/avm2/class_call/test.as | 10 +++++++++- tests/tests/swfs/avm2/class_call/test.swf | Bin 902 -> 978 bytes 4 files changed, 32 insertions(+), 1 deletion(-) 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 1a3c9994b1764636b609a13e957ae74594e1484c..64384087adbc862cff9c00168a19a30c5e2d52cd 100644 GIT binary patch delta 699 zcmV;s0!00W2hs-#T31smZUz7V!LbP@0e^;K;NoB;gb(&Pa1ue#qvM!SC`*Kd?DHjH zNgZi&J9@PJrb;{h$(J9X0t;h}Lb-__jnG8n!v@#=;-h9+5cX?F3{VE_TICZ*^e)7b z#L<-#_cW#zQ3cs3s(hqWGS(@5x8WAbPvf%GYXw-Wl#i3ezNK6|6Lx-&Sch~23V(E_ zYXB%hpJF*b@W^A(2zxl%c*7;`b4rXWIL&EjX_bW)5z&=&jH`r3R+sjKA);x@q2DEr zkIFuZ&PifG=(GvXRrv(?1QWR&YdC(K*b%l$GEh^uAo{!PF^Z5X2fy3V$KU?Om!Z-S=6tvycntxK_>(M0n z7)m)E#s3eLQ}CVK7_J=_j4;<_Gb8ik2Np zYVEDGNCYy>pfQc}Y)tOE!ZGCzOjlhLp2u(_5g6l*A}J|N1e6ui}wk%1kb@mjea8y{g8$;%{gzwz*At z0i(om4a4ul=T0J7NX|^*LpAlZ_Ro=76+-foec7y#E7<9{)>lXEWc0cHq!W;v=nLNYB{jHx*OdjfoJyW zKeFjw0RkKdH7q==}W; z2hh7OE^0oL^~q;a(fASs1mezBQ^(4%Hd>KvTO9j0KcQm(te-@y-dtKp6|D997JnhE z%Y(@rh#H^#odvWPyeGCpa>wR28;r%*QnSpN#32pBGY#4hzN1zWwb(`_`;ixE-Rgv3 z(`ITYkZk_ZEK~j(EtU?8Y|)?zhsUt6A8>z#*N+JGe%Hy(m6azoQ_@bMlK4vyztnbj z5$Vk3ths_0lE*9sY@9vWRnb6k4uAJ7Ha@HVQ>m1Omdc=ioP6q!yeUc2Eqt^CJpQL6 zAi#}-SOU!IUh3K-``{;|aCyvS=lpGJc#_m0o)32L1Z}G}9w&k*_^q8Cddj|z;*Ga2 zMkAlRMhIGbQ7gFZ6VuvTwreeWtHkzv1_pOC4Lyavz}8j{4S((=Si1yVihu7?z+_X% zFbXxqH5epC^d_9++-1+5+hi`3sclhl2g2#=VssWISte@6G5**lak5{CV(*15MUlb| znPF%`oK;cyEGfuzi%?QHkNe9l@s2QHmYQ!mYmC=69^p1L?(jj;yppO$fVZP3Uvyc9 zwG8hJ==s4Ms>S7ocwS2iE?ahwd=VWlEc>Nt{Kne2`q^WDD7r{(a2W$V%eqhKuNK(e z_sTQu>)jO-eL0^ui?6H}^CO&)>GT=SUMIfZ%})jT#Ejy2mTCH2M57@Le80NY=vk@$ Ih5SM6IXDF~0RR91