From 48db0e23c42ca0a98ed7027aa10a1c799ef2ec34 Mon Sep 17 00:00:00 2001 From: Adrian Wielgosik Date: Fri, 12 Jul 2024 21:49:14 +0200 Subject: [PATCH] core: Fix panic on unsetting self-referential masker --- core/src/display_object.rs | 6 ++++-- .../displayobject_mask_self_referential/Test.as | 14 ++++++++++++++ .../output.txt | 0 .../displayobject_mask_self_referential/test.swf | Bin 0 -> 526 bytes .../displayobject_mask_self_referential/test.toml | 3 +++ 5 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 tests/tests/swfs/avm2/displayobject_mask_self_referential/Test.as create mode 100644 tests/tests/swfs/avm2/displayobject_mask_self_referential/output.txt create mode 100644 tests/tests/swfs/avm2/displayobject_mask_self_referential/test.swf create mode 100644 tests/tests/swfs/avm2/displayobject_mask_self_referential/test.toml diff --git a/core/src/display_object.rs b/core/src/display_object.rs index ab512a917..a892cccfc 100644 --- a/core/src/display_object.rs +++ b/core/src/display_object.rs @@ -1666,7 +1666,8 @@ pub trait TDisplayObject<'gc>: remove_old_link: bool, ) { if remove_old_link { - if let Some(old_masker) = self.base().masker() { + let old_masker = self.base().masker(); + if let Some(old_masker) = old_masker { old_masker.set_maskee(gc_context, None, false); } if let Some(parent) = self.parent() { @@ -1686,7 +1687,8 @@ pub trait TDisplayObject<'gc>: remove_old_link: bool, ) { if remove_old_link { - if let Some(old_maskee) = self.base().maskee() { + let old_maskee = self.base().maskee(); + if let Some(old_maskee) = old_maskee { old_maskee.set_masker(gc_context, None, false); } self.invalidate_cached_bitmap(gc_context); diff --git a/tests/tests/swfs/avm2/displayobject_mask_self_referential/Test.as b/tests/tests/swfs/avm2/displayobject_mask_self_referential/Test.as new file mode 100644 index 000000000..05a503955 --- /dev/null +++ b/tests/tests/swfs/avm2/displayobject_mask_self_referential/Test.as @@ -0,0 +1,14 @@ +// compiled with mxmlc + + +package { + import flash.display.MovieClip; + + public class Test extends MovieClip { + public function Test(){ + var mc = new MovieClip(); + this.mask = this; + this.mask = mc; + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/displayobject_mask_self_referential/output.txt b/tests/tests/swfs/avm2/displayobject_mask_self_referential/output.txt new file mode 100644 index 000000000..e69de29bb diff --git a/tests/tests/swfs/avm2/displayobject_mask_self_referential/test.swf b/tests/tests/swfs/avm2/displayobject_mask_self_referential/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..9eee45e3db5dc20513bd2146e9461f1a307f2c66 GIT binary patch literal 526 zcmV+p0`dJ?S5q?J0ssL00RRA9001BW06YKujv4yj=Vl0?JwAo?b#KsqVJOXhixy4a z1v37mOh!q!duw(1D_l1z3z0VgHxB9Y;ryOt+H4UaGwq-bc5tB0m@amJ@Zeci1_!QZnT84W^-kDu!b~qNjlRVSVp3_xhTH3JNC+2)1J*>=-p>|kv2*_BK)@TdzxW~s5 zRX~U5S-?);A+G44YL3M0*f=<)^i{biPBGOIR$lYO&{zPAusrYQ+MNi=aD#T4!$ zPkS*y6Mr~&jb2>K)qny&rD&(ESY3$E?lK{?1zUms&{I3Vb0+e_VuJ%g*!>e*m8J?242(Fwy)sIf>4Gx4!fXex2K@Sp<76G z9WF`$E0x3DsnnbSN5{*W?>d}n*>^xFhvJ-!zE(8tS9rP*U%~G&8zp(*WDFPhpnYRV zM9BH!2)m&en@JVqr{UCDPd5af^joPls}bZ-^OgSK7frT>Dx_6?B$@#b|FoBnax4&P z+>|?ULO$>=ybXyKwAbzhy?>+A=z-d&{c?qvRz0R}leqnY&gk{H_hOJ