From f7b0c021a9c5986047cae8273d63fe4db8eab22a Mon Sep 17 00:00:00 2001 From: CUB3D Date: Fri, 17 Feb 2023 19:52:42 +0000 Subject: [PATCH] avm1: The this property should be mutable --- core/src/avm1/activation.rs | 17 ++++++++--------- tests/tests/swfs/avm1/mutable_this/output.txt | 18 ++++++++++++++++++ tests/tests/swfs/avm1/mutable_this/test.fla | Bin 0 -> 4803 bytes tests/tests/swfs/avm1/mutable_this/test.swf | Bin 0 -> 768 bytes tests/tests/swfs/avm1/mutable_this/test.toml | 1 + 5 files changed, 27 insertions(+), 9 deletions(-) create mode 100644 tests/tests/swfs/avm1/mutable_this/output.txt create mode 100644 tests/tests/swfs/avm1/mutable_this/test.fla create mode 100644 tests/tests/swfs/avm1/mutable_this/test.swf create mode 100644 tests/tests/swfs/avm1/mutable_this/test.toml diff --git a/core/src/avm1/activation.rs b/core/src/avm1/activation.rs index f8fac53bd..c3da00cac 100644 --- a/core/src/avm1/activation.rs +++ b/core/src/avm1/activation.rs @@ -185,16 +185,9 @@ pub struct Activation<'a, 'gc: 'a> { /// The currently in use constant pool. constant_pool: Gc<'gc, Vec>>, - /// The immutable value of `this`. + /// The value of `this`. /// - /// This differs from Flash Player, where `this` is mutable and seems - /// to be part of the scope chain (e.g. a function with the `suppress_this` flag - /// set can modify the `this` value of its closure). - /// - /// Fortunately, ActionScript syntax prevents mutating `this` altogether, so - /// observing this behavior requires manually-crafted bytecode. - /// - /// TODO: implement correct semantics for mutable `this`. + /// While this is not *usually* modified, ActionScript does allow `this` to be modified this: Value<'gc>, /// The function object being called. @@ -2637,6 +2630,12 @@ impl<'a, 'gc> Activation<'a, 'gc> { return Ok(()); } + // Special case, mutating `this` + if path.as_wstr() == WStr::from_units(b"this") { + self.this = value; + return Ok(()); + } + // Find the right-most : or . in the path. // If we have one, we must resolve as a target path. let separator = path.rfind(b":.".as_ref()); diff --git a/tests/tests/swfs/avm1/mutable_this/output.txt b/tests/tests/swfs/avm1/mutable_this/output.txt new file mode 100644 index 000000000..0cd68fe3f --- /dev/null +++ b/tests/tests/swfs/avm1/mutable_this/output.txt @@ -0,0 +1,18 @@ +this = _level0 +typeof this = movieclip +this = test +typeof this = string +In foo +this = _level0 +typeof this = movieclip +this = 1234 +typeof this = number +In nested +this = _level0 +typeof this = movieclip +this = null +typeof this = null +Exit nested +this = 1234 +typeof this = number +Exit foo diff --git a/tests/tests/swfs/avm1/mutable_this/test.fla b/tests/tests/swfs/avm1/mutable_this/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..8afbaf1255c3cd4f6d3dc9759c87593e4e95fed4 GIT binary patch literal 4803 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⩔aDOXYxY3_zJL+kq#kxN4W&g#!R7VMx72H*n#HjjSg-Zz);9g!7p9 zK_}iGN1u0&2G@Gq&jgS%(1a)BjV!|`(+JHP6M3T;c!+RP`jL13vupha%vFD>+Mj72%H8 z-Gr+17_UAi*WKLPtfP79z}fnYdH{n**_9~fzmJ44wGm-T6+1VypbrhmJe0HohJ|%6 z#ru|0geQWtn!;CuE?!ZFTw_~ke=iC)(L83#wif1#H|yIkmItoj7(@pRfy`@e-+XS1 zsx-3f@ohyg1{9Q$OQfohO;Svy`a|79CCHYG(nlXqsxjhnISg5G*fX2lmW*>!#DMe- z_qw#^*);_AH|wY6r8)1eXt2uT9kWIHUaU4k^{TH%MORqraHF0QaVpU0+8dFTTI`$F zQ{lt7r7t!F#Gt_i?WcHg+H+NBht&G0Rir)@tp&*vQnezZ|U%N>(|y1{x@Yh zY}>a*GbYV@$v?T~)L-)2(*n|deP22&f-n`$t^Ty7-YV4U+hFohCJ#erwS_6<%j{HW zV8B?X90!nVZVGp}^kqC0Tkt^7$m*ZnZObv_AXONAa_N&bZV-ht|9;LBx8uP|0)W=# z{Cki99uwSd)~V(E?+=D2ef%ptn|D^XnO+IO=gq#}X0nulI-gD7WsP|`;`KT+v#H5e z2h3`zR)WrSK%K;I(AmVXdTE#9=1Wx`r%fnvtQ3Rqd~qp`V`FtsLsyMjo=#>pFXWla zb}LP^Z8w!4j2ts3HPB;xePUoDHZ2$NOljGoE1kX5u0r{FcB;!?!M5*7gbbL|a`j8X z-!DlEY#P%n*>3UZ#;G;Pl97w zn&LZ{;!1{~(M5 zMS|YYe50m4#fASZlP|#R-BHy}&t@zyc=xR7Wr)ld${(xE-?SXN&HQWF^&g<)X6@u+ z_v>c!JL6UzGR3`wjXU@ARmj>2CS>U6s%+Es3z^2VmMvURhz`%5hN z|H5%_X#xLRlfahni~XxmX#I}*CFHNF|Goxd4RhV$+s;wOSpP-1_#5_v zoBb(W{DZ?Dfmr`T$bkG)=@0Oq#O^0J3-6a_{z~)yO!4RH`!hug;eRf|KNI|SgZ)g9 zhLvLetKEKoZ+|x2Pkb*H{~zu5qktd6)1OWDGl3!Y?f+;wh!z3%`<%;DBmjLZ7fw9? HWdQ#N=+g&4 literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm1/mutable_this/test.swf b/tests/tests/swfs/avm1/mutable_this/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..e86cb6eb2ec7d61e3ee798703732c9f5a618fee8 GIT binary patch literal 768 zcmV+b1ONO(S5pu81^@tfoTZdMZ__{+#^0n(X<;acfg*vhLe&L1_Qm;YH327%tD;7r z5+T8YT>H{mwSAWF(xeM8vaxlkkeC=?;1eM65fBR>fSs>U&Q6?`{tJaDx%fRl&+mNC zd-4D>F97D>11zLKzjhS>UR|Hb04#@gS6$Z)Vc@wwRe4p*ZZQ_9lGN|_bA2U8!c7TP zt5r$POZmLW6(ZgBnK=-BdN*4aVuFsT6*>WPh%ZF7xj}lYmd%c^11}h3eVQ|EvVn6J z@uYznNGK;u5r>P^W{6Ej!VV#BU5iwL;hJ0rj+ANS7<&d38Jvkb6i^}RM4_? z+$$SMgcENhr)k-B)+qD`}{V0o|LF5TgTn=)wHu4U}+sw(hDuj z<#$KNq}^6meacMV!mE0nPvjiOR+W;bXa!w1G_BRr5vmj_TBTSjHc+LZFI$MY*Asjiz2KH_Mg6n0g9g z{H!>1cCc-P#EZKSm?6bcQnhRnRTNX4uj-tP$&d}BfLaYhIcsAltO?Ejmkph;CN%Ot zF`bDJ#*I15>GUHljb43q0h;N9gM&N#t+c`^Yr1v6;^uYtl>v%+nYJ~ zHvjp<*P9=IzSCYWeEM?5`tj@j)Y}xmn+{xtRbTKiW!MI`=2`=X zB|7ft5(1+tz7y4q*AQLoUrFu(tifIyW??BBQ_+yVwGtOo!$Kcc>Ae)BZ%+_SFYV99 y3jn-~v6;!(3|#s?4R9`c4rXBVi6&=iHzr^&O