From d1732dd3d695da2fe1f1c07c59d01cf4fa231208 Mon Sep 17 00:00:00 2001 From: Nathan Adams Date: Thu, 2 Jul 2020 00:24:18 +0200 Subject: [PATCH] avm1: Returning from with{} should return from the parent activation --- core/src/avm1/activation.rs | 7 +++++-- core/tests/regression_tests.rs | 1 + core/tests/swfs/avm1/with_return/output.txt | 2 ++ core/tests/swfs/avm1/with_return/test.fla | Bin 0 -> 4517 bytes core/tests/swfs/avm1/with_return/test.swf | Bin 0 -> 645 bytes 5 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 core/tests/swfs/avm1/with_return/output.txt create mode 100644 core/tests/swfs/avm1/with_return/test.fla create mode 100644 core/tests/swfs/avm1/with_return/test.swf diff --git a/core/src/avm1/activation.rs b/core/src/avm1/activation.rs index a773432ed..e0c4a16be 100644 --- a/core/src/avm1/activation.rs +++ b/core/src/avm1/activation.rs @@ -2241,8 +2241,11 @@ impl<'a, 'gc: 'a> Activation<'a, 'gc> { let object = self.avm.pop().coerce_to_object(self, context); let with_scope = Scope::new_with_scope(self.scope_cell(), object, context.gc_context); let mut new_activation = self.with_new_scope(with_scope); - let _ = new_activation.run_actions(context, code)?; - Ok(FrameControl::Continue) + if let ReturnType::Explicit(value) = new_activation.run_actions(context, code)? { + Ok(FrameControl::Return(ReturnType::Explicit(value))) + } else { + Ok(FrameControl::Continue) + } } /// Retrieve a given register value. diff --git a/core/tests/regression_tests.rs b/core/tests/regression_tests.rs index e50ad93f4..e051e1c7b 100644 --- a/core/tests/regression_tests.rs +++ b/core/tests/regression_tests.rs @@ -189,6 +189,7 @@ swf_tests! { (loadvariablesnum, "avm1/loadvariablesnum", 3), (loadvariables_method, "avm1/loadvariables_method", 3), (xml_load, "avm1/xml_load", 1), + (with_return, "avm1/with_return", 1), (cross_movie_root, "avm1/cross_movie_root", 5), (roots_and_levels, "avm1/roots_and_levels", 1), (swf6_case_insensitive, "avm1/swf6_case_insensitive", 1), diff --git a/core/tests/swfs/avm1/with_return/output.txt b/core/tests/swfs/avm1/with_return/output.txt new file mode 100644 index 000000000..dc6cb5c36 --- /dev/null +++ b/core/tests/swfs/avm1/with_return/output.txt @@ -0,0 +1,2 @@ +// test() +Success! diff --git a/core/tests/swfs/avm1/with_return/test.fla b/core/tests/swfs/avm1/with_return/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..16556945f5d18249d15dd278cedf963e415905d0 GIT binary patch literal 4517 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 literal 0 HcmV?d00001 diff --git a/core/tests/swfs/avm1/with_return/test.swf b/core/tests/swfs/avm1/with_return/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..115a108f2ab17c813de8c909cab8f4407cff0ebe GIT binary patch literal 645 zcmV;00($*JS5prS1^@tfoTZdaZ__XUhP{q`2_c5KaNuA%X#%0tN$4nz+Q5>m(he19 z>m7Nqvsxr^WIO#hapeb~UAXXv_)Wvf`ni=cMx^*F@B7Gp?RW$>J_GRhCjigZK=5Q2 z0Pywc?gjuYK_cfQ=)h4Dr_#~AcD1im<{&g24r{|VH7?GP)oeDAX(QV+h@v2((r@tw?bC2XNEicYBHxd^G2?@bO&x9c3IQsFeD$APN{YK#%5;oF{F_syfa=N%nd zR`aOd@S4G)?>BtU^g3ns%ho9^;9*|mHldM!pebyO3caX^~XBI*qD`sm#}5D`NWV6mD3jG;*H>-LOt+{C{HlBLdDgW}egPBaJ4P zpbLRtxxBo5zy3>KklzMi8$_Ig(>x6I_qvRrZT= fy(}M;BO7IVbN}KY*aVYjd#k+CfK4O=L-M literal 0 HcmV?d00001