From 6cf48eb5437f984d47576ad86baf6499411f9350 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Tue, 23 Jun 2020 21:47:06 -0400 Subject: [PATCH] Implement and test `not`. --- core/src/avm2/activation.rs | 9 +++ core/tests/regression_tests.rs | 1 + core/tests/swfs/avm2/boolean_negation/Test.as | 61 ++++++++++++++++++ .../swfs/avm2/boolean_negation/output.txt | 30 +++++++++ .../tests/swfs/avm2/boolean_negation/test.fla | Bin 0 -> 4015 bytes .../tests/swfs/avm2/boolean_negation/test.swf | Bin 0 -> 1002 bytes 6 files changed, 101 insertions(+) create mode 100644 core/tests/swfs/avm2/boolean_negation/Test.as create mode 100644 core/tests/swfs/avm2/boolean_negation/output.txt create mode 100644 core/tests/swfs/avm2/boolean_negation/test.fla create mode 100644 core/tests/swfs/avm2/boolean_negation/test.swf diff --git a/core/src/avm2/activation.rs b/core/src/avm2/activation.rs index 4134b54f9..80a003679 100644 --- a/core/src/avm2/activation.rs +++ b/core/src/avm2/activation.rs @@ -480,6 +480,7 @@ impl<'a, 'gc, 'gc_context> Activation<'a, 'gc, 'gc_context> { Op::IfStrictEq { offset } => self.op_if_strict_eq(offset, reader), Op::IfStrictNe { offset } => self.op_if_strict_ne(offset, reader), Op::StrictEquals => self.op_strict_equals(), + Op::Not => self.op_not(), Op::HasNext => self.op_has_next(), Op::HasNext2 { object_register, @@ -1383,6 +1384,14 @@ impl<'a, 'gc, 'gc_context> Activation<'a, 'gc, 'gc_context> { Ok(FrameControl::Continue) } + fn op_not(&mut self) -> Result, Error> { + let value = self.avm2.pop().coerce_to_boolean(); + + self.avm2.push(!value); + + Ok(FrameControl::Continue) + } + fn op_has_next(&mut self) -> Result, Error> { //TODO: After adding ints, change this to ints. let cur_index = self.context.avm2.pop().as_number()?; diff --git a/core/tests/regression_tests.rs b/core/tests/regression_tests.rs index 9966572c4..b60025d0e 100644 --- a/core/tests/regression_tests.rs +++ b/core/tests/regression_tests.rs @@ -275,6 +275,7 @@ swf_tests! { (as3_instanceof, "avm2/instanceof", 1), (as3_truthiness, "avm2/truthiness", 1), (as3_falsiness, "avm2/falsiness", 1), + (as3_boolean_negation, "avm2/boolean_negation", 1), } // TODO: These tests have some inaccuracies currently, so we use approx_eq to test that numeric values are close enough. diff --git a/core/tests/swfs/avm2/boolean_negation/Test.as b/core/tests/swfs/avm2/boolean_negation/Test.as new file mode 100644 index 000000000..898da3b89 --- /dev/null +++ b/core/tests/swfs/avm2/boolean_negation/Test.as @@ -0,0 +1,61 @@ +package { + public class Test { + } +} + +function assert_bool_not(val) { + var notval = !val; + + if (notval === true) { + trace("Inverse is true"); + } else if (notval === false) { + trace("Inverse is false"); + } else { + trace("TEST FAIL: Inverse is nonboolean"); + } +} + +trace("//!true"); +assert_bool_not(true); + +trace("//!false"); +assert_bool_not(false); + +trace("//!null"); +assert_bool_not(null); + +trace("//!undefined"); +assert_bool_not(undefined); + +trace("//!\"\""); +assert_bool_not(""); + +trace("//!\"str\""); +assert_bool_not("str"); + +trace("//!\"true\""); +assert_bool_not("true"); + +trace("//!\"false\""); +assert_bool_not("false"); + +trace("//!0.0"); +assert_bool_not(0.0); + +trace("//!NaN"); +assert_bool_not(NaN); + +trace("//!-0.0"); +assert_bool_not(-0.0); + +trace("//!Infinity"); +assert_bool_not(Infinity); + +trace("//!1.0"); +assert_bool_not(1.0); + +trace("//!-1.0"); +assert_bool_not(-1.0); + +trace("//!new Object()"); +assert_bool_not({}); \ No newline at end of file diff --git a/core/tests/swfs/avm2/boolean_negation/output.txt b/core/tests/swfs/avm2/boolean_negation/output.txt new file mode 100644 index 000000000..b84b7acc2 --- /dev/null +++ b/core/tests/swfs/avm2/boolean_negation/output.txt @@ -0,0 +1,30 @@ +//!true +Inverse is false +//!false +Inverse is true +//!null +Inverse is true +//!undefined +Inverse is true +//!"" +Inverse is true +//!"str" +Inverse is false +//!"true" +Inverse is false +//!"false" +Inverse is false +//!0.0 +Inverse is true +//!NaN +Inverse is true +//!-0.0 +Inverse is true +//!Infinity +Inverse is false +//!1.0 +Inverse is false +//!-1.0 +Inverse is false +//!new Object() +Inverse is false diff --git a/core/tests/swfs/avm2/boolean_negation/test.fla b/core/tests/swfs/avm2/boolean_negation/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..c41c9f293fb7c78fa71ee8c1c86cc722ceeec41d GIT binary patch literal 4015 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 E0~{Gfr2qf` literal 0 HcmV?d00001 diff --git a/core/tests/swfs/avm2/boolean_negation/test.swf b/core/tests/swfs/avm2/boolean_negation/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..650e155bb9114f49ecc59a7b67f213d98a7d099d GIT binary patch literal 1002 zcmV*0Bgv-er%WEApZfxRhP;B4nf4j_E#?X6IX0wDC!NkzBkeiow`c#m z+N0G^EOf|N>{rH;z&3|;#@L2(adGkOIAb&M=0ql+dAyTZfAS(%k+s_M$3Jg9KYDR? z_WeQSWsbcai(o#my^3^YD$m&4(LX~3@QSl6wkrGddVP0tU;07T_A_f=6l~v@UT}ES zXw(ngM!*c}%TY5IU~^cj+l8mL}Xy;lE!e_K(-mx0`Mya2l@Kvg;fHn)}5< zX`@kn8L19I@C2BftfYQJhPvv_|P1yh$3ijCxj%~bYAsvR4gA;^ znN6&_9aN5`H?Z0J1bVX%72QDMz6VZA_DJHB{*8tkptAJ%-l^vV^7j8Jamh$1NuJOX z;be4N4-F4(pScIb%;-65P84Qg;9hFf(8bI7>r}ki9f=X0qUx4 z^ARlqv{1Nhwu=l^zeb`e3aGy+Z4+a~GRlfsRu0(IF<{KC@I!XY(Hlm+Bh($ literal 0 HcmV?d00001