From 53f42e0becf8e4291d3f302f298f86b5ccc494e9 Mon Sep 17 00:00:00 2001 From: Aaron Hill Date: Mon, 26 Sep 2022 21:54:10 -0500 Subject: [PATCH] avm2: Fix getQualifiedClassName for null and undefined --- core/src/avm2/globals/flash/utils.rs | 12 ++++++++---- .../swfs/avm2/get_qualified_class_name/Test.as | 5 ++++- .../avm2/get_qualified_class_name/output.txt | 4 +++- .../avm2/get_qualified_class_name/test.swf | Bin 1083 -> 840 bytes 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/core/src/avm2/globals/flash/utils.rs b/core/src/avm2/globals/flash/utils.rs index 326005be7..27087e4e1 100644 --- a/core/src/avm2/globals/flash/utils.rs +++ b/core/src/avm2/globals/flash/utils.rs @@ -193,10 +193,14 @@ pub fn get_qualified_class_name<'gc>( _this: Option>, args: &[Value<'gc>], ) -> Result, Error<'gc>> { - let obj = args - .get(0) - .unwrap_or(&Value::Undefined) - .coerce_to_object(activation)?; + // This is a native method, which enforces the argument count. + let val = args[0]; + match val { + Value::Null => return Ok("null".into()), + Value::Undefined => return Ok("void".into()), + _ => {} + } + let obj = val.coerce_to_object(activation)?; let class = match obj.as_class_object() { Some(class) => class, diff --git a/tests/tests/swfs/avm2/get_qualified_class_name/Test.as b/tests/tests/swfs/avm2/get_qualified_class_name/Test.as index eed7ee005..bda680ea2 100644 --- a/tests/tests/swfs/avm2/get_qualified_class_name/Test.as +++ b/tests/tests/swfs/avm2/get_qualified_class_name/Test.as @@ -20,4 +20,7 @@ trace(getQualifiedClassName(String)); trace(getQualifiedClassName(new flash.utils.ByteArray())); -trace(getQualifiedClassName(new String())); \ No newline at end of file +trace(getQualifiedClassName(new String())); + +trace(getQualifiedClassName(null)); +trace(getQualifiedClassName(undefined)); \ No newline at end of file diff --git a/tests/tests/swfs/avm2/get_qualified_class_name/output.txt b/tests/tests/swfs/avm2/get_qualified_class_name/output.txt index 2a25bf3a9..5ffe76f7c 100644 --- a/tests/tests/swfs/avm2/get_qualified_class_name/output.txt +++ b/tests/tests/swfs/avm2/get_qualified_class_name/output.txt @@ -5,4 +5,6 @@ com.very.long.namespace::example int String flash.utils::ByteArray -String \ No newline at end of file +String +null +void diff --git a/tests/tests/swfs/avm2/get_qualified_class_name/test.swf b/tests/tests/swfs/avm2/get_qualified_class_name/test.swf index 49bb12f53d85d08cf6529d511f368ae4418b9a74..a1dacc984a67243c8f7732384a2d1e1d3c2536ae 100644 GIT binary patch literal 840 zcmV-O1GoG`S5pwn1pokeoRw4CZrer>-C16i7hNpdqGUIU-9$+c1d!<r2o-}{DS(>|DeCXofRoV1rh`y$lX0>E_-GM{6v%v zA^E=uDFZnwXoQeMdUJELvo_tT?pOa9Ri8J*^TzATw`Yy%0d^WA+yK5w2Xg1~2u)Wr6P=x02P_Qdk2J08_$Jh-Y2$NojlcSk&&xLsc7pWM-8 z$oJCyL4?ko{?M(TxSoIJjrh>>`Q9zt4={57$v3=KSy^1Ko}Pc;-Kg{x6)e4d=Nl@u zi~`TU(5HTn_fcT)?E4j9-&&$?Ez!5uZQl;kzM;0tvKh72 zX4KPx=Gk1#V2)aE4cBL4Kd8_>#FP*yFiY*?n1E$2(7Qm`y*R|Wtbq%s4Q0b`QR zlnhgIOj~36I)e>e1qMZCl$e1&TMV`t{GhK>U6&Z#W#*4ey~ou1Osz8Yfsy=Plq9?O zq?NObpOTyAP~bVsBS1tgiENLdDI5I`i&?O!nsfUFpE zd;W@CZ^k>wP>F){H_UCsw5>bTcIZ1&831CvZM01X8YY|?5St5>Nl|uzq!i@^YD>ow zNr}S3oK4Zj0_9RvTsUWrGfU^vg2)}`mc*7Ic2lsu2+pUd(q3~+m&JG6tii~i|Nirv z=*(?_@=AesVig&MqP2we-HD}kA*l~40|_ypS;bizNh|{}%shHl&=Zbbxf~6ncJL*)El<5X*)&Rv23SgI|{zjufp({nTvX!b{fNcl?tb{f(p-m*3 zHsNA#&@!=y;MUldJtUxBRO*xTP4*S&MV}`<<|lD>v)k=<0D0z|?|eSq&$T1FNrJHe2#|=(wQ{tE0UEW4^8^cXxNiyK>PBZWOIvuPbUv zDU}Lz$k!v=vE)j*dZ@e` z8RMc&_%%vuNh_$;f~s}2s;+9fR)VFjsiAEfn1fitU@Wh&I6L+Y{+KTBhFjf+1lI;`@$m zl88_l7s7#O{(47lX`vrUeW*MFKQ|@VS-bu5f)9tv5*@Nj+W$B@>`Z*BT++}R1ttaf zt3|`K+xnRsGUA%_tl0oV(Y7tUX4I;sdgWwaQ){P&rqxfHM)SB_s~hFIaZ<0$w0|19 zWNUinDAH}gX8i}YSm=`NBCv04XxV32f$gAGsvAbFd3<^TtgZcW&DgJ0tEZ<%vvRy- zeTL#8R~p#2)M^FZa8?DM1R;%-I@()G70EQySGS*$>EPcs_Fm|c&H9`Ty%)M<^Zt)a zAEb~U3iGJb^DV6`F2RP34DSB^{_S=KE=Y{7OzKiuL+I^RfsYI@)=@EfyhMo(4ViFp z{R=hO4m4}=mIjle6O)Q`OoqNgzx;q-U-(lDxZc3|%eIN_cI+W_Y?rRg z4kXAB`VN^$ZSU5mhGYBNOSB$G3;h6SwImCGI5Q6&G202ZZz%hDL>#+sQ_BE*_#*(N zlL@28K|m(F?K0tt1-5&$N-U5GyjL@IvU3)C8(k!8r_rMc$q;4^Xt2_p=QUSgs2U9rchJ?=Hy z9pG-NEA?cff;Lz*tJp@gm0Qj06aLj?p(@Nbz7;pAmFdze3Z#aIwmP9g2XZ zucsG+f;i=_`c?L=VOon__v!c(fr6PyR{haR`eZs{sE^2VbUF? B9Af|g